资源简介
计算方法--拉格朗日插值法与线性插值法等方法的c语言代码,附加注释
代码片段和文件信息
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
//拉格朗日插值法计算x处估计值
double lagrange(int ndouble *pxdouble *pydouble x)
{
int ij;
double fn=0.0k;
for(i=0;i<=n;i++)
{
k=1.0;
for(j=0;j<=n;j++)
{
if(j!=i)
k=k*(x-px[j])/(px[i]-px[j]);
else
k=k;
}
fn=fn+py[i]*k;
}
return fn;
}
//分段线性插值
double linear(int ndouble *pxdouble *pydouble x)
{
int i;
double ans=0.0;
for(i=0;i {
if(x>=px[i]&&x<=px[i+1])//判断x的位置
ans=py[i]*(x-px[i+1])/(px[i]-px[i+1])+py[i+1]*(x-px[i])/(px[i+1]-px[i]);//通过x左右节点值估计x处函数值
}
return ans;
}
//三样条插值法
double spline(int ndouble *pxdouble *pydouble x)
{
int i;
double *m*a*bans=0;
m=(double*)malloc(sizeof(double)*(n+10));
a=(double*)malloc(sizeof(double)*(n+10));
b=(double*)malloc(sizeof(double)*(n+10));
m[0]=-2.0;
m[n]=-2.0*exp(-12.0);
a[0]=0;b[0]=0;
for(i=1;i {
a[i]=-0.5/(2.0+0.5*a[i-1]);
b[i]=(n/4.0*(py[i+1]-py[i-1])-0.5*b[i-1])/(2+0.5*a[i-1]);
}
for(i=n-1;i>=0;i--)
{
m[i]=a[i]*m[i+1]+b[i];
}
for(i=0;i {
if(x>px[i]&&x<=px[i+1])
{
ans=py[i]*(1+2*(x-px[i])/(px[i+1]-px[i]))*pow((x-px[i+1])/(px[i]-px[i+1])2)
+py[i+1]*(1+2*(x-px[i+1])/(px[i]-px[i+1]))*pow((x-px[i])/(px[i+1]-px[i])2)
+m[i]*(x-px[i])*pow((x-px[i+1])/(px[i]-px[i+1])2)
+m[i+1]*(x-px[i+1])*pow((x-px[i])/(px[i+1]-px[i])2);
}
}
return ans;
}
//计算差值最大误差
double maxerror(
- 上一篇:用C语言实现稀疏矩阵的三元组转置
- 下一篇:50道c++编程练习题只有题目
评论
共有 条评论