进退法——用来确定极小值区间的一个算法
当我们知道一个函数,区间确定,在x1和x3之间有x2,假设f(x1)>f(x2)<f(x3),这样一种高低高的形式存在,那我们就可以确定在区间[x1,x3]间有极小值。
假设有一个初始步长h0,h0不能太大,否则有可能会跨过极值点。在每次步长增加后,我们比对增加步长前与增加步长后的f(xh0)和f(xh1),假设f(xh0)大于f(xh1),则我们可以确定在这个h0步长下,会有极小值存在,我们就把f(xh1)定为下一次增加步长前的值,然后确定下一次的值x3,x3为xh1增加步长h0后的值,当我们找到一个值,即f(xn)>f(x2)的时候,我们就把当前极小值的区间确定为xh0和xhn;
另外一种可能就是,增加步长后的值大于当前步长所在的值,我们就进行-h0的增长步长,增长前记为x2,增长后记为x3,假设在此期间,不断进行-h0的增长,有f(x3)>f(x2),则可以确定区间为[x3,x2],其中x3为一直-h0的值。
算法描述为——
function[a,b]=Jintui(f,x1,h0)
x2=x1+h0;
if f(x2) < f(x1)
x3=x2+h0;
h=h0;
while f(x3) < f(x2)
x3=x2+h;
h=2*h;
end
a=x1;
b=x3;
else
Temp=x1;
x1=x2;
x2=Temp;
h=-h0;
x3=x2+h;
while f(x3) < f(x2)
x3=x2+h;
h=2*h;
end
a=x3;
b=x1;
end
算法输入条件为——函数句柄,函数的初始点x1,步长h0;
使用示例为——假设有一个函数f=x^2-8x+9,我们用以下方法画出该函数的曲线为
代码——
syms x
f=@(x) x.^2-8*x +8;
ezplot(f,[-100 100])
以上描述是在函数值存在的情况下的理想情况,但是当我们的函数的值不存在,或者为复数的情况,那该方法就不适用。就需要对以上算法进行优化,防止出现-INF或者inf的情况。