此示例显示如何尝试通过使用基于问题的方法来解决具有约束的非线性系统。
当您的问题仅有束缚约束时,解决问题的过程很简单。例如,找到具有正组分的解决方案到方程式
只需创建具有较低限制的优化变量0(这些方程有四个解决方案:在哪里万博 尤文图斯 或者 和哪里 或者 。)
x = Optimvar('X'2,“下行”,0);Expr1 =(x(1)+ 1)*(10 - x(1))*((1 + x(2)^ 2))/(1 + x(2)^ 2 + x(2));Expr2 =(x(2)+ 2)*(20 - x(2))*((1 + x(1)^ 2))/(1 + x(1)^ 2 + x(1));eqn1 = expr1 == 0;eqn2 = expr2 == 0;prob = eqnproblem;prob.equations.eqn1 = eqn1;prob.equations.eqn2 = eqn2;x0.x = [15,15];[Sol,FVAL,EXITFLAG] =求解(prob,x0)
方程问题有束缚约束。作为最小二乘问题的重新制作。使用LSQNONLIN解决问题。等式解决。LSQNONLIN完成,因为通过函数容差的值测量,功能值的向量接近零,问题会定期按梯度测量。
sol =结构与字段:X:[2x1双]
fval =结构与字段:EQN1:0 EQN2:0
ExitFlag = Aquationsolved.
查看解决方案。
sol.x.
ans =.2×110 20.
当您的问题具有一般约束时,将问题作为优化问题,而不是等式问题。将方程设置为平等约束。例如,为了解决非线性不等式约束的前述方程
,删除界限X
并将问题作为优化问题,没有客观函数。
x.lowerbound = [];circlecons = x(1)^ 2 + x(2)^ 2 <= 10;prob2 = OptimProbled;prob2.constraints.circlecons = circlecons;prob2.constraints.eqn1 = eqn1;prob2.constraints.eqn2 = eqn2;[Sol2,FVAL2,EXITFLAG2] =求解(prob2,x0)
使用Fmincon解决问题。发现满足约束的本地最小值。优化完成,因为目标函数在可行的方向上不降低,到在最优性公差的值内,并且对约束公差的值满足约束。
sol2 =结构与字段:X:[2x1双]
fval2 = 0.
ExitFlag2 = OptimalAllyolution.
查看解决方案。
sol2.x.
ans =.2×1-1.0000 -2.0000
您还可以通过将目标函数设置为方格和作为约束的总和来制定问题。该替代制定提供了数学上等同的问题,但是可以导致不同的解决方案,因为配方的变化会导致求解器到不同的迭代。
prob3 = OptimProblem;prob3.objective = expr1 ^ 2 + expr2 ^ 2;prob3.constraints.circlecons = circlecons;[Sol3,FVAL3,EXITFLAG3] =求解(prob3,x0)
使用Fmincon解决问题。发现满足约束的本地最小值。优化完成,因为目标函数在可行的方向上不降低,到在最优性公差的值内,并且对约束公差的值满足约束。
sol3 =结构与字段:X:[2x1双]
FVAL3 = 8.0569E-16
EXITFLAG3 = OPERALLINGS.
查看解决方案。
sol3.x.
ans =.2×1-1.0000 -2.0000
在这种情况下,最小二乘物体导致与先前的制剂相同的解决方案,其仅使用限制。
一般来说,解决
尝试通过最小化方程组件的平方和来解决方程的非线性系统。换句话说,如果LHS(i)
是方程的左侧表达式一世
, 和RHS(i)
那是右侧的表达,那么解决
尝试最小化总和((LHS
-RHS)。^ 2)
。
相比之下,在尝试满足非线性约束表达式时,解决
一般使用粉刺
,并尝试通过使用不同的策略来满足约束。
在这两种情况下,求解器都不能解决方程。对于策略,您可以用来尝试找到解决方案时,当求解器失败时,请参阅FSOLVE无法解决等式。