一、介绍

  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. Demo00

    Demo00 std::transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内.要使用std::transform函数需要包含头文件. 以下是std::transform的 ...

  2. ACL(访问控制列表)

    第六部分,访问控制列表.访问控制列表(Access Control List,ACL) 是路由器和交换机接口的指令列表,用来控制端口进出的数据包.应用场景有校园网中教师网和学生网分别管理,通过acl控 ...

  3. telnet远程登陆

    这篇文章是第二次更新,内容为telnet远程登陆路由器,非常简单.直接进入正题,在网络配通的情况下,为路由器设置登陆密码和管理员密码,就可以通过pc机远程管理路由器或交换机. 目的: 网络拓扑图如下, ...

  4. iOS 类别 类扩展 简要说明

  5. DS-5获取License

    1.点击Eclipse for DS-5,打开DS-5,弹出workspace选择窗口   2.点击OK,打开DS-5,弹出License窗口,license需要自己去解决

  6. HTTP 错误 500.19 - Internal Server Error解决办法详解

    最近在服务器端部署程序发现这个问题,HTTP 错误 500.19 - Internal Server Error,程序在本地跑是没有问题的.但是部署完,浏览程序就出现这个问题,今天这篇文章就是记录一下 ...

  7. 《Java Spring框架》基于IDEA搭建Spring源码

    第一步: IDEA :IntelliJ IDEA 2018.1.4    :JDK安装(必须1.8或者以上),IDEA安装(过程省略). 第二步: Gradle:下载地址:https://servic ...

  8. java设计模式(一)动态代理模式,JDK与CGLIB分析

    -本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...

  9. c++之指针

    一.指针的基本概念 指针的作用:可以通过指针间接访问内存. 内存编号是从0开始记录的,一般用十六进制数字表示. 可以利用指针变量保存地址. 二.指针变量的定义和使用 指针变量定义语法:数据类型 *变量 ...

  10. abp模块化开发之通用树1:基本使用

    一.概述 有些功能在单个项目或多个项目被重复使用,比如:附件,同一个系统中的多个模块都可能使用到,不同项目也有需要.再比如:有无限级分类的树形功能,区域.产品分类.数据字典等.最简单粗暴的办法是直接复 ...