经典算法(2):黄金分割法(Gold)

本文介绍了一种使用黄金分割法(0.618法)来高效寻找单峰函数极值点的方法,并通过MATLAB代码示例展示了如何逐步缩小区间直至找到最值点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

黄金分割法。0.618法。优选法。

以0.618^n的速率缩减区间,寻找最值点。


两点说明。

1. 当能明确目标函数是一个单峰函数的时候,

2. 当知道目标函数的极值点在哪个区间范围内的时候,

此方法非常有效。


昨天看招聘信息,第一条就是,天文地理、物理数学等烧脑专业优先。+_+

对于我们这种还不算特别烧脑的专业的人来说,凭空想可能有点难度。

不过拿一支笔在草稿纸上画画图,应该就可以知道怎么缩小区间了。

需要多用几个临时变量,e.g. x_low_try,较小的试探点,x_high_try,较大的试探点。


要得到f(x)的函数值,最好能另写一个函数,输入x,返回f(x),这样有助于代码实现。


%% 黄金分割法
% qcy
% 2016年12月22日23:43:40

clear;
close all;
clc

%%

fun = @(x) x.^2 - 2 * x - 3; % 匿名函数

x = -2:0.001:5;
f = x.^2 - 2*x - 3;
figure(1);
plot(x,f);
hold on;grid on;
title('f(x) = x^2 - 2x - 3');

SEARCH_MAX = 1e4;
X_LEN_EPS = 1e-4;
count = 0;

x_low = -2;
x_high = 5; 

range = x_high - x_low;

x_low_try = x_low + (1-0.618) * range; % 右试探点
x_high_try = x_low + 0.618 * range; % 左试探点

while count X_LEN_EPS)
   
    y_low_try = fun(x_low_try);
    y_high_try = fun(x_high_try);
    
    if y_low_try < y_high_try 
        x_high = x_high_try; % 更新右端点,左端点不动
        range = x_high - x_low; % 更新x的搜索范围
        x_low_try = x_low + (1-0.618) * range; % 更新试探点
        x_high_try = x_low + 0.618 * range; % 更新试探点
    else
        x_low = x_low_try; % 更新右端点,左端点不动
        range = x_high - x_low; % 更新x的搜索范围
        x_low_try = x_low + (1-0.618) * range; % 更新试探点
        x_high_try = x_low + 0.618 * range; % 更新试探点
    end
    
    plot( (x_high + x_low)/2 , fun((x_high + x_low)/2) ,'r.','markersize',7) %标记当前的位置
    drawnow;
    pause(0.2);
    
    count = count + 1;
    
end



x_min = (x_high + x_low)/2 ;
y_min = fun(x_min);

plot(x_min,y_min,'mp','markersize',7) %标记当前的位置


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qcyfred

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值