matlab中抛物线法求极值

img


img

你好,以下代码供你参考,能注释的,都注释了

clc; clear;
x0 = 0;  x1 = 0.5;  x2 = 1;%初始区间,自己设置
f=@(x) 3*x^2 - 2*tan(x);  %创建题目要求匿名函数,方便使用
N = 100;  % 最多100次
iter =1;    % 初始迭代步
es = 1e-6;   % 误差
e = 1;
fprintf('迭代次数     x0        x1          x2       x(解)       f(最小值)     误差\n')
for i = 1:N     % 迭代
    f0 = f(x0);     % 初始f0
    f1 = f(x1);     % f1
    f2 = f(x2);     % f2
    x3 = (f0*(x1^2-x2^2)+f1*(x2^2-x0^2)+f2*(x0^2-x1^2))/(2*f0*(x1-x2)+2*f1*(x2-...
        x0)+2*f2*(x0-x1));  % 二次插值迭代函数
    f3 = f(x3); % 计算f3
    if f3<f1    % 比较f3和f1大小
        e = abs(x3-x1);    % 误差
        x0 = x1;    % 设置新的左端x
        x1 = x3;    % 设置新的中间x
    else
        if f1<f3 && f3 < f2 && x3 < x2 && x3 > x1 %假如 f1 比 f3, 找到x3位置并看取代哪个
            x2 = x3; %用x3取代x2
        else
            if f1<f3 && f3 < f0 && x3 > x0 && x3 < x1 
                x0=x3; % 用x3取代x0
            end
        end
    end
    fprintf('%6d\t%f\t%f\t%f\t%f\t%f\t%e\n', i, x0, x1, x2, x3, f3, e)%输出每一步迭代结果
    if e<es % 误差比较
        break   % 满足容差就结束
    end
end

结果输出

迭代次数     x0        x1          x2       x(解)       f(最小值)     误差
     1    0.000000    0.500000    0.550323    0.550323    -0.318533    1.000000e+00
     2    0.500000    0.412041    0.550323    0.412041    -0.364786    8.795921e-02
     3    0.412041    0.378927    0.550323    0.378927    -0.365581    3.311424e-02
     4    0.378927    0.388860    0.550323    0.388860    -0.365810    9.933796e-03
     5    0.378927    0.388860    0.390133    0.390133    -0.365810    9.933796e-03
     6    0.388860    0.389493    0.390133    0.389493    -0.365810    6.329650e-04
     7    0.389493    0.389493    0.390133    0.389493    -0.365810    2.129880e-08

可见到了第七次迭代,误差已经是2e-8,远小于设定的1e-6,可以结束
答题不易,有用还请题主给个采纳支持一下答主哦