0.618法求解凸函數極小值(內附matlab代碼)

0.618法求解凸函數極小值(內附matlab代碼)

%%%%      0.618%%%%%
%%%%%    Liu Deping    %%%%%
%%%%%    2020.09.21    %%%%%
clc;
clear all
format short
s=input('請輸入函數表達式:f = ','s');
f=inline(s);
a = input('請輸入區間左端點a的值:');
b = input('請輸入區間左端點b的值:');
eps= input('請輸入運算精度:');    %%|b-a|<=eps」
k=0;
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
fprintf(' k [a,b] x1 x2 f(x1) f(x2)\n ');
fprintf('%d [%.3f,%.3f] %.3f %.3f %.3f %.3f\n', k,a,b,x1,x2,f(x1),f(x2));
while abs(a-b)>eps
    k=k+1;
    x1=a+0.382*(b-a);
    x2=a+0.618*(b-a);
    if  f(x1)>f(x2)
        a=x1;
        b=b;
    elseif  f(x1)<=f(x2)
        a=a;
        b=x2;
    end
   fprintf(' %d [%.3f,%.3f] %.3f %.3f %.3f %.3f\n', k,a,b,x1,x2,f(x1),f(x2));
end
fprintf('通過%d次迭代,可取%.3f做爲近似最優解',k,(a+b)/2);