Matlab最优化问题 一维搜索 Fibonacci斐波那契 0.618黄金分割法

in 默认分类 with 0 comment

没什么好说的了,直接上代码

Fibonacci斐波那契

function [] = fib(f, a, b, e, t)
% author: hunsh
% time: 05/16/2020
% f 函数
% a b 左右边界
% e 允许误差
% t 最大迭代次数
n=0;
for i=1:100
    if fibonacci(i+1)>(b-a)/e
        n=i;
        break
    end
end
disp(n+"步")
lam2=a+fibonacci(n)/fibonacci(n+1)*(b-a);
lam1=b-lam2+a;
f1=f(lam1);f2=f(lam2);
times=0;
while lam2-lam1>e
if nargin==5 && times>=t
        break
end
    times=times+1;
    disp([a,lam1,lam2,b,f1,f2])
    if f1<f2
        b=lam2;
        lam2=lam1;
        lam1=b-lam2+a;
        f2=f1;
        f1=f(lam1);
    else
        a=lam1;
        lam1=lam2;
        lam2=b-lam1+a;
        f1=f2;
        f2=f(lam2);
    end
end
disp([a,lam1,lam2,b,f1,f2])
disp("中点"+mean([lam1,lam2]))
disp("f(x)="+f(mean([lam1,lam2])))

0.618黄金分割法

function [] = gold(f, a, b, e, t)
% author: hunsh
% time: 05/16/2020
% f 函数
% a b 左右边界
% e 允许误差
% t 最大迭代次数
lam1=a+0.382*(b-a);
lam2=a+0.618*(b-a);
f1=f(lam1);f2=f(lam2);
times=0;
while lam2-lam1>e
if nargin==5 && times>=t
        break
end
    times=times+1;
    disp([a,lam1,lam2,b,f1,f2])
    if f1<f2
        b=lam2;
        lam2=lam1;
        lam1=b-lam2+a;
        f2=f1;
        f1=f(lam1);
    else
        a=lam1;
        lam1=lam2;
        lam2=b-lam1+a;
        f1=f2;
        f2=f(lam2);
    end
end
disp([a,lam1,lam2,b,f1,f2])
disp("中点"+mean([lam1,lam2]))
disp("f(x)="+f(mean([lam1,lam2])))

使用提示

函数可以这样输入
f=@(x)x^2+2*x;

使用示例

示例

Responses