|
<>同大家交流一下:</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<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,:))<=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>b(i)<BR> MIN=b(i);<BR> end<BR> if MAX<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>=f(1))|(((f(1)-2*f(k+1)+fl)*(f(1)-f(k+1)-MAX)^2)>((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<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> |
|