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

黄金分割法(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;
}
http://www.xdnf.cn/news/4521.html

相关文章:

  • 机器学习实战:6种数据集划分方法详解与代码实现
  • 微粉助手 1.1.0 | 专为社交电商用户设计的一站式营销工具,集成了群发消息、智能加好友、清理僵尸粉等功能
  • FBRT-YOLO:面向实时航空图像检测的更快更好的YOLO变体解析
  • AcWing 递归实现组合型枚举
  • 性能比拼: Redis Streams vs Pub/Sub
  • 电池全自动生产线:驱动新能源产业升级的核心引擎
  • 华为安全认证好还是数通认证好?
  • Excel表格批量合并工具推荐
  • 每日算法-250507
  • Manus AI突破多语言手写识别的技术壁垒研究报告
  • SpringBoot学习笔记(1)
  • 【信奥数学基础】最小公倍数与不等式证明
  • Docker 容器化部署深度研究与发展趋势
  • 【数据结构】单链表
  • Qt开发经验 --- 避坑指南(6)
  • Android接入国标平台:工业现场级的GB28181移动端接入实践
  • ps信息显示不全
  • 【纯小白博客搭建】Hugo+Github博客部署及主题(stack)美化等界面优化记录
  • 基于STM32、HAL库的ZMOD4410AI1R 气体传感器驱动程序设计
  • qwen2.5vl
  • 考研数据结构之树形查找:二叉排序树、平衡二叉树与红黑树(包含真题解析)
  • 使用 Couchbase Analytics Service 的典型步骤
  • 【面板数据】公开整理-各省刑事案件统计数据集(2011-2023年)
  • Java01-初识Java
  • C 语言 第六章 结构体(1)
  • 短词匹配:拼音相似度
  • LeetCode热题100--73.矩阵置零--中等
  • C语言初阶--数组
  • GSENSE2020BSI sCMOS科学级相机主要参数及应用场景
  • 探针卡的类型及其在半导体测试中的应用