在 MATLAB 中找到具有非线性等式和不等式约束的非线性方程组的最小值

Find minimum of nonlinear system of equations with nonlinear equality and inequality constraints in MATLAB

我需要解决标题中更好描述的这个问题。这个想法是我有两个四变量非线性方程,以及两个非线性不等式约束。我发现函数 fmincon 可能是最好的方法,因为您可以在这种情况下设置我需要的所有内容(否则请告诉我)。但是,我在实施阶段有一些疑问。下面我把完整的案例曝光一下,我觉得很简单,可以真实呈现。

我做的第一件事是在单独的文件中定义 objective 函数。

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=[];

下一步是在脚本中实际 运行 它。下面,由于objective函数需要额外的变量,我定义了一个匿名函数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 来转换我原来的 objective 函数,否则我会收到 "User supplied objective function must return a scalar value." 错误消息。那么,这是最好的方法还是有更好的方法来解决这个问题?

这确实有效,但根据我的研究(实际上来自 Whosebug 的一个问题!)如果您从 objective 函数定义等式约束,则可以指导优化过程,这是有道理的。我通过约束文件中的以下代码做到了这一点:

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;

因为原来的objective函数已经处于等式约束。然而,优化显然没有超出初始猜测(每个解决方案的成本值已经为 0),这是有道理的,但让我想知道为什么在文档中建议它(这里的最后一节:http://www.mathworks.com/help/optim/ug/nonlinear-systems-with-constraints.html) .

任何意见都将得到重视,对于冗长的文字,我很抱歉,如果您还没有接受,我想详细介绍一下...谢谢!

我相信 fmincon 非常适合您的问题。当然,与大多数最小化问题一样,objective 函数是一个多元 标量 函数。由于您正在处理矢量函数,因此 fmincon 对此表示不满。

使用规范的是 "best" 方法吗?简短的回答是:这取决于。我在 MATLAB 中说这是 norm 的原因是,默认情况下,欧几里德(或 L2)范数是大多数问题的最自然选择。然而,有时使用 L1 或更严格的无穷范数可能更容易解决问题(或更具物理意义)。我将对规范的彻底讨论推迟到以下精彩博客 post:https://rorasa.wordpress.com/2012/05/13/l0-norm-l1-norm-l2-norm-l-infinity-norm/

至于为什么 Mathworks 上的例子是这样表述的:他们正在求解非线性方程组 - 而不是最小化函数。他们首先使用标准方法,使用 fsolve,但随后他们提出了解决同一问题的替代方法。

其中一种方法是将求解非线性方程重新表述为具有等式约束的最小化问题。通过将 f=@(x)0fmincon 一起使用,objective 函数 f 自然已经最小化了,在这种情况下唯一需要满足的是等式约束 - 这将是非线性方程组的解。真聪明