我需要在标题中更好地解决这个问题。我的想法是我在四个变量中有两个非线性方程,以及两个非线性不等式约束。我发现函数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)
任何输入都会被重视,对于长文本感到抱歉,如果你还没有接受它,我想详细介绍...谢谢!
答案 0 :(得分:1)
我相信fmincon
非常适合您的问题。当然,与大多数最小化问题一样,目标函数是多变量标量函数。由于您正在处理向量函数,fmincon
抱怨了这一点。
使用标准" best"进场?简短的回答是:这取决于。我在MATLAB中说这是norm
的原因,默认情况下是欧几里得(或L2)规范,是大多数问题最自然的选择。然而,有时候,使用L1或更严格的无穷大规范来解决问题(或更具有物理意义)可能更容易。我将对规范的详尽讨论推迟到以下精湛的博客文章:https://rorasa.wordpress.com/2012/05/13/l0-norm-l1-norm-l2-norm-l-infinity-norm/
至于为什么Mathworks上的例子是按照它的方式制定的:它们正在解决一个非线性方程组 - 而不是最小化函数。他们首先使用标准方法,使用fsolve
,然后他们提出了解决相同问题的替代方法。
一种方法是将非线性方程组合为具有等式约束的最小化问题。通过将f=@(x)0
与fmincon
一起使用,目标函数f
自然已经被最小化了,在这种情况下唯一必须满足的是等式约束 - 这将是解决方案非线性方程组。确实聪明。