求助:MAtlab优化问题
<P ><FONT size=4><STRONG>目标函数:min f=x1^2+x2^2;<BR>但是式中的x1,x2不是原始变量,他们是通过变量k1,k2经过一系列复杂计算的出的,现在要优化k1,k2,使得目标函数f最小,不知如何编程,望高手能不吝赐教,谢谢!!!</STRONG></FONT></P>
回复:(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编辑过]
<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> <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编辑过]
回复:(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的函数我的程序如下,不知用什么优化程序
<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<y(1)<-30000;<p></p></B></P>
<P 0cm 0cm 0pt"><B normal">-150000<y(2)<-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> <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))>0</STRONG></FONT> </FONT> 我也碰到了类似的问题,不知道楼主解决没有,能不能指点一下?<BR>我先采用符号计算的方法先得到关于某些变量的表达式,然后代入fminunc进行计算,但是函数表达式很长,计算时出错,不知道怎么解决............
页:
[1]