黄金分割法

 

(1)用0.618法求解优化问题:

 

的极小点和极小值(进退法确定初始区间),精度为10-6

(2)根据0.618法算法步骤编写Matlab的程序实现0.618搜索法;

(3)要求输出内容包括:极小点、极小值、每次迭代的abalak的值;

(4)按照模板撰写实验报告,要求规范整洁。

 

1. 算法步骤

首先定义黄金分割比例r = (sqrt(5)-1)/2; 再初始化区间和初始值 L = b-a; x1 = a + (1-r)*L; x2 = a + r*L; fx1 = f(x1); fx2 = f(x2); 给定初始区间 [𝑎,𝑏][a,b] 和精度要求,计算区间长度 𝐿=𝑏−𝑎L=ba,计算初始点 𝑥1x1​ 和 𝑥2x2,计算 𝑓(𝑥1)f(x1​) 和 𝑓(𝑥2)f(x2​)。

记录每次迭代的值、初始区间和初始点,最后进行迭代计算。

2. 代码

function [xm,fm,aList,bList,alList,akList] = golds(f,a,b,tol)

% f: 待优化的目标函数

% a,b: 初始区间

% tol: 精度要求

% xm,fm: 最优解和相应的最优函数值

 

% 黄金分割比例

r = (sqrt(5)-1)/2;

% 初始值

L = b-a;

x1 = a + (1-r)*L;

x2 = a + r*L;

fx1 = f(x1);

fx2 = f(x2);

 

% 记录每次迭代的值

i = 1;

aList(i) = a;

bList(i) = b;

alList(i) = x1;

akList(i) = x2;

 

% 迭代计算

while L > tol

    if fx1 > fx2

        a = x1;

        x1 = x2;

        fx1 = fx2;

        x2 = a + r*(b-a);

        fx2 = f(x2);

    else

        b = x2;

        x2 = x1;

        fx2 = fx1;

        x1 = a + (1-r)*(b-a);

        fx1 = f(x1);

    end

    i = i+1;

    aList(i) = a;

    bList(i) = b;

    alList(i) = x1;

    akList(i) = x2;

    L = b-a;

end

 

% 输出结果

xm = (a+b)/2;

fm = f(xm);

end

 

% 定义函数

f = @(x) x^2 - x+6;

% 定义区间和精度

a = 0; b = 1; tol = 1e-6;

% 调用 golds 函数求解

[xm,fm,aList,bList,alList,akList] = golds(f,a,b,tol);

% 输出结果

fprintf('The minimum point is %f, and the minimum value is %f.\n', xm, fm);

fprintf('The a values are:\n'); disp(aList);

fprintf('The b values are:\n'); disp(bList);

fprintf('The al values are:\n'); disp(alList);

fprintf('The ak values are:\n'); disp(akList);

posted @ 2024-05-11 11:33  涨涨涨张  阅读(66)  评论(0编辑  收藏  举报