首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Matlab中更新fmincon中的非线性约束数

在Matlab中更新fmincon中的非线性约束数
EN

Stack Overflow用户
提问于 2015-12-25 04:13:45
回答 3查看 1.1K关注 0票数 1

我尝试在while循环中使用fmincon,这样在while条件不满足之前,必须执行fmincon。每次fmincon不能满足特定条件(例如,x(N)-7.6==Tol)时,应更新(增加)非线性约束的数量N。使用fmincon如何做到这一点呢?假设我最初有18个非线性等式(ceq(1) ... ceq(18))。当while条件不能满足时,应在下一次迭代中将非线性方程组的数目增加到23 (ceq(1) ... ceq(23))。

你的创新想法……让我们给你更多关于我想做什么的细节。我有一些非线性代数方程,所以我需要使用NLP (非线性规划)求解器。此外,我的成本函数是最小时间问题。实际上,我的非线性约束方程是一些在时间坐标上离散化的动态控制方程。N是离散化的数量。基于拉格朗日优化技术,在系统中加入标量函数的梯度(拉格朗日),以求最优解。正如我在问题中提到的,我需要用首字母N来测试我的问题,然后如果fmincon的Xoutput不能满足约束,它需要增加描述的数量。它继续下去,直到fmincon的输出最优答案足够接近我想要的答案。

EN

回答 3

Stack Overflow用户

发布于 2015-12-26 04:03:48

剥开洋葱皮,在我看来,你的问题并没有解决你真正的问题,而且你正在以某种错误的方式来解决你的问题。你如何用数字解决问题与你如何分析解决问题是相关的,但又有很大的不同,用手写出方程。请看我在结尾处的进一步评论,我建议与同学、实验室的同学和/或教授交谈。

几条评论:

  1. 您的目标函数@(x) norm(myfoctest(x))将始终返回0,因为[]将返回空数组[]作为其第一个参数,并且在Matlab中,norm([])被定义为0。

  1. 而不是minimize 0 subject to f(x)==0,看起来你打算解决问题minimize norm(f(x)) subject to f(x)==0?在这种情况下,我不理解约束f(x)==0的用途。为什么不使用minimize norm(f(x))

在你的函数中,为什么Ceq(2*N)=x(5*N+12)-x(5*N+11)-x(4*N+2)会在myfoctest循环中?您将x(32)- x(31) - x(18)的值赋给Ceq(8)四次(例如,对于j=1:4)。这是你想要的吗?这个错误告诉我,您编写myfoctest.的方式中可能还有其他错误

  1. 许多这样的约束都是线性约束。将它们作为非线性约束输入将使fmincon的工作更加困难。

  1. ,我不知道最初的问题,但我觉得你是在用一种随意的,扭曲的方式来数值求解。我只看了一下代码就发现了几个错误,如果我真的理解了这个问题,我会担心还有更多的错误。

  1. ,你有5*N+13变量和5*N+13非线性等式约束。你的可行集合可能是一个单点!题外话:许多优化算法从一个可行点开始,然后朝着可行的方向前进一步。如果可行集是一个点,就没有可行的方向...在你的问题中,整个游戏就是找到一个可行点(如果它确实存在的话)?!

  1. 我怀疑主要的问题是你需要“在Matlab中更新fmincon中的非线性约束的数量”。

听起来像是你计算了拉格朗日函数的一阶条件,然后你输入这些条件作为优化问题的约束条件?,,

  1. ?如果是这样的话,这很可能不是解决numerically.

应该做的事情

一些建议..。

  1. 我认为你需要回到起点:以一种干净的方式写下你想要解决的问题,然后找出如何以有效的方式用数字来解决它。我的直觉反应是,到目前为止,这是一个有点混乱的局面。

进一步评论

假设你有一些最小化问题(例如。最优控制问题):

代码语言:javascript
复制
minimize f(x) subject to g(x) <= 0.

其中f,g和凸,斯莱特条件成立,一阶条件是达到最小值的必要条件和充分条件。你可以用数学方法解决这个问题,并得到一些一阶条件:

代码语言:javascript
复制
dL/dx = 0

你可能认为数值解决这个问题的方法是数值求解dL/dx方程组(来自FOC)。如果dL/dx是一个线性方程组,这可能是真的,但一般来说,这通常是解决问题的一种棘手的方法。相反,您希望将fg直接提供给优化算法。

要牢记的一般要点:

fast.

  • Solving
  • 解线性方程组是有效的,而解决凸优化问题是有效和快速的。
  • 一般来说,求解非线性方程组或非凸优化问题可能是可怕的,可怕的问题。
票数 1
EN

Stack Overflow用户

发布于 2015-12-25 07:59:59

你有两个案子。在第一种情况下,某些条件得到满足,而在第二种情况下,则不满足。使while语句在每种情况下都保持正确。在您的循环中添加标志变量,如果您的条件不满足,该变量将更改其值。例如,您可以将如下内容放入:

代码语言:javascript
复制
flag = (x(N)-7.6<Tol);

如果满足条件,则返回1,否则返回0

在您的mycon函数中,添加flag作为输入变量:

代码语言:javascript
复制
function [c,ceq] = mycon(all_variables_you_had_before,flag)

然后,在mycon中添加逻辑块,如下所示:

代码语言:javascript
复制
if flag == 1
    ceq = [___]; %//put your 18 conditions here
else
    ceq = [___]; %//put your 23 conditions here
end

最后,不要忘记在主脚本的fmincon行中添加mycon(all_variables_you_had_before,flag)

代码语言:javascript
复制
x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@(all_variables_you_had_before) mycon(all_variables_you_had_before,flag))

因此,如果满足条件,您的fmincon将照常获得约束。但是如果条件不满足,约束条件就会改变。希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2015-12-25 20:12:44

代码语言:javascript
复制
function [x]=runnested(x0,N)
 r=ones(4,1);
N=length(r);
Tol=0.001;
for k=1:N
for i=1:N
x0=rand(5*N+13,1)
options = optimset('Largescale','off','algorithm','interior-point','Display','iter');
[x(i,:),fval,exitflag,output]=fmincon(@(x) norm(myfoctest(x)),x0,[],[],[],[],[],[],@myfoctest,options)
end
if x(N)-7.61<=Tol
  break;
else
  N=N+1;  
end
 end
 function [C,Ceq]=myfoctest(x,N,r)
 C=[];
 r=ones(4,1); 
N=length(r);
f=3.5e-6; %km/s^2
i1=10*(pi/180); 
Ts=110;    %sec   
V0=7.79;    %km/sec
a1=7.61;         %km/sec
b1=0.01*a1;
a2=20*(pi/180);  % rad      %10 deg
b2=0.01*a2;  %rad 
Omeg0=10*(pi/180);  %rad
Ceq=zeros(5*N+13,1);     
   for j=1:N-1
    Ceq(j)=x(3*N+1+j)-  x(3*N+j)-2*x(4*N+1+j)*Ts*f*sin(x(2*N+1+j))./(pi*sin(i1)*x(j)^2)
    Ceq(N)=x(5*N+10)-x(5*N+9)-x(3*N+2)   %x(5*N+10)-x(5*N+9)-x(4*N+7)
    Ceq(N+j)=x(4*N+1+j)-x(4*N+j)
    Ceq(2*N)=x(5*N+12)-x(5*N+11)-x(4*N+2)
    Ceq(2*N+1)=x(3*N+1)*Ts*f*sin(x(2*N+1))+2*x(4*N+1)*Ts*f*cos(x(2*N+1))/(pi*V0*sin(i1))
    Ceq(2*N+1+j)=x(3*N+1+j)*Ts*f*sin(x(2*N+1+j))+2*x(4*N+1+j)*Ts*f*cos(x(2*N+1+j))./(pi*x(j)*sin(i1))
    Ceq(3*N+1)=1-x(5*N+9)*b1-x(5*N+10)*b1-x(5*N+11)*b2-x(5*N+12)*b2-x(5*N+8)*N*Ts/100-x(5*N+13)
    Ceq(3*N+2)=-2*x(5*N+8)*x(5*N+2)
    Ceq(3*N+3)=-2*x(5*N+9)*x(5*N+3)
    Ceq(3*N+4)=-2*x(5*N+10)*x(5*N+4)
    Ceq(3*N+5)=-2*x(5*N+11)*x(5*N+5)
    Ceq(3*N+6)=-2*x(5*N+12)*x(5*N+6)
    Ceq(3*N+7)=2*x(5*N+13)*cos(x(5*N+7))*sin(x(5*N+7))
    Ceq(3*N+8)=V0-x(1)-Ts*f*cos(x(2*N+1))
    Ceq(3*N+8+j)=x(j)-x(j+1)-Ts*f*cos(x(2*N+1+j))
    Ceq(4*N+8)=Omeg0-x(N+1)+2*Ts*f*sin(x(2*N+1))/(pi*V0*sin(i1))
    Ceq(4*N+8+j)=Omeg0-x(j+1)+2*Ts*f*sin(x(2*N+1+j))./(pi*x(j)*sin(i1))
    Ceq(5*N+8)=-x(5*N+2)^2-N*Ts/100-N*Ts*x(3*N+1)/100
    Ceq(5*N+9)=-x(5*N+3)^2-x(N)+a1+b1-b1*x(3*N+1)+7.61/100
    Ceq(5*N+10)=-x(5*N+4)^2+x(N)+a1+b1-b1*x(3*N+1)-7.61/100
    Ceq(5*N+11)=-x(5*N+5)^2-x(2*N)+a2+b2-b2*x(3*N+1)+0.35/100
    Ceq(5*N+12)=-x(5*N+6)^2+x(2*N)+a2+b2-b2*x(3*N+1)-0.35/100
    Ceq(5*N+13)=-(sin(x(5*N+7)))^2-x(5*N+1)
   end
  end
 end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34457517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档