用三次样条插值求离散点斜率 matlab程序
本帖最后由 shouce 于 2015-10-29 14:13 编辑用三次样条插值求斜率 三次样条插值的matlabt程序
function x=followup(a,b,c,d)n=length(d);
a(1)=0;
%“追”的过程
L(1)=b(1);
y(1)=d(1)/L(1);
u(1)=c(1)/L(1);
for i=2:(n-1)
L(i)=b(i)-a(i)*u(i-1);
y(i)=(d(i)-y(i-1)*a(i))/L(i);
u(i)=c(i)/L(i);
end
L(n)=b(n)-a(n)*u(n-1);
y(n)=(d(n)-y(n-1)*a(n))/L(n);
%“赶”的过程
x(n)=y(n);
for i=(n-1):-1:1
x(i)=y(i)-u(i)*x(i+1);
end
function=spline3 (x,y,x0)
%x,y为数表x0为插值点s表示插值函数y0为x0对应的插值函数值
syms t
n=length(x);
%得出n
for i=1:n-1;
h(i)=x(i+1)-x(i);
end
for i=2:n-1;
lamda(i)=h(i)/(h(i-1)+h(i));
miu(i)=1-lamda(i);
g(i)=3*(lamda(i)*((y(i)-y(i-1))/h(i-1))+miu(i)*((y(i+1)-y(i))/h(i)));
end
g(1)=3*((y(2)-y(1))/h(1));
g(n)=3*((y(n)-y(n-1))/h(n-1));
%前边求出lamda miu和g从而可以确定系数矩阵
miu(1)=1;
miu(4)=0;
lamda(n)=1;
lamda(1)=0;
%根据第二边界条件补充两个lamda和miu的值
for i=1:n
beta(i)=2;
end
m=followup(lamda,beta,miu,g)
%解出m的值从而可确定st st为各段的插值多项式
for i=1:n-1
st(i)=(t-x(i+1))^2*(h(i)+2*(t-x(i)))*y(i)/(h(i)^3)...
+(t-x(i))^2*(h(i)+2*(x(i+1)-t))*y(i+1)/(h(i)^3)...
+(t-x(i))^2*(t-x(i+1))*m(i+1)/(h(i)^2)...
+(t-x(i+1))^2*(t-x(i))*m(i)/(h(i)^2);
end
%得到插值的结果各段的t的表达式
%接下来要将插值点x0代入首先确定x0所在的插值区间
for i=1:n-1
if (x(i)>x0)
in=i;
end
end
s=st(in);
s=expand(s);
s=collect(s,'t');
y0=subs(s,'t',x0)
%s是插值多项式y0是插值点的函数值
在matlab中输入
x=;y=;spline3(x,y,2)
会得到各点的斜率
页:
[1]