这个例子展示了如何在参数变化时通过从前一个解点开始进行后续解来反复求解一个方程。金宝搏官方网站通常,这个过程会带来有效的解决方案。金宝搏官方网站然而,解决方案有时会消失,需要从一个或多个新的点开始。
要解的参数化方程为
,
在哪里 是一个从0到5的数值参数。在 ,这个方程的一个解是 .当 绝对值不是很大,方程有三个解。金宝搏官方网站要将方程可视化,请将方程的左侧创建为匿名函数。绘制函数。
@(x)sinh(x) - 3*x;t = linspace (-3.5, 3.5);情节(t (t), t, 0(大小(t)),“k -”)包含(“x”) ylabel (“乐趣”(x))
当 是太大还是太小,只有一个解决办法。
为基于问题的方法创建一个目标函数,创建一个优化表达式expr
在优化变量中x
.
x = optimvar (“x”);Expr = sinh(x) - 3*x;
从最初的解决方案开始
在
,求100个值金宝搏官方网站的解
从0到5。因为有趣的
为标量非线性函数,解决
调用fzero
解算器。
设置用于保存解决方案统计信息的问题对象、选项和数据结构。
概率= eqnproblem;选择= optimset (“显示”,“关闭”);溶胶= 0 (100 1);函数宏指令=溶胶;= linspace (0 5);
从第一个解开始,循环求解方程溶胶(1)= 0
.
为I = 2:length(as) x0。x =溶胶(张);从以前的解决方案开始概率。公式= expr == as(i);[溶胶,~,~,输出]=解决(x0,概率“选项”、选择);溶胶(i) = sol.x;函数宏指令(i) = output.funcCount;结束
将解作为参数的函数绘制出来一个
以及为得到解所进行的函数评估的次数。
次要情节(2,1,1)情节(溶胶,“柯”)包含“一个”ylabel (“解决方案(x)”次要情节(2,1,2)情节(函数宏指令,“k *’)包含(的迭代次数) ylabel (函数宏指令的)
溶液中出现跳跃 .在同一点上,达到一个解决方案的函数评估的数量从近15个增加到近40个。要理解原因,请查看函数的更详细的图。画出函数和每七个解点。
图t = linspace(-3.5,3.5);有趣的情节(t (t));持有在情节([-3.5,最小(溶胶)],[2.5,2.5],“k——”)传说(“有趣”,“最大的一个”,“位置”,“北”,“自动更新”,“关闭”)为plot(sols(A0),as(A0),“罗”)如果国防部(a0, 2) = = 1的文本(溶胶(a0) + 0.15 (a0) + 0.15, num2str (a0/7))其他的Text (sols(a0) - 0.3,as(a0) + 0.05,num2str(a0/7))结束结束情节(t, 0(大小(t)),“k -”)举行从
作为
增加时,首先解决方案向左移动。金宝搏官方网站然而,当
大于2.5时,就不再有接近先前解决方案的解决方案了。fzero
需要额外的函数求值来搜索一个解,并在附近找到一个解x = 3
.之后,解的值向右缓慢移动为
进一步增加。对于每个后续的解决方案,求解器只需要大约10次函数计算。
的fsolve
求解器可以比fzero
.然而,fsolve
会陷入局部极小值,无法解出方程。
设置用于保存解决方案统计信息的问题对象、选项和数据结构。
probfsolve = eqnproblem;溶胶= 0 (100 1);函数宏指令=溶胶;infeas =溶胶;asfsolve = linspace (0 5);
从第一个解开始,循环求解方程溶胶(1)= 0
.
为I = 2:length(as) x0。x =溶胶(张);从以前的解决方案开始probfsolve。公式= expr == asfsolve(i);(溶胶、fval ~、输出)=解决(probfsolve x0,“选项”选项,“规划求解”,“fsolve”);溶胶(i) = sol.x;函数宏指令(i) = output.funcCount;infeas (i) = fval;结束
将解作为参数的函数绘制出来一个
以及为得到解所进行的函数评估的次数。
次要情节(2,1,1)情节(asfsolve溶胶,“柯”asfsolve infeas,的r -)包含“一个”传奇(“解决方案”,“错误的解决方案”,“位置”,“最佳”次要情节(2,1,2)情节(函数宏指令,“k *’)包含(的迭代次数) ylabel (函数宏指令的)
fsolve
是不是比fzero
,每次迭代大约需要7或8次功能评估。同样,当求解器在前一个值附近没有找到解时,求解器需要更多的函数求值来搜索解。这一次,搜索失败了。随后的迭代在大多数情况下需要很少的函数评估,但却无法找到解决方案。的错误的解决方案
绘图显示函数值
.
为了克服局部最小值不是解的问题,从不同的起点重新搜索fsolve
返回一个负退出标志。设置用于保存解决方案统计信息的问题对象、选项和数据结构。
rng默认的%的再现性溶胶= 0 (100 1);函数宏指令=溶胶;asfsolve = linspace (0 5);
从第一个解开始,循环求解方程溶胶(1)= 0
.
为I = 2:length(as) x0。x =溶胶(张);从以前的解决方案开始probfsolve。公式= expr == asfsolve(i);[溶胶,~,exitflag、输出]=解决(probfsolve x0,“选项”选项,“规划求解”,“fsolve”);而exitflag < = 0如果fsolve没有找到解决方案x0。x=5*randn;从新的起点再试一次fevals(i) = fevals(i) + output.funcCount;[溶胶,~,exitflag、输出]=解决(probfsolve x0,“选项”选项,“规划求解”,“fsolve”);结束溶胶(i) = sol.x;fevals(i) = fevals(i) + output.funcCount;结束
将解作为参数的函数绘制出来一个
以及为得到解所进行的函数评估的次数。
次要情节(2,1,1)情节(asfsolve溶胶,“柯”)包含“一个”ylabel (“解决方案(x)”次要情节(2,1,2)情节(函数宏指令,“k *’)包含(的迭代次数) ylabel (函数宏指令的)
这一次,fsolve
从较差的起点附近恢复
得到了一个类似于fzero
.每次迭代的函数计算次数通常是8次,在解决方案跳转时增加到大约30次。
fcn2optimexpr
对于某些目标函数或软件版本,必须通过使用将非线性函数转换为优化表达式fcn2optimexpr
.看到金宝app支持优化变量和表达式的操作和将非线性函数转换为优化表达式.对于本例,转换原始函数有趣的
用于绘制优化表达式expr
:
expr = fcn2optimexpr(有趣,x);
在更改了定义之后,示例的其余部分完全相同expr
.