#ifndef GOLDEN_SEARCH_H
#define GOLDEN_SEARCH_H/*** @brief golden_min 黄金分割搜索,求最小值;要求f(x)在[a,b]区间内有单峰最小值*        每次问题规模减少(1-GR)=0.381966011250* @param a          函数f的自变量x的上边界* @param b          函数f的自变量x的上边界* @param eps        自变量容差* @param f          f(x)函数* @param x          求得最小值时的x* @return           最小值*/
double golden_min(double a, double b, double eps, double f ( double x ), double &x);#endif // GOLDEN_SEARCH_H
#include "golden_search.h"
#include "math.h"
#include "assert.h"
#include <QtCore>double golden_min(double a, double b, double eps, double f(double), double &x)
{//a----c--d----b//ac为小头,bc为大头, ac=db, bc/ab为黄金分割比例double result = NAN;const double GR = (sqrt(5.0) - 1.0)/2.0; //黄金分割比例, golden ratiodouble c = a + (b-a) * (1 - GR);double fc = f(c);bool bTure = (fc <= f(a) && fc <= f(b));if (!bTure){//初始参数不满足f(c) <= f(a)和f(b)assert(false);return result;}//保护措施,防止函数不满足条件等导致的死循环const int max_times = 3000;int times = 0;bool bSwapCD = false;double d, fd;while (true){//安全保护times++;if (times > max_times){result = fc;break;}c = a + (b-a) * (1 - GR);d = a + (b-a) * GR;if (bSwapCD){fc = f(c);}else{fd = f(d);}if (c > d){assert(false);}if (fabs(a - b) < eps * qMin(fabs(a), fabs(b))){x = (a + b) / 2;result = f(x);//std::cout <<  "times:" << times;break;}if (fc <= fd){b = d;fd = fc;bSwapCD = true;}else{a = c;fc = fd;bSwapCD = false;}}return result;
}
#include <QCoreApplication>
#include <QtCore>
#include "golden_search.h"static int T = 0;
typedef double (*func) (double);static double myfunc2(double x)
{T++;return pow(x, 2)  -200 * x + 10000.0;
}static void test_min(double a, double b, double eps, func f)
{QElapsedTimer timer;timer.start();double x3 = 0, fx3 = 0;int times = 1000;T = 0;timer.restart();for (int i = 0; i < times; i++){fx3 = golden_min(a, b, eps, f, x3);}qDebug () << "golden_min       "<< "x="  << QString::number(x3, 'E', 14)<< "fx=" << QString::number(fx3 , 'E', 14)<< timer.nsecsElapsed() / 1000000.0<< "ms, times:" << T/times;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);test_min(-1e100, 1e100, 1.0e-14, myfunc2);return a.exec();
}

运行输出:

golden_min x= "9.99999999789266E+1" fx= "0.00000000000000E+0" 22.8964 ms, times: 543

黄金分割搜索法求单峰极小值C++实现相关推荐

  1. 黄金分割算法求函数的极值C++实现

    黄金分割算法求极值迭代的最终判断是两次函数值的结果差是否很小,如果小,则说明该处函数的斜率很小,就是一个极值点. 过程如下: 以下是代码: //黄金分割法! /* ================== ...

  2. ALG 求单峰的位置

    ALG 求单峰的位置 算法导论课本算法复现 题目描述: 输入:一个长度为n的元素不重复的数组 输出:峰的位置index 代码实现: 主要想法: 类似于二分查找的思想,问题分成两个子问题,在舍弃一个子问 ...

  3. 多元函数牛顿法求函数极小值

    多元函数牛顿法求极小值是对一元函数牛顿法的延申,关于一元函数牛顿法,可以看兔兔的<牛顿法(Newton's method)求函数极小值>一文. (一)算法原理 与一元函数形式相似,但是又有 ...

  4. Python 求函数极小值、极大值点

    目录 Python 求函数极小值.极大值点 一.求极小值 1.不含参数的函数 2.含参数的函数 二.求极大值 Python 求函数极小值.极大值点 一.求极小值 1.不含参数的函数 例:求f(x)=s ...

  5. newton迭代法求近似值matlab,Newton迭代法求函数极小值点 Matlab程序

    clear all clc %Newton迭代法求解极小值点 %090311 %===================================== %定义函数 disp '函数 f(x) 为: ...

  6. Excel 和 python 使用梯度下降法分别求【极小值点】【线性回归问题】

    目录 一.梯度下降法求解 1.1 基本概念 1.2 梯度下降法手工求解 1.3 Excel 实现梯度下降法求解 二.线性回归问题求解 2.1 最小二乘法 2.2 梯度下降法 三.总结 四.参考资料 一 ...

  7. MATLAB利用逐步搜索法求隔根区间

    逐步搜索法的原理: 从区间[a,b]的左端点a出发,按选定的步长h一步步向右搜索,若: , ​​​​​​​ 则区间[a+jh,a+(j+1)h]内必有根.搜索过程也可以从b开始,这时应取步长h< ...

  8. 最速下降法(适用于求二阶极小值)

    最速下降法 过程 代码 过程 最速下降法步骤 给:min{f(x)},初始点:x0=(a0,b0)T,精度ε. 过程① 求出求出下降方向d,步长α, 下降方向:d = ▽f(x); 下次更新x的最优步 ...

  9. c语言逐步搜索法求有根区间,[C语言第五章.ppt

    [C语言第五章 算法举例 基本思想是,根据提出的问题,列举所有可能的情况,并 用问题中给定的条件检验哪些是需要的,哪些是不需要的. 教学进程 列举与试探 列举法常用于解决"是否存在" ...

最新文章

  1. 一文详解OpenCV中的CUDA模块
  2. Java集群优化——dubbo+zookeeper构建高可用分布式集群
  3. MongoDB整理笔记の管理Replica Sets
  4. [日期工具分享][Shell]为特定命令依次传入顺序日期执行
  5. NTP客户端通过脚本一键配置
  6. 简书python爬虫权威_python爬虫 --- 简书评论
  7. php订单系统 帝国cms,帝国CMS商城系统在线支付后,订单邮件提醒
  8. python求列表最大值下标_切片,丝滑的字符串 | Python基础连载(三)
  9. Storm ack和fail机制再论
  10. UVA1025——A Spy in the Metro【dp】
  11. OpenCV-Python实战(番外篇)——OpenCV、NumPy和Matplotlib直方图比较
  12. qt王者荣耀皮肤抽奖器
  13. 视频抠图在线工具有哪些?推荐这3款AI智能抠图工具
  14. 如何写一篇五彩斑斓的博客.append(可爱)
  15. 移动应用开发技术选择六要素
  16. 信息技术的分类方法有哪些?
  17. 【文本分类】文本分类案例
  18. TwinCAT3读取CSV文件
  19. Linux红帽RedHat 8升级更新Firefox火狐浏览器版本方法
  20. JAVA学习笔记 MySQL4 - sql单表基本操作

热门文章

  1. 在C#中设置打印机纸张大小
  2. 论文阅读“Simple Contrastive Graph Clustering”(arxiv)
  3. Data Catalog3.0:Modern Metadata for the Modern Data Stack
  4. 基于python实现仿探迹和天眼
  5. php字符串函数处理emoji,PHP中处理内容含有emoji表情的几种方式
  6. 论文图片模糊问题的解决
  7. 基于腾讯地图+Ant-Design-Vue封装省市区联动查询组件
  8. ARDUINO:控制两台步进电机同步运转
  9. PCB设计规则总结和原因分析
  10. java获取过去12个月日期