本文目录一览:
- 1、三次样条插值 C++程序
- 2、三次样条插值用c语言具体怎么做
- 3、三次样条插值计算步骤
- 4、三次样条插值
三次样条插值 C++程序
#includeiostream.h
#includeiomanip.h
#includemath.h
void main()
{
float a[37],b[37];
cout" ""度数"" ""sin(x)值"" ""一阶导值"" ""二阶导值"endl;
for(int i=0;i37;i++)
coutsetw(11)setprecision(3)
10*i
setw(11)setprecision(3)
sin(i*31.4/180)
setw(11)setprecision(3)
cos(i*31.4/180)
setw(11)setprecision(3)
-sin(i*31.4/180)
endl;
cout"一个周期内的积分值:0"endl;
}
三次样条插值用c语言具体怎么做
void SPL(int n, double *x, double *y, int ni, double *xi, double *yi); 是你所要。
已知 n 个点 x,y; x 必须已按顺序排好。要插值 ni 点,横坐标 xi[], 输出 yi[]。
程序里用double 型,保证计算精度。
SPL调用现成的程序。
现成的程序很多。端点处理方法不同,结果会有不同。想同matlab比较,你需 尝试 调用 spline()函数 时,令 end1 为 1, 设 slope1 的值,令 end2 为 1 设 slope2 的值。
三次样条插值计算步骤
三次样条插值在实际中有着广泛的应用,在计算机上也容易实现。下面介绍用计算机求取三样条插值函数S(x)的算法步骤:
(1)输入初始节点离散数据xi,yi(i=0,1,…,n);
(2)依据式(6-46),计算hi=xi-xi-1,λi和Ri(i=1,…,n-1);
(3)根据实际问题,从式(6-49)、式(6-51)和式(6-53)中选择一类对应的边界条件,求取v0,w0,u0,R0,un,vn,wn,Rn;
(4)根据形成的方程组(6-54)的特点,选用追赶法、高斯法等解方程组,求出Mi(i=0,1,2,…,n);
(5)依据式(6-41)、式(6-42),计算插值点的三样条插值函数值和该点的导数值。
三次样条插值
设S(x)满足样本点要求,则只需在每个子区间[ ]上确定1个三次多项式,假设为:
假设有n个点,需要n-1条线描述,每条线四个未知数, 则未知数个数为4(n-1)。显然中间(n-2)个点具有4个约束条件:
两端端点存在约束S( ) = f( ),则约束方程有4(n-2)+2=4(n-1)-2,所以,总的未知数个数比方程个数多两个。所以需要额外的两个约束,于是就有了三种边界条件的插值算法。
S(x) 在 [ ](j=1,2,⋯,n-1)上是三次多项式,于是S"(x)在[ ]上是一次多项式,假设S"(x) 在[ ](j=1,2,⋯,n-1)两端点上的值已知,设
其中
对 进行两次积分可得:
以上是在 上求得的 同理可求 ,将 同时代入两个函数联立方程,可以求得
将 :
求导后得:
同理分别写出 ,联立等式,简化后可得:
在matlab实现时注意:n个点,n-1条线,以上矩阵是由相邻的两条线的微分方程联立而来(一阶连续),因此方程总个数减少了1,矩阵中有n-2个方程。 另外,用matlab实现时需要注意,matlab中下标从1开始,其他语言下标可能从0开始。