没什么好说的了,直接上代码
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;
使用示例
本文由 hunsh 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 17, 2021 at 11:48 pm