十一、Powell算法(鲍威尔算法)原理以及实现

⼗⼀、Powell算法(鲍威尔算法)原理以及实现
⼀、介绍
  Powell算法是图像配准⾥⾯的常⽤的加速算法,可以加快搜索速度,⽽且对于低维函数的效果很好,所以本篇博客主要是为了介绍Powell算法的原理以及实现。  由于⽹上已经有了对于Powell算法的讲解,所以我只是把链接放出来(我觉得⾃⼰⽬前还没有这个讲解的能⼒),⼤家⾃⼰去了解。
  放在这⾥主要也是为了节省⼤家搜索的时间。(都是我⾟⾟苦苦搜出来的^-^)。
⼆、预备知识
  了解⼀维搜索算法:进退法,消去法,黄⾦分割
  阅读以下博客:
三、鲍威尔算法
  具体原理阅读这⾥:
  参考博客:
  原理与例⼦(⼀个例⼦的计算过程):
四、matlab代码实现⼀个简单函数的求解
  代码来源:
  这个代码的程序与思路很是简洁,我觉得写得很好。
  原⽂代码放在这⾥:
  ⽂件: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=[000]';
for k=1:1:10^6
MaxLength=0;x00=x0;m=0;
if k==1,s=D;end
for i=1:3
x=x0+a*s(:,i);
ff=subs(f,{x1,x2,x3},{x(1),x(2),x(3)});
t=Divide(ff,a);                        %调⽤了进退法分割区间
aa=OneDemensionslSearch(ff,a,t);    %调⽤了0.618法进⾏⼀维搜索            xx=x0+aa*s(:,i);rcc
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<f1&&(f1+f3-2*f2)*(f1-f2-MaxLength)^2<0.5*MaxLength*(f1-f3)^2
x=x0+a*ss;
ff=subs(f,{x1,x2,x3},{x(1),x(2),x(3)});
lte-at=Divide(ff,a);
aa=OneDemensionslSearch(ff,a,t);2013年中央经济工作会议全文
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
end
if norm(x00-x0)<error,break;end
k;
x0;
end
opx=x0;
val=subs(f,{x1,x2,x3},{opx(1),opx(2),opx(3)});
disp('最优点:');opx'
disp('最优化值:');val
disp('迭代次数:');k
  ⽂件  Divide.m  :
%对任意⼀个⼀维函数函数进⾏区间分割,使其出现“⾼—低—⾼”的型式function output=Divide(f,x,m,n)
if nargin<4,n=1e-6;end
if 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;m176
t1=t2;ft1=ft2;
step=2*step;t2=t1+step;ft2=subs(f,{x},{t2});
end
else
step=-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
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)>r
if fa1<fa2
b=a2;a2=a1;fa2=fa1;a1=a+0.382*(b-a);fa1=subs(f,{x},{a1});
else
a=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
  全部放到同⼀个⼯程⽬录⾥⾯,设置为当前⽬录,然后输⼊Powell即可运⾏得到结果。  这个代码的思路与鲍威尔算法的思路是完全符合的,⽽且很是简洁。

本文发布于:2024-09-22 11:38:21,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/131382.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:算法   函数   代码   分割   搜索
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议