问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

已知函数值C语言中用三次样条插值求某个点值程序

发布网友 发布时间:2022-05-01 20:47

我来回答

1个回答

热心网友 时间:2022-06-23 03:46

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 的值。

#include
#include

int spline (int n, int end1, int end2,
double slope1, double slope2,
double x[], double y[],
double b[], double c[], double d[],
int *iflag)
{
int nm1, ib, i, ascend;
double t;
nm1 = n - 1;
*iflag = 0;
if (n < 2)
{ /* no possible interpolation */
*iflag = 1;
goto LeaveSpline;
}
ascend = 1;
for (i = 1; i < n; ++i) if (x[i] <= x[i-1]) ascend = 0;
if (!ascend)
{
*iflag = 2;
goto LeaveSpline;
}
if (n >= 3)
{
d[0] = x[1] - x[0];
c[1] = (y[1] - y[0]) / d[0];
for (i = 1; i < nm1; ++i)
{
d[i] = x[i+1] - x[i];
b[i] = 2.0 * (d[i-1] + d[i]);
c[i+1] = (y[i+1] - y[i]) / d[i];
c[i] = c[i+1] - c[i];
}
/* ---- Default End conditions */
b[0] = -d[0];
b[nm1] = -d[n-2];
c[0] = 0.0;
c[nm1] = 0.0;
if (n != 3)
{
c[0] = c[2] / (x[3] - x[1]) - c[1] / (x[2] - x[0]);
c[nm1] = c[n-2] / (x[nm1] - x[n-3]) - c[n-3] / (x[n-2] - x[n-4]);
c[0] = c[0] * d[0] * d[0] / (x[3] - x[0]);
c[nm1] = -c[nm1] * d[n-2] * d[n-2] / (x[nm1] - x[n-4]);
}
/* Alternative end conditions -- known slopes */
if (end1 == 1)
{
b[0] = 2.0 * (x[1] - x[0]);
c[0] = (y[1] - y[0]) / (x[1] - x[0]) - slope1;
}
if (end2 == 1)
{
b[nm1] = 2.0 * (x[nm1] - x[n-2]);
c[nm1] = slope2 - (y[nm1] - y[n-2]) / (x[nm1] - x[n-2]);
}
/* Forward elimination */
for (i = 1; i < n; ++i)
{
t = d[i-1] / b[i-1];
b[i] = b[i] - t * d[i-1];
c[i] = c[i] - t * c[i-1];
}
/* Back substitution */
c[nm1] = c[nm1] / b[nm1];
for (ib = 0; ib < nm1; ++ib)
{
i = n - ib - 2;
c[i] = (c[i] - d[i] * c[i+1]) / b[i];
}
b[nm1] = (y[nm1] - y[n-2]) / d[n-2] + d[n-2] * (c[n-2] + 2.0 * c[nm1]);
for (i = 0; i < nm1; ++i)
{
b[i] = (y[i+1] - y[i]) / d[i] - d[i] * (c[i+1] + 2.0 * c[i]);
d[i] = (c[i+1] - c[i]) / d[i];
c[i] = 3.0 * c[i];
}
c[nm1] = 3.0 * c[nm1];
d[nm1] = d[n-2];
}
else
{
b[0] = (y[1] - y[0]) / (x[1] - x[0]);
c[0] = 0.0;
d[0] = 0.0;
b[1] = b[0];
c[1] = 0.0;
d[1] = 0.0;
}
LeaveSpline:
return 0;
}

double seval (int n, double u,
double x[], double y[],
double b[], double c[], double d[],
int *last)
{
int i, j, k;
double w;
i = *last;
if (i >= n-1) i = 0;
if (i < 0) i = 0;
if ((x[i] > u) || (x[i+1] < u))
{
i = 0;
j = n;
do
{
k = (i + j) / 2;
if (u < x[k]) j = k;
if (u >= x[k]) i = k;
}
while (j > i+1);
}
*last = i;
w = u - x[i];
w = y[i] + w * (b[i] + w * (c[i] + w * d[i]));
return (w);
}

void SPL(int n, double *x, double *y, int ni, double *xi, double *yi)
{
double *b, *c, *d;
int iflag,last,i;
b = (double *) malloc(sizeof(double) * n);
c = (double *)malloc(sizeof(double) * n);
d = (double *)malloc(sizeof(double) * n);
if (!d) { printf("no enough memory for b,c,d\n");}
else {
spline (n,0,0,0,0,x,y,b,c,d,&iflag);
if (iflag==0) printf("I got coef b,c,d now\n"); else printf("x not in order or other error\n");
for (i=0;i<ni;i++) yi[i] = seval(ni,xi[i],x,y,b,c,d,&last);
free(b);free(c);free(d);
};
}

main(){
double x[6]={0.,1.,2.,3.,4.,5};
double y[6]={0.,0.5,2.0,1.6,0.5,0.0};
double u[8]={0.5,1,1.5,2,2.5,3,3.5,4};
double s[8];
int i;
SPL(6, x,y, 8, u, s);
for (i=0;i<8;i++) printf("%lf %lf \n",u[i],s[i]);
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华硕X205TABIOS里launchcsm这个选项怎么找 朋友在一起,本来想着相互花钱不要计较那么多的,结果对方却老是想着比... 别人叫你请他吃东西,那他是不是不讨厌你。算是给你机会吗?? 哪种乌冬面比较好吃 ...膳,你小时候最爱吃那儿的豌豆黄儿。还记得那回我带你去北海吗... 苍梧鸟是什么意思? 右手五指受伤其中小指无名指各截掉一节可评几级伤残 ...桡骨骨折伤残鉴定怎么算呢,是左手的算左手的右手算右手,还是一起算... 工伤伤残鉴定中,对右手左手有区别吗? 车子出了事故,4s店在维修合同上写的交车日期,如果4s店超出预订时间交车... 高分悬赏——数值*近的c语言编程题。题目有关插值知识,数学系高材生请进。 你好!小赢网金银行卡号写错了。人家让我写委托书他给整改银行卡号这样安全吗? 拉格朗日插值公式 C语言 runge C 语言编程 分段抛物线插值 牛顿算法和拉格朗日插值算法的C语言实现 拉格朗日插值法用C语言表示 C语言实现拉格朗日插值法的问题 工程常用算法作业 插值方法 C语言 高分悬赏 求三维数据点C语言插值计算程序 求c语言写的双三次插值函数 用C语言实现拉格朗日插值、牛顿插值、等距结点插值算法 C语言的拉格朗日插值法 数值分析计算实习题关于插值法,用C语言编程 求双线性插值法的C语言程序!帮帮忙!拜托各位了! 用C语言编写一个线性插值程序 求用c语言编写牛顿插值法 c语言中插值排序法怎么打程序 用C语言编一个线性插值的小程序,很着急 牛顿的插值法用C语言怎么编写怎么编啊? 长沙自由简风文化传播有限责任公司怎么样? win10傲腾内存的安装, 一起向未来是什么口号? 我国迈向体育强国有什么历史意义? 谈谈你对体育改革发展的看法 关于国家乒乓球二次创业的口号? 中国是怎么从“东亚病夫”成长到体育强国的? 形容体育健儿爱国的四字词语什么 体育生在选择适合自己的大学时,需要考虑哪些方面? 什么是体育强省 中国成为体育强国了吗 用手机怎样登录邮箱 体育强国的意义是什么? 金丝熊怎么分公母? 糖醋鱼的汁怎么做的 论语十则教案 语文《论语》十则 我的电脑只有一按打印就卡住,并且是用的局域网别的打印机不是本机打印机,如何解决? “你无法访问这台打印机你无法访问这台打印机.只能显示安全选项卡.” 华为打印机访客模式如何关闭 《论语十则》每一则的赏析,七年级上期,人教版。