鲍威尔法源程序码matlab,十一、Powell算法(鲍威尔算法)原理以及实现
一、介紹
Powell算法是圖像配準(zhǔn)里面的常用的加速算法,可以加快搜索速度,而且對(duì)于低維函數(shù)的效果很好,所以本篇博客主要是為了介紹Powell算法的原理以及實(shí)現(xiàn)。
由于網(wǎng)上已經(jīng)有了對(duì)于Powell算法的講解,所以我只是把鏈接放出來(lái)(我覺(jué)得自己目前還沒(méi)有這個(gè)講解的能力),大家自己去了解。
放在這里主要也是為了節(jié)省大家搜索的時(shí)間。(都是我辛辛苦苦搜出來(lái)的^-^)。
二、預(yù)備知識(shí)
了解一維搜索算法:進(jìn)退法,消去法,黃金分割法
三、鮑威爾算法
具體原理閱讀這里:
四、matlab代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單函數(shù)的求解
這個(gè)代碼的程序與思路很是簡(jiǎn)潔,我覺(jué)得寫得很好。
原文代碼放在這里:
文件:MyPowell.m
function MyPowell()
syms x1 x2 x3 a;
f=10*(x1+x2-5)^4+(x1-x2+x3)^2 +(x2+x3)^6;
error=10^(-3);
D=eye(3);
x0=[0 0 0]‘;
for k=1:1:10^6MaxLength=0;x00=x0;m=0;if k==1,s=D;endfor i=1:3x=x0+a*s(:,i);
ff=subs(f,{x1,x2,x3},{x(1),x(2),x(3)});
t=Divide(ff,a); %調(diào)用了進(jìn)退法分割區(qū)間
aa=OneDemensionslSearch(ff,a,t); %調(diào)用了0.618法進(jìn)行一維搜索
xx=x0+aa*s(:,i);
fx0=subs(f,{x1,x2,x3},{x0(1),x0(2),x0(3)});
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;
f1=subs(f,{x1,x2,x3},{x00(1),x00(2),x00(3)});
f2=subs(f,{x1,x2,x3},{x0(1),x0(2),x0(3)});
f3=subs(f,{x1,x2,x3},{ReflectX(1),ReflectX(2),ReflectX(3)});if f3
ff=subs(f,{x1,x2,x3},{x(1),x(2),x(3)});
t=Divide(ff,a);
aa=OneDemensionslSearch(ff,a,t);
x0=x0+aa*ss;for j=m:(3-1),s(:,j)=s(:,j+1);end
s(:,3)=ss;else
if f2>f3, x0=ReflectX;end
endif norm(x00-x0)
k;
x0;
end
opx=x0;
val=subs(f,{x1,x2,x3},{opx(1),opx(2),opx(3)});
disp(‘最優(yōu)點(diǎn):‘);opx‘disp(‘最優(yōu)化值:‘);val
disp(‘迭代次數(shù):‘);k
文件? Divide.m? :
%進(jìn)退法%對(duì)任意一個(gè)一維函數(shù)函數(shù)進(jìn)行區(qū)間分割,使其出現(xiàn)“高—低—高”的型式
function output=Divide(f,x,m,n)if nargin<4,n=1e-6;endif nargin<3,m=0;end
step=n;
t0=m;ft0=subs(f,{x},{t0});
t1=t0+step;ft1=subs(f,{x},{t1});if ft0>=ft1
t2=t1+step;ft2=subs(f,{x},{t2});while ft1>ft2
t0=t1;%ft0=ft1;
t1=t2;ft1=ft2;
step=2*step;t2=t1+step;ft2=subs(f,{x},{t2});
endelsestep=-step;
t=t0;t0=t1;t1=t;ft=ft0;%ft0=ft1;
ft1=ft;
t2=t1+step;ft2=subs(f,{x},{t2});while ft1>ft2
t0=t1;%ft0=ft1;
t1=t2;ft1=ft2;
step=2*step;t2=t1+step;ft2=subs(f,{x},{t2});
end
end
output=[t0,t2];
View Code
文件:OneDemensionslSearch.m
% 0.618法
function output=OneDemensionslSearch(f,x,s,r)if nargin<4,r=1e-6;end
a=s(1);b=s(2);
a1=a+0.382*(b-a);fa1=subs(f,{x},{a1});
a2=a+0.618*(b-a);fa2=subs(f,{x},{a2});while abs((b-a)/b)>r && abs((fa2-fa1)/fa2)>rif fa1
b=a2;a2=a1;fa2=fa1;a1=a+0.382*(b-a);fa1=subs(f,{x},{a1});elsea=a1;a1=a2;fa1=fa2;a2=a+0.618*(b-a);fa2=subs(f,{x},{a2});
end
end
op=(a+b)/2;%fop=subs(f,{x},{op});
output=op;
View Code
全部放到同一個(gè)工程目錄里面,設(shè)置為當(dāng)前目錄,然后輸入Powell即可運(yùn)行得到結(jié)果。
這個(gè)代碼的思路與鮑威爾算法的思路是完全符合的,而且很是簡(jiǎn)潔。
原文:https://www.cnblogs.com/fantianliang/p/12052264.html
總結(jié)
以上是生活随笔為你收集整理的鲍威尔法源程序码matlab,十一、Powell算法(鲍威尔算法)原理以及实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 手机怎样刷机解锁android,安卓手机
- 下一篇: uploadify java实例_jav