我需要更好地解决标题中描述的这个问题。这个想法是我有四个变量的两个非线性方程,以及两个非线性不等式约束。我发现该函数fmincon
可能是最好的方法,因为您可以在这种情况下设置我需要的所有内容(否则请告诉我)。但是,我在实施阶段有一些疑问。下面我将公开完整的案例,我认为它很简单,可以以真实的形式呈现。
我做的第一件事是在一个单独的文件中定义目标函数。
function fcns=eqns(x,phi_b,theta_b,l_1,l_2)
fcns=[sin(theta_b)*(x(1)*x(4)-x(2)*x(3))+x(4)*sqrt(x(1)^2+x(2)^2-l_2^2)-x(2)*sqrt(x(3)^2+x(4)^2-l_1^2);
cos(theta_b)*sin(phi_b)*(x(1)*x(4)-x(2)*x(3))+x(3)*sqrt(x(1)^2+x(2)^2-l_2^2)-x(1)*sqrt(x(3)^2+x(4)^2-l_1^2)];
然后不等式约束,也在另一个文件中。
function [c,ceq]=nlinconst(x,phi_b,theta_b,l_1,l_2)
c=[-x(1)^2-x(2)^2+l_2^2; -x(3)^2-x(4)^2+l_1^2];
ceq=[];
下一步是在脚本中实际运行它。下面,由于目标函数需要额外的变量,我定义了一个匿名函数f
。在下一行中,我对约束(匿名函数)做了同样的事情。在那之后,这是非常不言自明的。
f=@(x)norm(eqns(x,phi_b,theta_b,l_1,l_2));
f_c=@(x)nlinconst(x,phi_b,theta_b,l_1,l_2);
x_0=[15 14 16 18],
LB=0.5*[l_2 l_2 l_1 l_1];
UB=1.5*[l_2 l_2 l_1 l_1];
[res,fval]=fmincon(f,x_0,[],[],[],[],LB,UB,f_c),
首先要注意的是,我必须使用 来转换我原来的目标函数norm
,否则我会收到一条"User supplied objective function must return a scalar value."
错误消息。那么,这是最好的方法还是有更好的方法来解决这个问题?
这实际上可行,但根据我的研究(实际上是来自 stackoverflow 的一个问题!),如果您从目标函数定义等式约束,您可以指导优化过程,这是有道理的。我通过约束文件中的以下代码做到了这一点:
ceq=eqns(x,phi_b,theta_b,l_1,l_2);
之后,我发现我可以使用该deal
函数并在脚本中定义约束。
c=@(x)[-x(1)^2-x(2)^2+l_2^2; -x(3)^2-x(4)^2+l_1^2];
f_c=@(x)deal(c(x),f(x));
那么,最好的方法是什么?通过约束文件还是用这个功能?
此外,我在 MATLAB 的文档中发现,在这些情况下建议设置:
f=@(x)0;
由于原始目标函数已经处于等式约束。然而,优化显然没有超出最初的猜测(每个解决方案的成本值已经是 0),这是有道理的,但让我想知道为什么在文档中建议它(最后一节:http://www. mathworks.com/help/optim/ug/nonlinear-systems-with-constraints.html)。
任何输入都将受到重视,对于长文本感到抱歉,如果您还没有收到它,我想详细说明...谢谢!