抛物线法是求无约束一维极值问题的一种方法,也叫二次插值法,其理论依据为二次多项式可以在最优点附近较好地逼近函数的形状,做法是在函数的最优点附近取三个构造点,然后用这三个点构造一条抛物线,把这条抛物线的极值点作为函数的极值点的近似。
每次构造 一条抛物线后,抛物线的极值点就可作为一个新的构造点,新的构造点与原来的三个构造点经过某种算法,得到下一步抛物线逼近的三个构造点,这就是抛物线法的算法过程。
编写抛物线法的MATLAB代码如下:
function root = Parabola(f,a,b,x,eps)
%抛物线法求函数f在区间[a,b]上的一个零点
%函数名: f
%区间左端点: a
%区间右端点: b
%初始迭代点: x
%根的精度: eps
%求出的函数零点: root
if(nargin == 4)
eps=1.0e-4;
end
f1 = subs(sym(f),findsym(sym(f)),a);
f2 = subs(sym(f),findsym(sym(f)),b);
if(f1 ==0)
root = a;
end
if(f2 == 0)
root= b;
end
if(f1*f2> 0)
disp('两端点函数值乘积大于0');
return;
else
tol= 1;
fa = subs(sym(f), findsym(sym(f)),a);
fb = subs(sym(f), findsym(sym(f)),a);
fx = subs(sym(f), findsym(sym(f)),x);
d1=(fb-fa)/(b-a);
d2=(fx- fb)/(x- b);
d3=(f2- f1)/(x-a);
B=d2+d3*(x-b);
root=x-2+ fx/(B+ sign(B) * sqrt(B^2-4* fx*d3));
t= zeros(3);
t(1)=a;
t(2)=b;
t(3)=x;
while(tol> eps)
t(1) = t(2); %保存3个点
t(2) = t(3);
t(3)= root;
f1 = subs(sym(f),findsym(sym(f)),t(1)); %计算3个点的函数值
f2 = subs(sym(f),findsym(sym(f)),t(2));
f3 = subs(sym(f),findsym(sym(f)),t(3));
d1 =(f2- f1)/(t(2)-t(1)); %计算3个差分
d2= (f3- f2)/(t(3)- t(2));
d3= (d2- d1)/(t(3)- t(1));
B=d2+d3* (t(3)- t(2)); %计算算法中的B
root= t(3)-2* f3/(B+ sign(B) * sqrt(B^2-4*f3*d3));
tol= abs(root- t(3));
end
end
end
例 采用抛物线法求方程lgx+x1/2=2在区间[1,4]上的一个根。
解:根据抛物线算法,编写代码如下:
clear all
clc
syms x
f = sqrt(x) + log(x)-1;
r = Parabola( f,1,3,2)
结果如下: