加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

powell算法的matlab实现(通用程序)

(2011-06-02 17:02:16)
标签:

matlab

powell

0.618法

进退法

杂谈

function  output=fpowell(f,t,N,A,e)

 

if nargin<5,error=10^(-3);else error=e;end

if nargin<4,x0=zeros(N,1);else x0=A;end

syms  a;

D=eye(N);

k=1;

while k>0

    MaxLength=0;x00=x0;m=0;

    if k==1,s=D;end

    for i=1:N

            x=x0+a*s(:,i);

            for j=1:N , t(j)=x(j);end

            ff=subs(f);

            t=Divide(ff,a);

            aa=OneDemensionslSearch(ff,a,t);

            xx=x0+aa*s(:,i);

            for j=1:N , t(j)=x0(j);end

            fx0=subs(f);

            for j=1:N , t(j)=xx(j);end

            fxx=subs(f,{x1,x2,x3},{xx(1),xx(2),xx(3)});

            length=fx0-fxx;

            if length>MaxLength,MaxLength=length;m=m+1;end

            x0=xx;

    end

    ss=x0-x00;

    ReflectX=2*x0-x00;

    for j=1:N , t(j)=x00(j);end

    f1=subs(f);

    for j=1:N , t(j)=x0(j);end

    f2=subs(f);

    for j=1:N , t(j)=ReflectX(j);end

    f3=subs(f);

    iff3<f1&&(f1+f3-2*f2)*(f1-f2-MaxLength)^2<0.5*MaxLength*(f1-f3)^2

        x=x0+a*ss;

        for j=1:N , t(j)=x(j);end

        ff=subs(f);

        t=Divide(ff,a);

        aa=OneDemensionslSearch(ff,a,t);

        x0=x0+aa*ss;

        for j=m:(N-1),s(:,j)=s(:,j+1);end

        s(:,N)=ss;

    else

        if f2>f3, x0=ReflectX;end

    end

   if norm(x00-x0)<error,break;end

   k=k+1;

   k

   x0'

end

opx=x0;

val=subs(f,{x1,x2,x3},{opx(1),opx(2),opx(3)});

output(1)=opx;output(2)=val;

opx'

val

k

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有