十一、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=10*(x1+x2-5)^4+(x1-x2+x3)^2 +(x2+x3)^6;
error=10^(-3);
D=eye(3);
x0=[0 0 0]‘;
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);
            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)});
        t=Divide(ff,a);
        aa=OneDemensionslSearch(ff,a,t);
        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;

        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];

  文件:OneDemensionslSearch.m

% 0.618法
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;

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

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

  

原文地址:https://www.cnblogs.com/fantianliang/p/12052264.html

时间: 2024-10-01 00:31:28

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

一致性hash算法的工作原理

1.一致性hash算法的工作原理 首先我们有一个hash函数H,可以通过数据的key值计算出一个数字型的hash值.然后我们将整个hash环的范围定义为[1,L]这个区间,我们将刚才算出的hash值对L进行取余,就能算出一个key值在这个环上的位置.而每一台真实服务器结点就会负责[1-L]之间的某个区间的数据.如上图,就是一个五个结点的hash环. 上面hash环的L值为1000,然后我们对ABCDE 5个点分别进行hash运算,H(A) mod L = 7, H(B) mod L = 234,

ng机器学习视频笔记(十一) ——K-均值算法理论

ng机器学习视频笔记(十一) --K-均值算法理论 (转载请附上本文链接--linhxx) 一.概述 K均值(K-Means)算法,是一种无监督学习(Unsupervised learning)算法,其核心是聚类(Clustering),即把一组输入,通过K均值算法进行分类,输出分类结果. 由于K均值算法是无监督学习算法,故这里输入的样本和之前不同了,输入的样本只有样本本身,没有对应的样本分类结果,即这里的输入的仅仅是{x(1),x(2),-x(m)},每个x没有对应的分类结果y(i),需要我们

转载——Adaboost 算法 人脸检测原理

对人脸检测的研究最初可以追溯到 20 世纪 70 年代,早期的研究主要致力于模板匹配.子空间方法,变形模板匹配等.近期人脸检测的研究主要集中在基于数据驱动的学习方法,如统计模型方法,神经网络学习方法,统计知识理论和支持向量机方法,基于马尔可夫随机域的方法,以及基于肤色的人脸检测.目前在实际中应用的人脸检测方法多为基于 Adaboost学习算法的方法. Viola人脸检测方法是一种基于积分图. 级联检测器和AdaBoost 算法的方法,方法框架可以分为以下三大部分:    第一部分,使用Harr-

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

机器学习中常常要用到分类算法,在诸多的分类算法中有一种算法名为k-近邻算法,也称为kNN算法. 一.kNN算法的工作原理 二.适用情况 三.算法实例及讲解 ---1.收集数据 ---2.准备数据 ---3.设计算法分析数据 ---4.测试算法 一.kNN算法的工作原理 官方解释:存在一个样本数据集,也称作训练样本集,并且样本中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最

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

一:算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较.交换.查找.遍历操作.复制.修改.反转.排序.合并等等. <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作. <functional>中则定义了一些模板类,用以声明函数对象. STL

【啊哈!算法】算法7:Dijkstra最短路算法

上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. <ignore_js_op> 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. <ignore_js_op> 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下.

【啊哈!算法】算法9:开启树之旅

这是什么?是一个图?不对,确切的说这是一棵树.这哪里像树呢?不要着急我们来变换一下. 是不是很像一棵倒挂的树,也就是说它是根朝上,而叶子朝下的.不像?哈哈,看完下面这幅图你就会觉得像啦. 你可能会问:树和图有什么区别?这个称之为树的东西貌似和无向图差不多嘛.不要着急,继续往下看.树其实就是不包含回路的连通无向图.你可能还是无法理解这其中的差异,举个例子,如下.          上面这个例子中左边的是一棵树,而右边的是一个图.因为左边的没有回路,而右边的存在1->2->5->3->

【啊哈!算法】算法10:二叉树

二叉树是一种特殊的树.二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树.更加严格的递归定义是:二叉树要么为空,要么由根结点.左子树和右子树组成,而左子树和右子树分别是一棵二叉树. 下面这棵树就是一棵二叉树. 二叉树的使用范围最广,一棵多叉树也可以转化为二叉树,因此我们将着重讲解二叉树. 二叉树中还有连两种特殊的二叉树叫做满二叉树和完全二叉树.如果二叉树中每个内部结点都有两个儿子,这样的二叉树叫做满二叉树.或者说满二叉树所有的叶结点都有同样的深

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S