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

时间:2015-03-11 21:55:36

标签: matlab constraints equality nonlinear-optimization inequality

我需要在标题中更好地解决这个问题。我的想法是我在四个变量中有两个非线性方程,以及两个非线性不等式约束。我发现函数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

任何输入都会被重视,对于长文本感到抱歉,如果你还没有接受它,我想详细介绍...谢谢!

1 个答案:

答案 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)0fmincon一起使用,目标函数f自然已经被最小化了,在这种情况下唯一必须满足的是等式约束 - 这将是解决方案非线性方程组。确实聪明。