二次插值法又稱拋物線法,它是利用函數在極值點附近具有二次函數的性質建立起來的一種多項式逼近方法。利用目標函數在若干點的信息(函數值、導數值等),構造一個與目標函數值相接近的插值多項式,用該多項式的最優解作為函數的近似最優解,隨着搜索區間的逐次縮短,多項式的最優點與原函數最優點的距離逐漸減小,直至滿足精度要求。
1.二次插值的程序框圖:
2. MATLAB可執行程序
function [x,f_x]=Quadratic_interpolation(f,x1,x2,x3,exp)
%% 函數說明
%{
本函數應用於二次插值
其中f表示輸入函數
x1,x2,x3表示要進行插值的三個點
exp精度
x:為輸出的極小值點
f_x:為輸出的極小值
調用方法:
clc;
clear;
f=@(x)(x+1/x);
[x,f]=n_d(f,0,10,30,0.01);
x
f
%}
%% 函數主題
f1=f(x1);
f2=f(x2);
f3=f(x3);
%{
sov_f=[f1,f2,f3]';
sov_x=[1,x1,x1^2
1,x2,x2^2
1,x3,x3^2];
sov_a=sov_x\sov_f;
a=sov_a;
a0=a(1);
a1=a(2);
a2=a(3);
%x_m=-a1/(2*a2);
%}
while 1
A=2*(f1*(x2-x3)+f2*(x2-x1)+f3*(x1-x2));
B=(f1*(x2^2-x3^2)+f2*(x2^2-x1^2)+f3*(x1^2-x2^2));
if A==0
disp('run is lost!!')
else
x_m=B/A;
if abs(x2-x_m)<exp
if f(x_m)<=f2
x=x_m;
f_x=f(x_m);
break
else
x=x2;
f_x=f2;
break
end
else
if (x_m-x1)*(x_m-x2)<0
if f(x_m)<=f2
x3=x2;
x2=x_m;
f3=f2;
f2=f(x_m);
else
x1=x_m;
f1=f(x_m);
end
else
if f(x_m)<=f2
x1=x2;
x2=x_m;
f1=f2;
f2=f(x_m);
else
x3=x_m;
f3=f(x_m);
end
end
end
end
end
end