当前位置: 首页 > news >正文

黄金分割法(0.618 法)

黄金分割法简介

黄金分割法属于区间缩小法,通过逐步缩小包含极值的区间长度,逼近极值点。在每一次迭代中,使用黄金分割点 0.618 将区间分为两部分,比较这两点处的函数值,舍弃较差区间,从而逐渐逼近最优解。

数学推导

设单峰函数 f ( x ) f(x) f(x) 在区间 [ a , b ] [a, b] [a,b] 上有唯一极小值。
根据黄金分割原理,将区间 [ a , b ] [a, b] [a,b] 分成两个子区间,点 x 1 x_1 x1 x 2 x_2 x2 满足
x 2 − a b − a = b − x 1 b − a = ϕ ≈ 0.618 \frac{x_2 - a}{ b-a } = \frac{b-x_1}{b-a} = \phi \approx 0.618 bax2a=babx1=ϕ0.618
其中
φ = φ = 5 − 1 2 \varphi = \varphi = \frac{\sqrt{5} - 1}{2} φ=φ=25 1

具体计算

x 1 = b − φ ( b − a ) x 2 = a + φ ( b − a ) x_1 = b - \varphi (b-a) \\ x_2 = a + \varphi (b-a) x1=bφ(ba)x2=a+φ(ba)
然后比较 f ( x 1 ) f(x_1) f(x1) 和 f(x_2) 的值
如果 f ( x 1 ) > f ( x 2 ) f(x_1) > f(x_2) f(x1)>f(x2) 则舍弃区间 [ a , x 1 ] [a, x_1] [a,x1] 极小值在 [ x 1 , b ] [x_1, b] [x1,b] 之间
否则,舍弃 区间 [ b , x 2 ] [b, x_2] [b,x2] 极小值在 [ a , x 1 ] [a, x_1] [a,x1] 之间

算法流程

  • [1] 给定区间 [ a , b ] [a, b] [a,b], 计算黄金比例常数 φ \varphi φ
  • [2] 计算初始两点
    x 1 = b − φ ( b − a ) x 2 = a + φ ( b − a ) x_1 = b - \varphi (b-a) \\ x_2 = a + \varphi (b-a) x1=bφ(ba)x2=a+φ(ba)
  • [3] 计算 f ( x 1 ) f(x_1) f(x1) f ( x 2 ) f(x_2) f(x2)
  • [4] 比较 f ( x 1 ) f(x_1) f(x1) f ( x 2 ) f(x_2) f(x2)
    f ( x 1 ) > f ( x 2 ) f(x_1) > f(x_2) f(x1)>f(x2), 则 a = x 1 a = x_1 a=x1
    否则 b = x 2 b = x_2 b=x2
  • [5]更新新的 x 1 x_1 x1 x 2 x_2 x2
  • [6] 重复计算 4 和 5 直到 ∣ b − a ∣ < η |b - a| < \eta ba<η
  • [7] 返回 a + b 2 \frac{a+b}{2} 2a+b 作为极小值点近似值

算法实现

#include <iostream>
#include <cmath>
#include <functional>class GoldenSectionSearch {
private:double left;        // 区间左端点double right;       // 区间右端点double eps;         // 精度要求std::function<double(double)> func; // 待求极值的函数const double phi = (std::sqrt(5.0) - 1) / 2; // 黄金比例常数 0.618...public:// 构造函数GoldenSectionSearch(double l, double r, double e, std::function<double(double)> f): left(l), right(r), eps(e), func(f) {}// 执行搜索double search() {double x1 = right - phi * (right - left);double x2 = left + phi * (right - left);double f1 = func(x1);double f2 = func(x2);while (std::fabs(right - left) > eps) {if (f1 < f2) { // 若求最大值改成 >right = x2;x2 = x1;f2 = f1;x1 = right - phi * (right - left);f1 = func(x1);} else {left = x1;x1 = x2;f1 = f2;x2 = left + phi * (right - left);f2 = func(x2);}}// 返回极小值点(区间中点)return (left + right) / 2.0;}
};int main() {// 示例:求 f(x) = (x-2)^2 + 1 的最小值点auto func = [](double x) {return (x - 2) * (x - 2) + 1;};GoldenSectionSearch gss(0, 5, 1e-6, func);double min_x = gss.search();std::cout << "极小值点 x ≈ " << min_x << std::endl;std::cout << "对应的 f(x) ≈ " << func(min_x) << std::endl;return 0;
}

相关文章:

  • 机器学习实操 第二部分 神经网路和深度学习 第14章 使用卷积神经网络进行深度计算机视觉
  • 【LLM+Code】Devin PromptTools详细解读
  • AI与Web3.0:去中心化智能合约的未来
  • PostgreSQL中“参数默认值实现伪重载“详解
  • neo4j多跳查询,未只获取到收尾两个节点,待继续
  • ROS第十三梯:RViz+Marker——自定义几何形状可视化
  • vue-qr生成的二维码增加下载功能
  • 跨境电商生死局:动态IP如何重塑数据生态与运营效率
  • PostgreSQL 系统管理函数详解
  • 晶体布局布线
  • 电商双11美妆数据分析(2)
  • 新能源汽车BMS开发工程师视频教程合集(100+节课)
  • java多线程------synchronized
  • Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决
  • 1.1.2 简化迭代器 yield return的使用
  • Flutter Drawer 详解
  • 《人工智能:如何重塑教育模式与学习图景》
  • 深入理解Java反射机制
  • C语言回调函数初始化与触发方法
  • 【存储管理—动态不等长存储资源分配算法】
  • 习近平将出席中国—拉美和加勒比国家共同体论坛第四届部长级会议开幕式并发表重要讲话
  • 邯郸一酒店办婚宴发生火灾,新郎母亲:饭没吃成酒店还要收费
  • 新疆维吾尔自治区乌鲁木齐市米东区政协原副主席朱文智被查
  • 明明睡够了,怎么还有黑眼圈?可能是身体在求救
  • “上海之帆”巡展在日本大阪开幕,松江区组织企业集体出展
  • 奥园集团将召开债券持有人会议,拟调整“H20奥园2”本息兑付方案