pablo_001 发表于 2006-4-5 13:46

求助:MAtlab优化问题


<P ><FONT size=4><STRONG>目标函数:min f=x1^2+x2^2;<BR>但是式中的x1,x2不是原始变量,他们是通过变量k1,k2经过一系列复杂计算的出的,现在要优化k1,k2,使得目标函数f最小,不知如何编程,望高手能不吝赐教,谢谢!!!</STRONG></FONT></P>

happy 发表于 2006-4-5 14:11

回复:(pablo_001)求助:MAtlab优化问题

<P>编辑ff2.m文件:</P>
<P 27pt? TEXT-INDENT: 21pt;>function f=ff2(x)</P>
<P 27pt? TEXT-INDENT: 21pt;>f=4*x(1)^2+5*x(1)*x(2)+2*x(2)^2;</P>
<P 27pt? TEXT-INDENT: 21pt;>取初始点:x0=(1,1)</P>
<P 27pt? TEXT-INDENT: 21pt;>x0=;</P>
<P 27pt? TEXT-INDENT: 21pt;>=fminunc(@ff2,x0)</P>
<P>参考这个例子吧</P>
[此贴子已经被作者于2006-4-5 14:12:15编辑过]

pablo_001 发表于 2006-4-5 21:48

<P><FONT size=4><STRONG>  你好,你给我的例子中的x1,x2就是原始变量,而我的目标函数中的参数不是原始变量<BR></STRONG></FONT><FONT size=4><STRONG>  目标函数:min f=J1^2+J2^2;<BR>  但是式中的J1,J2不是原始变量,他们是通过变量k1,k2经过一系列复杂计算的出的,现在要优化k1,k2,使得目标函数f最小,请你可以详细说明,谢谢!!</STRONG></FONT></P>

kaien 发表于 2006-4-6 03:01

<P>这个问题要看你怎么定义J1和J2了<br>根据你的描述来看,J1和J2都是关于k1和k2的函数。<br>我们设向量k=(k1,k2)<br>那么J1(k), J2(k);<br>min f(k)=J1(k)^2+J2(k)^2<br>再假设向量J(k)=(J1(k),J2(k));<br>那么,问题就是<br>min f(k) = ||J(k)||^2<br><br>这样问题就比较清楚了。</P><br>在二维平面内。点k=(k1,k2);<br>认为J(k)=(J1(k),J2(k))是点k上的向量场。<br>那么问题就是确定在平面区域内何点的向量的模最大。<br><br>如果把向量场具体化为风速场,那么问题就等同于求解,在什么地方的风速最大。
[此贴子已经被作者于2006-4-6 3:12:07编辑过]

happy 发表于 2006-4-6 10:25

回复:(pablo_001)求助:MAtlab优化问题

为什么非要写成f=4*x(1)^2+5*x(1)*x(2)+2*x(2)^2;这种形式?<BR><BR>前面爱怎么算怎么算最后只要返回f就行了<BR><BR>f是x1 x2的函数

pablo_001 发表于 2006-4-6 14:03

我的程序如下,不知用什么优化程序

<P 0cm 0cm 0pt"><B normal"><FONT face="Times New Roman">%</FONT></B><B normal">优化目标函数</B><B normal"><p></p></B></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">function f=ff1(y)</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">f=Ofun(y)^2+Jtfun(y)^2;</FONT></P>
<P 0cm 0cm 0pt"><B normal"><FONT face="Times New Roman">%</FONT></B><B normal">函数定义如下</B><B normal"><p></p></B></P>
<P 0cm 0cm 0pt"><B normal"><FONT face="Times New Roman">function Jt=Jtfun(y)<p></p></FONT></B></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">a=1.463;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">b=1.585;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">u=30;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">w=0.082;                                  </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Iz=3885;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">m=1818.2;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">l=a+b;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">i0=20; </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">t_final=50;                                 %</FONT>响应终止时间</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Rpf=0;                                    %</FONT>积分时的初始量</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Rc=0;                                       %</FONT>积分时的初始量</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Y2pf=0;                                     %</FONT>积分时的初始量</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Y<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="C">2c</st1:chmetcnv>=0;                                    %</FONT>积分时的初始量</P>
<P 0cm -25.6pt 0pt 0cm; mso-para-margin-right: -2.44gd"><FONT face="Times New Roman">kl=[-b-(m*a)*u*u/(y(2)*l)]/(a-m*b*u*u/(y(1)*l));   </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">kw=m*(a*y(1)-b*y(2))/(l*l*y(1)*y(2));         </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Gr=u*(1-kl)/(i0*l)/(1+kw*u*u);               </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Gty=u*Gr;                                 </FONT></P>
<P 0cm 0cm 0pt"><B normal"><FONT face="Times New Roman">%</FONT></B><B normal">以下为微分方程的系数<p></p></B></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">A=(y(1)*a*a+y(2)*b*b)/(Iz*u);</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">B=(y(1)*a-y(2)*b)/Iz;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">C=(y(1)*a-y(2)*b)/(m*u*u)-1;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">D=(y(1)+y(2))/(m*u);</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">E=-(y(1)*a)/Iz+kl*y(2)*b/Iz;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">F=-y(1)/(m*u)-(y(2)*kl)/(m*u);</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">x0=;                                    %</FONT>初始状态</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">=ode45('kaihuan',0:0.1:t_final,x0,[],A,B,C,D,E,F,w);%</FONT>求解微分方程</P>
<P 0cm 0cm 0pt"><B normal"><FONT face="Times New Roman">%</FONT></B><B normal">下面计算评价指标(为提高计算精度,积分时采用梯形法)<p></p></B></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">for k=1:500</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">    rpf(k)=x(k,1)^2;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">    Rpf=Rpf+rpf(k);                     %</FONT>(为横摆角速度<FONT face="Times New Roman">r</FONT>的平方和)</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">    Rc=Rc+x(k,1);                        %</FONT>(为横摆角速度<FONT face="Times New Roman">r</FONT>和)</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">end</FONT></P>
<P 0cm 0cm 0pt 220.5pt; TEXT-INDENT: -220.5pt; mso-char-indent-count: -21.0"><FONT face="Times New Roman">Rp=(Rpf*2-rpf(500))/2;                     %</FONT>由于时间间隔是等分的,可先求和,然后乘以时间间隔</P>
<P 0cm 0cm 0pt 220.5pt; TEXT-INDENT: -220.5pt; mso-char-indent-count: -21.0"><FONT face="Times New Roman">R=(Rc*2-x(500,1))/2;                      %</FONT>由于时间间隔是等分的,可先求和,然后乘以时间间隔</P>
<P 0cm 0cm 0pt 199.5pt; TEXT-INDENT: -199.5pt; mso-char-indent-count: -19.0"><FONT face="Times New Roman">Er=t_final+Rp*t_final/(Gr*Gr*w*w*i0*i0)/500-2*R*t_final/(Gr*w*i0)/500;%</FONT>将横摆角速度指标展开<FONT face="Times New Roman">,</FONT>然后按梯形法积分</P>
<P 0cm 0cm 0pt"><B normal"><FONT face="Times New Roman">%</FONT></B><B normal">下面计算评价指标(为提高计算精度,积分时采用梯形法)<p></p></B></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">for n=1:500</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">y2dot(n)=u*[(C+1)*x(n,1)+D*x(n,2)+F*w];</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Y2pf=Y2pf+y2dot(n)^2;               %</FONT>平方和</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Y<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="C">2c</st1:chmetcnv>=Y<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="C">2c</st1:chmetcnv>+y2dot(n);                     %</FONT>和</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">end</FONT></P>
<P 0cm 0cm 0pt 210pt; TEXT-INDENT: -210pt; mso-char-indent-count: -20.0"><FONT face="Times New Roman">Y2p=(Y2pf*2-y2dot(500)*y2dot(500))/2;   %</FONT>由于时间间隔是等分的,可先求和,然后乘以时间间隔</P>
<P 0cm 0cm 0pt 210pt; TEXT-INDENT: -210pt; mso-char-indent-count: -20.0"><FONT face="Times New Roman">Y2=(Y<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="C">2c</st1:chmetcnv>*2-y2dot(500))/2;               %</FONT>由于时间间隔是等分的,可先求和,然后乘以时间间隔</P>
<P 0cm 0cm 0pt 210pt; TEXT-INDENT: -210pt; mso-char-indent-count: -20.0"><FONT face="Times New Roman">Ey2=t_final+Y2p*t_final/(Gty*Gty*w*w*i0*i0)/500-2*Y2*t_final/(Gty*w*i0)/500; </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Jt=sqrt(Er*Er+Ey2*Ey2);</FONT></P>
<P 0cm 0cm 0pt"><p><FONT face="Times New Roman"> </FONT></p></P>
<P 0cm 0cm 0pt"><B normal"><FONT face="Times New Roman">function O=Ofun(y)<p></p></FONT></B></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">a=1.463;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">b=1.585;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">u=30;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">w=0.082;                            %</FONT>前轮转角<FONT face="Times New Roman">(</FONT>单位为弧度)</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Iz=3885;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">m=1818.2;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">l=a+b;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">i0=20; </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">t_final=50;                        %</FONT>响应终止时间</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Rpf=0;                           %</FONT>初始量</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Rc=0;                              %</FONT>初始量</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Y2pf=0;                            %</FONT>初始量</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Y<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="C">2c</st1:chmetcnv>=0;                           %</FONT>初始量</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">kl=[-b-(m*a)*u*u/(y(2)*l)]/(a-m*b*u*u/(y(1)*l)); </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">kw=m*(a*y(1)-b*y(2))/(l*l*y(1)*y(2));   </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Gr=u*(1-kl)/(i0*l)/(1+kw*u*u);         </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Gty=u*Gr;                        </FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">%</FONT>以下为微分方程的系数</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">A=(y(1)*a*a+y(2)*b*b)/(Iz*u);</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">B=(y(1)*a-y(2)*b)/Iz;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">C=(y(1)*a-y(2)*b)/(m*u*u)-1;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">D=(y(1)+y(2))/(m*u);</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">E=-(y(1)*a)/Iz+kl*y(2)*b/Iz;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">F=-y(1)/(m*u)-(y(2)*kl)/(m*u);</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">%</FONT>下面程序是求系统的稳定性裕度</P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">Mad1=eig();</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">for i=1:length(Mad1)</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">funreal1(i)=real(Mad1(i));</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">funimag1(i)=imag(Mad1(i));</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">if funimag1(i)==0;fuk1(i)=100000; continue;</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">else fuk1(i)=abs(2*pi*funreal1(i)/funimag1(i));</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">end</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">end</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">sex1=min(fuk1);</FONT></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">O=1/sex1;</FONT></P>
<P 0cm 0cm 0pt"><B normal">约束条件<p></p></B></P>
<P 0cm 0cm 0pt"><B normal">-120000&lt;y(1)&lt;-30000;<p></p></B></P>
<P 0cm 0cm 0pt"><B normal">-150000&lt;y(2)&lt;-40000;<p></p></B></P>
<P 0cm 0cm 0pt"><B normal">优化计算</B><B normal"><p></p></B></P>
<P 0cm 0cm 0pt"><FONT face="Times New Roman">y0=[-40000,-50000];%</FONT>初始条件</P>
<P 0cm 0cm 0pt"><B normal">请哪位高人给我提出优化算法,不胜感谢!!</B><B normal"><p></p></B></P>

pablo_001 发表于 2006-4-6 15:31

<FONT size=6><STRONG>还有一个约束<BR></STRONG></FONT><FONT face="Times New Roman"><FONT size=6><STRONG>kw=m*(a*y(1)-b*y(2))/(l*l*y(1)*y(2))&gt;0</STRONG></FONT> </FONT>

halps 发表于 2006-4-25 10:34

我也碰到了类似的问题,不知道楼主解决没有,能不能指点一下?<BR>我先采用符号计算的方法先得到关于某些变量的表达式,然后代入fminunc进行计算,但是函数表达式很长,计算时出错,不知道怎么解决............
页: [1]
查看完整版本: 求助:MAtlab优化问题