数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 4967|回复: 2

我编的2维寻优powell算法

[复制链接]
发表于 2005-5-19 07:17:27 | 显示全部楼层 |阅读模式
<>同大家交流一下:</P>

<>function f=powellfun(x)<BR>f=x(1)^2+2*x(2)^2-2*x(1)*x(2)-4*x(1);</P>

<>close all;<BR>clear;</P>
<P>e=1e-5;n=2;                    %%%%%%<BR>d=[1 0;0 1];<BR>x=[];x(1,=[1 1];f=[];a=[];m=0;k=1;ap=0;<BR>f(1)=powellfun(x(1,);<BR>r=f(1);<BR>for p=1:1:n<BR>    for q=1:1:n<BR>for i=0:0.01:3<BR>    x((k+1),=x(k,:)+i*d(k,:);<BR>    b=powellfun(x((k+1),:));<BR>    if b&lt;r<BR>        f(k+1)=b;<BR>        r=b;<BR>        a(k)=i;<BR>    end<BR>end<BR>x((k+1),:)=x(k,:)+a(k)*d(k,:);<BR>if k==n<BR>    if abs(x(k+1,:)-x(1,:))&lt;=e<BR>            lastx=x(k+1,:);<BR>            lastf=powellfun(lastx);<BR>            hold<BR>        else<BR>          MAX=0;<BR>          MIN=0;<BR>          b=[];<BR>          for i=1:1:k<BR>              b(i)=f(i)-f(i+1);<BR>          end<BR>          MIN=b(1);<BR>          MAX=b(1);<BR>          for i=2:1:k<BR>              if MIN&gt;b(i)<BR>                  MIN=b(i);<BR>              end<BR>              if MAX&lt;b(i)<BR>                  MAX=b(i);<BR>              end<BR>          end<BR>          for i=1:1:k<BR>              if MAX==b(i)<BR>                  m=i-1;<BR>              end<BR>          end<BR>          fl=powellfun((2*x(k+1,:)-x(1,:)));<BR>          if (fl&gt;=f(1))|(((f(1)-2*f(k+1)+fl)*(f(1)-f(k+1)-MAX)^2)&gt;((f(1)-fl)^2*MAX)/2)<BR>              f(1)=f(k+1);<BR>              x(1,:)=x(k,:);<BR>              k=1;<BR>          else<BR>              for i=1:1:m<BR>                  d(i,:)=d(i,:);<BR>              end<BR>              for i=(m+1):1:n-1<BR>                  d(i,:)=d((i+1),:);<BR>              end<BR>              d(k,:)=(x(k+1,:)-x(1,:));<BR>              fp=f(k+1);<BR>              for i=0:0.01:3<BR>                  xp=x(k+1,:)+i*d(k,:);<BR>                  s=powellfun(xp);<BR>                  if s&lt;fp<BR>                      fp=s;<BR>                      s=fp;<BR>                      ap=i;<BR>                  end<BR>              end<BR>                  x(1,:)=x(k+1,:)+ap*d(k,:);<BR>                  f(1)=powellfun(x(1,:));<BR>                  k=1;<BR>            end           <BR>        end<BR>    else<BR>   k=k+1;<BR>end<BR>end<BR>end<BR>lastx=x(1,:)<BR>lastf=f(1)</P>

<P>要做多维的改进一下就可以了,在多维的情况下速度快!</P>
<P>而且可做无目标函数寻优!!</P>
发表于 2005-11-22 05:10:42 | 显示全部楼层
<>你好,请问你有DFP算法的程序吗,我用了POWELL方法,解的结果很不理想,不知道是不是我写错了,帮忙看看,谢谢,我的邮箱是<a href="mailtwangkwmail@163.com" target="_blank" >wangkwmail@163.com</A>可以与我联系,谢谢,期待你的回答</P>
<>不知道你的一维搜索采用的是什么方法,能求多极值的问题吗</P>
<>function x=test<BR>global x;<BR>global d;<BR>global e;<BR>dlt=1;<BR>x0=[15.1,5.3,0.1,0.1];<BR>d=eye(4,4);<BR>%d1=eye(4,4);<BR>e=zeros(1,4);<BR>epnal=0.0000001;<BR>alfa=zeros(1,4);<BR>alfa5=0;<BR>k=1;<BR>%i=1;<BR>x=x0;<BR>x00=x;<BR>%while feixianxing(x)&gt;=0.05<BR>g=1;<BR>while g&gt;=0.000001<BR>    for i=1:1:4<BR>        alfa(i)=yiweisousuo(x,d,i);<BR>        x=x00+alfa(i)*d(i,;<BR>        x00=x;<BR>    end<BR>    r=norm(x0-x,'fro');<BR>    e=(x-x0)/r;<BR>    alfa5=yiweisousuop(x,e)<BR>    x=x+alfa5*e<BR>    alfamax=max(alfa)<BR>    %delt=alfamax/r;<BR>    for i=1:1:4<BR>        if alfa(i)==max(alfa);<BR>        s=i<BR>        end<BR>    end<BR>    if alfamax*dlt/r&gt;=epnal<BR>        for i=1:1:4<BR>            if i==s<BR>               d(i,=e<BR>            else<BR>               d(i,=d(i,:)<BR>            end<BR>        end<BR>        dlt=alfamax*dlt/r;<BR>    end<BR>    g=feixianxing(x)<BR>    x0=x;<BR>    if g&gt;0.001<BR>        break;<BR>    end<BR>    <BR>end</P>
<P>%end<BR></P>
发表于 2005-11-22 05:11:57 | 显示全部楼层
<>你好,请问你有DFP算法的程序吗,我用了POWELL方法,解的结果很不理想,不知道是不是我写错了,帮忙看看,谢谢,我的邮箱是<a href="mailtwangkwmail@163.com" target="_blank" >wangkwmail@163.com</A>可以与我联系,谢谢,期待你的回答</P>
<>不知道你的一维搜索采用的是什么方法,能求多极值的问题吗</P>
<>function x=test<BR>global x;<BR>global d;<BR>global e;<BR>dlt=1;<BR>x0=[15.1,5.3,0.1,0.1];<BR>d=eye(4,4);<BR>%d1=eye(4,4);<BR>e=zeros(1,4);<BR>epnal=0.0000001;<BR>alfa=zeros(1,4);<BR>alfa5=0;<BR>k=1;<BR>%i=1;<BR>x=x0;<BR>x00=x;<BR>%while feixianxing(x)&gt;=0.05<BR>g=1;<BR>while g&gt;=0.000001<BR>for i=1:1:4<BR>alfa(i)=yiweisousuo(x,d,i);<BR>x=x00+alfa(i)*d(i,;<BR>x00=x;<BR>end<BR>r=norm(x0-x,''fro'');<BR>e=(x-x0)/r;<BR>alfa5=yiweisousuop(x,e)<BR>x=x+alfa5*e<BR>alfamax=max(alfa)<BR>%delt=alfamax/r;<BR>for i=1:1:4<BR>if alfa(i)==max(alfa);<BR>s=i<BR>end<BR>end<BR>if alfamax*dlt/r&gt;=epnal<BR>for i=1:1:4<BR>if i==s<BR>d(i,=e<BR>else<BR>d(i,=d(i,:)<BR>end<BR>end<BR>dlt=alfamax*dlt/r;<BR>end<BR>g=feixianxing(x)<BR>x0=x;<BR>if g&gt;0.001<BR>break;<BR>end<BR><BR>end</P>
<P>%end<BR></P>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 07:42 , Processed in 0.050442 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表