日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

鲍威尔法源程序码matlab,十一、Powell算法(鲍威尔算法)原理以及实现

發(fā)布時(shí)間:2024/8/1 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鲍威尔法源程序码matlab,十一、Powell算法(鲍威尔算法)原理以及实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、介紹

Powell算法是圖像配準(zhǔn)里面的常用的加速算法,可以加快搜索速度,而且對(duì)于低維函數(shù)的效果很好,所以本篇博客主要是為了介紹Powell算法的原理以及實(shí)現(xiàn)。

由于網(wǎng)上已經(jīng)有了對(duì)于Powell算法的講解,所以我只是把鏈接放出來(我覺得自己目前還沒有這個(gè)講解的能力),大家自己去了解。

放在這里主要也是為了節(jié)省大家搜索的時(shí)間。(都是我辛辛苦苦搜出來的^-^)。

二、預(yù)備知識(shí)

了解一維搜索算法:進(jìn)退法,消去法,黃金分割法

三、鮑威爾算法

具體原理閱讀這里:

四、matlab代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單函數(shù)的求解

這個(gè)代碼的程序與思路很是簡(jiǎn)潔,我覺得寫得很好。

原文代碼放在這里:

文件: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ǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。