《数值计算方法》系列总目录

第一章 误差序列实验
第二章 非线性方程f(x)=0求根的数值方法
第三章 CAD模型旋转和AX=B的数值方法
第四章 插值与多项式逼近的数值计算方法
第五章 曲线拟合的数值方法
第六章 数值微分计算方法
第七章 数值积分计算方法
第八章 数值优化方法


第八章——内德-米德方法

  • 一、算法原理
    • 1、黄金分割搜索法
  • 二、实验内容及核心算法代码
    • 内德-米德方法原理实现
  • 四、结论

一、算法原理

1、黄金分割搜索法

  对于多元函数极值点的求解显然不能继续沿用第一节的方法,因为多元函数涉及到每个变量的偏导数,情况更加复杂。对于多元函数,内德-米德方法可以很好的利用迭代解决多元函数极小值点的问题。内德和米德提出了单纯形法,可用于求解多变量函数的局部极小值。对于双变量函数,单纯形即为三角形。通俗来讲,二元函数的单纯性就是由三个二元向量组成的集合,该方法通过模式搜索过程最终求解函数极小值点。比较三角形3个顶点处的函数值, 值最大的顶点为最差顶点WWW,用一个新的顶点代替最差顶点,形成新的三角形式,然后继续这一过程。这一过程生成一系列三角形,函数在其顶点处的值越来越小,随着三角形的减小就可以找到极小值点的坐标。因此就需要确定以怎样的原则和搜索方向选取每次迭代的新增迭代点。通过推导,以如下原则进行迭代:
A. 初始三角形BGWBGWBGW
  设要求函数f(x,y)f(x,y)f(x,y)的极小值。首先,给定三角形的3个顶点 ,k=1,2,3k=1,2,3k=1,2,3。在这3个点上对函数f(x,y)f(x,y)f(x,y)求值zk=f(xk,yk){z_k} = f({x_k},{y_k})zk​=f(xk​,yk​),k=1,2,3k=1,2,3k=1,2,3。下标编号满足z1≤z2≤z3z_1≤z_2≤z_3z1​≤z2​≤z3​。用B=(x1,y1),G=(x2,y2),W=(x3,y3)B = ({x_1},{y_1}),G = ({x_2},{y_2}),W = ({x_3},{y_3}){\rm{ }}B=(x1​,y1​),G=(x2​,y2​),W=(x3​,y3​)来帮助记忆。BBB是最佳顶点,GGG是次最佳顶点,而WWW是最差顶点。
B. 良边的中点
  构造过程使用了连接BBB和GGG的线段的中点。它可由平均坐标得到
M=B+G2=(x1+x22,y1+y22)M = \frac{{B + G}}{2} = \left( {\frac{{{x_1} + {x_2}}}{2},\frac{{{y_1} + {y_2}}}{2}} \right){\rm{ }}M=2B+G​=(2x1​+x2​​,2y1​+y2​​)C. 反射点RRR
  沿着三角形的边由WWW向BBB方向和由WWW向GGG方向,函数的值递减,因此以点BBB和GGG连线为分界线,与WWW相对的点的函数值f(x,y)f(x,y)f(x,y)会较小。选择测试点R为关于边BGBGBG对三角形进行的"反射"。要确定点R,首先找到边BGBGBG的中点MMM,然后从点WWW到MMM画线段,称其长度为ddd。从MMM点做该线段的延长线,长度为ddd,得到点RRR。RRR的向量公式为
R=M+(M−W)=2M−WR = M + (M - W) = 2M - WR=M+(M−W)=2M−W
D. 开拓点EEE
  如果RRR处的函数值比WWW处的函数值小,则求解的方向是正确的。可能极小值点的位置只比点RRR略远一点。因此,将过MMM和RRR的线段延长到点EEE,构成一个新的开拓三角形BGEBGEBGE。点EEE沿着连结MMM和RRR的线段的方向延长距离ddd。如果EEE处的函数值比RRR处的小,则该顶点比RRR好。点EEE的向量公式为
E=R+(R−M)=2R−ME = R + (R - M) = 2R - ME=R+(R−M)=2R−ME. 收缩点 C
  如果点RRR和WWW的函数值相等,则需要测试另一个点。或许点MMM处的函数值较小,但是为了保证构成三角形,不能用点MMM替代WWW。分别考虑两个线段WMWMWM和MRMRMR上的点C1C_1C1​和C2C_2C2​。具有较小函数值的点为CCC,并由此构成三角形BGCBGCBGC。注意在二维情况下,在点C1C_1C1​和C2C_2C2​之间选择看起来不合适,但在高维情况下这一点非常重要。
F. 向BBB方向收缩
  如果点CCC处的函数值不小于WWW处的值,则点GGG和WWW必将向BBB的方向收缩。点GGG置换为M,点W置换为SSS,后者是连接BBB和WWW的线段中点。
到此,所有搜索步骤结束,通过反复的迭代,最终在误差精度范围内停止搜索得到极小值点。综上所述,内德-米德方法的基本流程如下所示:

二、实验内容及核心算法代码

内德-米德方法原理实现

  由第一节原理部分可知,对于多元函数,内德-米德方法可以通过迭代的方法实现。对于NNN元函数,需要N+1N+1N+1个点组成的单纯性进行迭代,最终找到极小值点。对于多元函数,求解良边的中点、反射点、拓展点和收缩点的方法类似。因此我们仅讨论二元函数的内德-米德方法的步骤。其基本流程如下:

  1. 对于给定的三个点进行排序,决定BGWBGWBGW点的顺序。
  2. 求解良边BGBGBG的中点并计算反射点,比较反射点的取值与GGG点的取值。
  3. 若反射点小于GGG点,则继续计算拓展点及其取值,若拓展点小于BBB点,则将WWW点替换为拓展点,若拓展点大于BBB点,则将WWW点替换为反射点;否则,计算收缩点。
  4. 若收缩点小于WWW点,则将WWW替换为收缩点;否则计算向BBB方向收缩边的中点,并将WGWGWG替换为BBB方向收缩点。
  5. 重复步骤1-4,直到搜索点满足精度要求。

  通过以上步骤我们可以发现,计算的过程主要集中在求解各个点及其函数值上,因此我们可以运用面向对象的编程方法,构造二元点类,设置其成员变量的为其横纵坐标,成员函数包括求解与另一二元点中点、拓展点以及该点处函数值,并且重载+∗+*+∗运算符方便程序使用。
因此通过以下实例对内德-米德方法进行试验。

  • 使用内德-米德方法求解以下函数的极小值点。

      对于三元、四元函数,需要4、5个点进行搜索迭代,并且求解各个迭代点的方式也有所不同,所构造的类也有所不同,但是核心思想都是基于迭代。
      其核心函数算法代码为:
//---------------------------------Golden_section--------------------------------
void CmpExtremumPointbyNelder_Mead(TriPoint_3pt* Pt, TriPoint_3pt** ptset, int& iter, const float eps, const int Max_iter, int sign)
{Sort_PtRelation(Pt, sign);ptset[iter][0] = Pt[0];//bestptset[iter][1] = Pt[1];//good1ptset[iter][2] = Pt[2];//good2ptset[iter][3] = Pt[3];//worst++iter;TriPoint_3pt B, G1, G2, W;//the value sort is B<G1<G2<WB = Pt[0]; G1 = Pt[1]; G2 = Pt[2]; W = Pt[3];if (abs(W.fun_set(sign) - B.fun_set(sign)) < eps || iter >= Max_iter){return;}TriPoint_3pt M, R;M = B.CmpMeanpoint(G1, G2);R = W.CmpReflectpoint(M);R.fun_set(sign);if (R.fun_set(sign) < G2.fun_set(sign)){if (R.fun_set(sign) > B.fun_set(sign)){W = R;}else{TriPoint_3pt E;E = W.CmpExploitpoint(M);if (E.fun_set(sign) < B.fun_set(sign)){W = E;}else{W = R;}}}else{if (R.fun_set(sign) < W.fun_set(sign)){W = R;}else{TriPoint_3pt C1, C2;C1 = W.Cmp_IN_Contractionpoint(M);C2 = W.Cmp_OUT_Contractionpoint(M);if (C1.fun_set(sign) < W.fun_set(sign)){W = C1;}else if (C2.fun_set(sign) < W.fun_set(sign)){W = C2;}else{TriPoint_3pt S, M1, M2;S = B.CmpMidpoint(W);M1 = B.CmpMidpoint(G1);M2 = B.CmpMidpoint(G2);W = S;G1 = M1;G2 = M2;}}}Pt[0] = B; Pt[1] = G1; Pt[2] = G2; Pt[3] = W;CmpExtremumPointbyNelder_Mead(Pt, ptset, iter, eps, Max_iter, sign);
}

四、结论

  由实验结果可以看出,利用内德-米德方法求解多元函数极小值点的迭代次数较多,其收敛速度较慢,其原因是因为内德-米德方法搜索极小值点的方法完全是依靠判断两个方向的函数值进行盲目搜索,每次迭代过程中并没有准确的搜索方向,因此会导致搜索过程完全基于迭代比较,其原理与分类搜索法类似,因此参考分类搜索方法的实验结果可以知道内德-米德方法的搜索速度会很慢。然而如果初始值点选取好并且函数性质良好,有可能会减少搜索次数。


声明:本系列《数值计算方法》所有章节源代码均为作者编写,大家可以自行下载,仅供学习交流使用,欢迎大家评论留言或者私信交流,请勿用于任何商业行为。其中,各章实验数据结果也在资源链接中,大家可以自行实验对照,欢迎大家批评指正!文件中每个算法均由作者进行初步测试,部分算法可直接用于工程开发作为模块参考。

各章算法源代码(C++)

内德-米德方法——《数值计算方法》相关推荐

  1. Python阿基米德方法计算Pi

    目录 1.原理 2.代码 1.原理 由内嵌正六边形入手 因为这样圆的半径就为正六边形的边长 再取每段弧的中点,连接原来弧的两点,得到更逼近圆的正十二边形 重复这样的做法,就可以得到一个很好的的近似值 ...

  2. 插值与多项式逼近的数值计算方法——《数值计算方法》

    <数值计算方法>系列总目录 第一章 误差序列实验 第二章 非线性方程f(x)=0求根的数值方法 第三章 CAD模型旋转和AX=B的数值方法 第四章 插值与多项式逼近的数值计算方法 第五章 ...

  3. sqlite数值长度超过7位出错_数值计算方法 第一章 绪论

    一.数值计算方法概览 1.研究对象:数值问题--有限个输入数据(问题的自变量.原始数据)与有限个输出数据(待求解数据)之间函数关系的一个明确无歧义的描述. 例如,求解微分方程的符号解即可看做无限输出, ...

  4. 栅格单元值的选取方法_计算机求解微分方程的六大数值计算方法

    今天介绍关于计算机求解微分方程的六大数值计算的方法. 1.有限元法 有限元方法的基础是变分原理和加权余量法,其基本求解思想是把计算域划分为有限个互不重叠的单元,在每个单元内,选择一些合适的节点作为求解 ...

  5. 【例题+习题】【数值计算方法复习】【湘潭大学】(七)

    第七章:非线性方程的数值解法 目录 第七章:非线性方程的数值解法 写在前面的话 知识点(重点) 牛顿迭代法 牛顿下山法 例题(重点) 习题 7.6 7.10 7.12 7.15 写在前面的话 书籍:& ...

  6. 【例题+习题】【数值计算方法复习】【湘潭大学】(六)

    第六章:矩阵特征值问题的解法 目录 第六章:矩阵特征值问题的解法 写在前面的话 知识点(重点) 乘幂法和反乘幂法思想 例题(重点) 基础 盖尔圆盘 特征值扰动 同号数 习题 6.1 6.4 6.10 ...

  7. matlab的数值计算方法,数值计算方法中的一些常用算法的Matlab源码

    数值计算方法中的一些常用算法的Matlab源码,这些程序都是原创,传上来仅供大家参考,不足之处请大家指正,切勿做其它用途-- 说明:这些程序都是脚本函数,不可直接运行,需要创建函数m文件,保存时文件名 ...

  8. 曲线拟合的数值方法——《数值计算方法》

    <数值计算方法>系列总目录 第一章 误差序列实验 第二章 非线性方程f(x)=0求根的数值方法 第三章 CAD模型旋转和AX=B的数值方法 第四章 插值与多项式逼近的数值计算方法 第五章 ...

  9. 北京科技大学 数值计算方法实验代码

    前言: 数值计算方法实验可以使用Matlab.C/C++.Python.Java等语言进行编程,考虑到同学期数学实验课程使用Matlab进行,建议提前熟悉Matlab编程(也效率更高). 本文中各实验 ...

最新文章

  1. 还在用JDK6的同学,来看看JDK13新特性详解吧
  2. TypeScript 定义函数的几种写法
  3. CSS3基础知识(一)
  4. Intellij新建Spring项目引入用户目录下的Spring jar包
  5. django虚拟环境搭建
  6. 麒麟810怎么样_麒麟810+6G+128G+大电池,千元价格的手机上手体验
  7. Atitit.hibernate体系结构大总结
  8. 计算机网络总结-一本书一个晚上一个奇迹
  9. 视频插帧论文阅读(一)——FLAVR
  10. (转帖)CAP理论(1)
  11. 狼图腾--满族为什么能以少统多
  12. 微信运动服务器忙,微信运动步数每天不足百步,你们宅着忙什么呢?
  13. 作为前端你不得不知-浏览器的工作原理:网络浏览器幕后揭秘
  14. Web全栈工程师到底是个什么鬼?为什么Facebook声称:“我们只招全栈工程师!”
  15. 设计数据密集型应用——分布式系统的麻烦(8)
  16. Java工程师只要掌握这些知识点,就能给面试官一个满意的答案,挑战高薪
  17. ptmalloc源码分析 - 多线程争抢竞技场Arena的实现(04)
  18. Python 竟然不是最赚钱的编程语言?!
  19. 【将金令】1.21早评:欧QE独占鳌头,金银高位不休
  20. 中了敲诈者病毒,文件恢复有可能吗?你长着一张被勒索木马敲诈的脸?

热门文章

  1. 最好用的分组数据可视化工具--Seaborn调色盘
  2. 阿里巴巴矢量图标库全选
  3. python人工智能工程师要求_想跻身高薪的AI人工智能工程师,你需要符合哪些条件?...
  4. Calcite-学习笔记(入门篇)
  5. java 基础知识(不定期更新)
  6. dw html 浮动窗口,Dreamweaver怎样实现飘浮光球特效
  7. LiveData-原理全解析
  8. 房讯房屋租赁管理软件新版上线 专为房东朋友定制
  9. RouterOS的DNS设置说明
  10. Html网站页面实现黑白效果