一、介绍

  Powell算法是图像配准里面的常用的加速算法,可以加快搜索速度,而且对于低维函数的效果很好,所以本篇博客主要是为了介绍Powell算法的原理以及实现。

  由于网上已经有了对于Powell算法的讲解,所以我只是把链接放出来(我觉得自己目前还没有这个讲解的能力),大家自己去了解。

  放在这里主要也是为了节省大家搜索的时间。(都是我辛辛苦苦搜出来的^-^)。

二、预备知识

  了解一维搜索算法:进退法,消去法,黄金分割法

  阅读以下博客:https://blog.csdn.net/shenziheng1/article/details/51088650

三、鲍威尔算法

  具体原理阅读这里:

  参考博客:https://blog.csdn.net/shenziheng1/article/details/51028074

  原理与例子(一个例子的计算过程):https://www.docin.com/p-956696217.html

四、matlab代码实现一个简单函数的求解

  代码来源:http://blog.sina.com.cn/s/blog_743c53600100vhdn.html

  这个代码的程序与思路很是简洁,我觉得写得很好。

  原文代码放在这里:

  文件:MyPowell.m 

function MyPowell()
syms x1 x2 x3 a;
f=*(x1+x2-)^+(x1-x2+x3)^ +(x2+x3)^;
error=^(-);
D=eye();
x0=[ ]';
for k=::^
MaxLength=;x00=x0;m=;
if k==,s=D;end
for i=:
x=x0+a*s(:,i);
ff=subs(f,{x1,x2,x3},{x(),x(),x()});
t=Divide(ff,a); %调用了进退法分割区间
aa=OneDemensionslSearch(ff,a,t); %调用了0.618法进行一维搜索
xx=x0+aa*s(:,i);
fx0=subs(f,{x1,x2,x3},{x0(),x0(),x0()});
fxx=subs(f,{x1,x2,x3},{xx(),xx(),xx()});
length=fx0-fxx;
if length>MaxLength,MaxLength=length;m=m+;end
x0=xx;
end
ss=x0-x00;
ReflectX=*x0-x00;
f1=subs(f,{x1,x2,x3},{x00(),x00(),x00()});
f2=subs(f,{x1,x2,x3},{x0(),x0(),x0()});
f3=subs(f,{x1,x2,x3},{ReflectX(),ReflectX(),ReflectX()});
if f3<f1&&(f1+f3-*f2)*(f1-f2-MaxLength)^<0.5*MaxLength*(f1-f3)^
x=x0+a*ss;
ff=subs(f,{x1,x2,x3},{x(),x(),x()});
t=Divide(ff,a);
aa=OneDemensionslSearch(ff,a,t);
x0=x0+aa*ss;
for j=m:(-),s(:,j)=s(:,j+);end
s(:,)=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(),opx(),opx()});
disp('最优点:');opx'
disp('最优化值:');val
disp('迭代次数:');k

  文件  Divide.m  :

% 进退法
%对任意一个一维函数函数进行区间分割,使其出现“高—低—高”的型式 function output=Divide(f,x,m,n) if nargin<,n=1e-;end if nargin<,m=;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=*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=*step;t2=t1+step;ft2=subs(f,{x},{t2}); end end
output=[t0,t2];

  文件:OneDemensionslSearch.m

% .618法
function output=OneDemensionslSearch(f,x,s,r) if nargin<,r=1e-;end a=s();b=s(); 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)/; %fop=subs(f,{x},{op}); output=op;

  全部放到同一个工程目录里面,设置为当前目录,然后输入Powell即可运行得到结果。

  这个代码的思路与鲍威尔算法的思路是完全符合的,而且很是简洁。

  

十一、Powell算法(鲍威尔算法)原理以及实现的更多相关文章

  1. C#常用8种排序算法实现以及原理简介

    public static class SortExtention { #region 冒泡排序 /* * 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先比较a[1]与a[2 ...

  2. 理解Liang-Barsky裁剪算法的算法原理

    0.补充知识向量点积:结果等于0, 两向量垂直; 结果大于0, 两向量夹角小于90度; 结果小于0, 两向量夹角大于90度.直线的参数方程:(x1, y1)和(x2, y2)两点确定的直线, 其参数方 ...

  3. 强化学习策略梯度方法之: REINFORCE 算法(从原理到代码实现)

    强化学习策略梯度方法之: REINFORCE 算法 (从原理到代码实现) 2018-04-01  15:15:42   最近在看policy gradient algorithm, 其中一种比较经典的 ...

  4. m_Orchestrate learning system---二十一、怎样写算法比较轻松

    m_Orchestrate learning system---二十一.怎样写算法比较轻松 一.总结 一句话总结:(1.写出算法步骤,这样非常有利于理清思路,这样就非常简单了 2.把问题分细,小问题用 ...

  5. 01--STL算法(算法基础)

    一:算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm>是所有STL头文件中 ...

  6. 经典算法 KMP算法详解

    内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 st ...

  7. 【机器学习】k-近邻算法以及算法实例

    机器学习中常常要用到分类算法,在诸多的分类算法中有一种算法名为k-近邻算法,也称为kNN算法. 一.kNN算法的工作原理 二.适用情况 三.算法实例及讲解 ---1.收集数据 ---2.准备数据 -- ...

  8. 值得花费一周研究的算法 -- KMP算法(indexOf)

    KMP算法是由三个科学家(kmp分别是他们名字的首字母)创造出来的一种字符串匹配算法. 所解决的问题: 求文本字符串text内寻找第一次出现字符串s的下标,若未出现返回-1. 例如 text : &q ...

  9. GMM算法k-means算法的比较

    1.EM算法 GMM算法是EM算法族的一个具体例子. EM算法解决的问题是:要对数据进行聚类,假定数据服从杂合的几个概率分布,分布的具体参数未知,涉及到的随机变量有两组,其中一组可观测另一组不可观测. ...

随机推荐

  1. Oracle:row_number()、rank()、dense_rank()

    语法:ROW_NUMBER()  OVER(): row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要 ...

  2. 移动端Vue图片获取,压缩,预览组件-upload-img(H5+获取照片,压缩,预览)

    组件示例图 组件代码 upload_img.vue <div id="uploadImg"> <div class="upload_image_box& ...

  3. 【consul】使用学习

    [consul]使用学习 转载:https://www.cnblogs.com/yangchongxing/p/10653791.html 1.下载 consul https://www.consul ...

  4. 信道估计之LS

    在无线通信系统中,系统的性能主要受到无线信道的制约.基站和接收机之间的传播路径复杂多变,从简单的视距传输到受障碍物反射.折射.散射影响的传播.在无线传输环境中,接收信号会存在多径时延,时间选择性衰落和 ...

  5. Django day03之学习知识点

    今日是路由层学习: 3.路由匹配 3.1 正则表达式的特点: 一旦正则表达式能够匹配到内容,会立刻结束匹配关系 直接执行对应的函数.相当于采用就近原则,一旦找到就不再继续往下走了 重点: 正则表达式开 ...

  6. python基础知识第九篇(函数)

    函数 >>>>>>>>>>> : 使用函数的好处 1.代码重用 2.保持一致性,方便维护 3.可扩展性 定义方法 def test01 ...

  7. Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面

    场景 Ubuntu Server 16.04 LTS上怎样安装下载安装Nginx并启动: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detai ...

  8. Maven 项目在 Eclipse 的创建配置

    第1步 New 菜单 Other.. -> Maven -> Maven Project ,然后单击 Next .如下图所示 第2步 在New Maven Project向导中,选择Cre ...

  9. Hack the Zico2 VM (CTF Challenge)

    下载链接: Download this VM here: https://download.vulnhub.com/zico/zico2.ova 端口扫描: ╰─ nmap -p1-65535 -sV ...

  10. 解密国内BAT等大厂前端技术体系-腾讯篇(长文建议收藏)

    1 引言 为了了解当前前端的发展趋势,让我们从国内各大互联网大厂开始,了解他们的最新动态和未来规划.这是解密大厂前端技术体系的第三篇,前两篇已经讲述了阿里和百度在前端技术这几年的技术发展.这一篇从腾讯 ...