MATLAB之黄金分割法求极值
一、算法原理
该算法可以与进退法结合求函数极值,利用进退法求出高函数极小值所在的区间,将该区间作为输入利用黄金分割法求得极值。
假设函数f(x)的极值坐在区间为(a,b),利用黄金分割点
在区间(a,b)内插入两点:
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
将搜索区间分为三段:
比较f(x1)f(x2)的大小,
若 f(x1)<f(x2)
b=x2; 新的搜索区间为(a,x2)
否则
a=x1;新的搜索区间为(x1,b)
最后判断 abs(a,b) ,该区间是否足够小,取区间中点作为极值点。
二、matlab程序
clc
clear
f=@(x) x.^3-6*x+9;
fplot(f)
[a,b]=Min_jintui(f,0,0.001);
[fx,x]=huangjin(f,[a b],100) % (a,b)为搜索区间
function [result,x]=huangjin(f,x0,n)
tol=1e-6;%精度
x1=x0(1);
x2=x0(2);
i=1;
while i < n
%取中间值
a=x1+0.382*(x2-x1);
b=x1+0.618*(x2-x1);
fa=f(a);
fb=f(b);
% 判断fa fb大小,缩小区间
if fa < fb
x2=b;
else
x1=a;
end
if abs(x1-x2) < tol
result=f((x1+x2)/2);
x=(x1+x2)/2;
break;
end
i=i+1;
end
end