十一、Powell算法(鲍威尔算法)原理以及实现
一、介绍
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算法(鲍威尔算法)原理以及实现的更多相关文章
- C#常用8种排序算法实现以及原理简介
public static class SortExtention { #region 冒泡排序 /* * 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先比较a[1]与a[2 ...
- 理解Liang-Barsky裁剪算法的算法原理
0.补充知识向量点积:结果等于0, 两向量垂直; 结果大于0, 两向量夹角小于90度; 结果小于0, 两向量夹角大于90度.直线的参数方程:(x1, y1)和(x2, y2)两点确定的直线, 其参数方 ...
- 强化学习策略梯度方法之: REINFORCE 算法(从原理到代码实现)
强化学习策略梯度方法之: REINFORCE 算法 (从原理到代码实现) 2018-04-01 15:15:42 最近在看policy gradient algorithm, 其中一种比较经典的 ...
- m_Orchestrate learning system---二十一、怎样写算法比较轻松
m_Orchestrate learning system---二十一.怎样写算法比较轻松 一.总结 一句话总结:(1.写出算法步骤,这样非常有利于理清思路,这样就非常简单了 2.把问题分细,小问题用 ...
- 01--STL算法(算法基础)
一:算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm>是所有STL头文件中 ...
- 经典算法 KMP算法详解
内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 st ...
- 【机器学习】k-近邻算法以及算法实例
机器学习中常常要用到分类算法,在诸多的分类算法中有一种算法名为k-近邻算法,也称为kNN算法. 一.kNN算法的工作原理 二.适用情况 三.算法实例及讲解 ---1.收集数据 ---2.准备数据 -- ...
- 值得花费一周研究的算法 -- KMP算法(indexOf)
KMP算法是由三个科学家(kmp分别是他们名字的首字母)创造出来的一种字符串匹配算法. 所解决的问题: 求文本字符串text内寻找第一次出现字符串s的下标,若未出现返回-1. 例如 text : &q ...
- GMM算法k-means算法的比较
1.EM算法 GMM算法是EM算法族的一个具体例子. EM算法解决的问题是:要对数据进行聚类,假定数据服从杂合的几个概率分布,分布的具体参数未知,涉及到的随机变量有两组,其中一组可观测另一组不可观测. ...
随机推荐
- 使用SQL计算宝宝每次吃奶的时间间隔(续)
本文是<使用SQL计算宝宝每次吃奶的时间间隔>的续篇,因为我工作繁忙,时常不能及时帮助媳妇儿记录,为了让不懂数据库的媳妇儿也可以自己用手机熟练操作.我继续做了一些修正和封装: 1.给媳妇儿 ...
- 《java面试十八式》第一式 --冈本零点零一
第一式 [冈本零点零一] 冈本零点零一:将简历包装于无形,博得人事的芳心,用过的人都说好 . 要想有更多的面试机会,简历是不可缺少的,机会都没有何谈面:所以这也是我们的第一步. 首先是简历模板: 模板 ...
- vue中使用this遇到的坑
在两个页面中创建函数,并且调用一个函数中能够获取到代表vue实例的this,而另一个却获取不到 页面1: <button id="login" v-text="$t ...
- 【Java Web开发学习】Spring加载外部properties配置文件
[Java Web开发学习]Spring加载外部properties配置文件 转载:https://www.cnblogs.com/yangchongxing/p/9136505.html 1.声明属 ...
- eclipse 代码问题总结
隐藏控件,在xml文件中写属性 android:visibility="gone"
- springboot整合axis1.4搭建服务端
前言 最近公司要开发个接口,要用webservices接口实现,而且使用的是axis1.4框架,webservices和axis这两个东西我之前都没接触过,而且axis1.4这个框架06年就不再维护了 ...
- plsql修改某一行数据
plsql修改某一行数据时, 在查询语句后面加上for update,再点击
- Object类和异常
Object类(所有类的顶级父类) 今天说的两个方法: equals: 用于比较两个对象是否相同,它其实是使用两个对象的内存地址进行比较,底层默认使用的是==比较运算符来判断的. ...
- SpringMVC生成的验证码图片不显示
近期用SSM框架写一个项目,登录模块需要生成验证码图片,我把相关的代码写好了之后传到 jsp ,但是图片不显示,查看控制台显示404,反复查询了一下代码并没有发现任何问题,代码如下: @Control ...
- Ajax获取网页添加到div中
1:利用DOM获取该 div 的 ID,然后清空该DIV的内容(如果你需要接着里面的内容添加可不要清空):需要注意点是清空最好用“ empty() ”: 2: 把 async设成true ,否则又 ...