? ?在[a,b]上分為n段,共n+1個點。插入3次多項式,并使其二階導(dǎo)數(shù)連續(xù)的方法稱為三次樣條插值算法。
思路:
1.二階導(dǎo)數(shù)為線性函數(shù)。
2.插值點的函數(shù)值已知、一階導(dǎo)數(shù)、二階導(dǎo)數(shù)連續(xù)。
3.加上邊界條件即可求解。
邊界條件
1.夾持條件:已知起點和終點的速度。
2.自然邊界條件:已知奇點和終點的加速度。
3.周期性條件:假設(shè)f為以b-a為周期的周期函數(shù) ? ? ? ?
?
插值方法:
假設(shè):第i個點的二階導(dǎo)數(shù)為Mi,則在[xi-1,xi]上,其二階導(dǎo)數(shù)為線性函數(shù)
則在[xi-1,xi]上進行線性插值
令?
進行二次積分得到原函數(shù)?
?
線性插值有:
?得到原函數(shù):
對各段函數(shù)求導(dǎo)?
?
由連續(xù)性條件?
兩邊同乘?
則可寫成
添加邊界條件1?
?
可寫成
可寫成
寫成矩陣形式
結(jié)合以下五個式子即可求解
?
實例matlab介紹?
%三次樣條插值
x=[0 1 4 5];
y=[0 -2 -8 -4];
dy1=5/2;
dy4=19/4;
n=4;
%計算h
for i=2:n
h(i)=x(i)-x(i-1);
end
%計算u,v,g
for i=2:n-1
u(i)=h(i)/(h(i)+h(i+1));
v(i)=1-u(i);
g(i)=6/(h(i)+h(i+1))*((y(i+1)-y(i))/h(i+1)-(y(i)-y(i-1))/h(i));%明天修改
end
g(1)=6/h(2)*((y(2)-y(1))/h(2)-dy1);
g(4)=6/h(4)*(dy4-(y(4)-y(3))/h(4));
%系數(shù)矩陣
A=zeros(4,4);
for i=1:n
if i==1
A(i,1)=2;
A(i,2)=1;
else if i==n
A(i,n-1)=1;
A(i,n)=2;
else
A(i,i)=2;
A(i,i-1)=u(i);
A(i,i+1)=v(i);
end
end
end
m=inv(A)*g';
syms t
for i=2:4
a(i)=m(i-1)/(6*h(i));
b(i)=m(i)/(6*h(i));
c(i)=(y(i-1)-m(i-1)*h(i)^2/6)/h(i);
d(i)=(y(i)-m(i)*h(i)^2/6)/h(i);
end
t1=0:0.01:1;
t2=1:0.01:4;
t3=4:0.01:5;
plot(t1,fthreesample(m,x,y,h,2,t1))
hold on
plot(t2,fthreesample(m,x,y,h,3,t2))
plot(t3,fthreesample(m,x,y,h,4,t3))
function f=fthreesample(m,x,y,h,k,t)
%
for i=2:4
a(i)=m(i-1)/(6*h(i));
b(i)=m(i)/(6*h(i));
c(i)=(y(i-1)-m(i-1)*h(i)^2/6)/h(i);
d(i)=(y(i)-m(i)*h(i)^2/6)/h(i);
end
f=a(k)*(x(k)-t).^3+b(k)*(t-x(k-1)).^3+c(k)*(x(k)-t)+d(k)*(t-x(k-1))
插值結(jié)果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-503335.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-503335.html
到了這里,關(guān)于三次樣條插值算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!