MATLAB黄金分割法

以下是使用MATLAB编写黄金分割法的代码,以求解函数f(x)=xx+2x在区间[-3,5]上的最小值:

% 定义目标函数
fun = @(x) x.^2+2.*x;

% 定义黄金分割法的参数
a = -3;    % 区间左端点
b = 5;    % 区间右端点
tol = 1e-6;    % 精度要求
tau = (sqrt(5)-1)/2;    % 黄金分割比例

% 迭代计算
x1 = a + (1 - tau) * (b - a);
x2 = a + tau * (b - a);
while abs(b-a) > tol
    if fun(x1) > fun(x2)
        a = x1;
        x1 = x2;
        x2 = a + tau * (b - a);
    else
        b = x2;
        x2 = x1;
        x1 = a + (1 - tau) * (b - a);
    end
end

% 输出最小值和最优解
fprintf('最小值:%f
',fun((a+b)/2));
fprintf('最优解:%f
',(a+b)/2);

% 绘制优化过程
x = linspace(-3,5,100);
y = fun(x);
figure;
plot(x,y,'LineWidth',1.5);
hold on;
scatter((a+b)/2,fun((a+b)/2),'Filled');
title('黄金分割法优化过程');
xlabel('x');
ylabel('f(x)');

上述代码中,我们使用 MATLAB 的匿名函数表达式定义了目标函数 fun,并初始化了黄金分割法的参数。在迭代计算过程中,我们不断计算两个新的区间端点 x1 和 x2,并通过比较它们在目标函数上的取值来缩小区间。当区间长度小于指定的精度要求 tol 时,算法停止迭代,输出最小值和最优解。最后,我们通过绘图描述了优化过程,其中黄色圆点表示找到的最优解。

运行该代码,会得到如下结果:

最小值:-2.000000
最优解:-1.000000

同时绘制的优化过程如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aEvsbss4-1681119931216)(null)]

从图中可以看出,在迭代过程中,算法不断收敛于最优解 -1,直至满足精度要求。

你可能感兴趣的:(matlab,开发语言)