一、介绍

  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. 初次在Vue项目使用TypeScript,需要做什么

    前言 总所周知,Vue新版本3.0 使用 TypeScript 开发,让本来就很火的 TypeScript 受到更多人的关注.虽然 TypeScript 在近几年才火,但其实它诞生于2012年10月, ...

  2. java发送邮件基础方法(另附部分主流邮箱服务器地址、端口及设置方法)

    java发送邮件基础方法,可通过重载简化参数 import java.io.File; import java.io.UnsupportedEncodingException; import java ...

  3. HTTP 错误 500.19 - Internal Server Error 错误代码 0x80070005 由于权限不足而无法读取配置文件

    HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 模块 IIS Web Core 通知 未知 处理程序 尚未确定 错误代码 ...

  4. CMAKE同时编译C++和CUDA文件

    1. 首先是运行环境 Ubuntu 16.04 G++ 5.4.0 CUDA 8.0 2. 文件结构 cv@cv:~/myproject$ tree src src/ |-- CMakeLists.t ...

  5. [译]C# 7系列,Part 3: Default Literals 默认文本表达式

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/ C#的default ...

  6. 简单介绍托管执行和 CLI

    目录 CIL 和 ILDASM 查看 myApp.dll 的 CIL 输出 使用 ILSpy 查看 myApp.dll 反编译后的代码 处理器不能直接解释程序集.程序集用的是另一种语言,即公共中间语言 ...

  7. linux系统centos7安装最新版本nginx

    一.准备环境 1.安装centos,一般买一个阿里云测试 2.下载nginx,链接http://nginx.org/download/nginx-1.10.2.tar.gz 二.开始安装 1.cent ...

  8. iOS开发 - 超级签名实现之描述文件

    简介 因为最近企业签掉得太严重了,上头要求实现超级签进行游戏下载.故有了此文章,记录一下过程. 签名原理其实很简单,超级签名的技术就是使用个人开发者账号,将用户的设备当作开发设备进行应用分发.这也导致 ...

  9. [20191206]隐含参数_db_always_check_system_ts.txt

    [20191206]隐含参数_db_always_check_system_ts.txt --//今年年头我做tab$删除恢复时,遇到的问题,就是遇到延迟块清除的问题.参考链接:http://blog ...

  10. 设置POP3/SMTP协议 手机绑定邮箱

    例如设置企业邮箱 一.设置POP3/SMTP协议,意思是代收邮件致本地POP3接收邮件服务器:pop.qiye.qq.comSMTP发送邮件服务器:smtp.qiye.qq.com二.设置IMAP/S ...