资源简介
三次样条插值(简称Spline插值)是通过一系列形值点的一条光滑曲线,数学上通过求解三弯矩方程组得出曲线函数组的过程。本资源提供了三次样条插值的C语言工程实现程序,供大家学习参考。
代码片段和文件信息
/* 三次样条插值计算算法 */
#include “math.h“
#include “stdio.h“
#include “stdlib.h“
/*
N:已知节点数N+1
R:欲求插值点数R+1
x,y为给定函数f(x)的节点值{x(i)} (x(i) P0=f(x0)的二阶导数;Pn=f(xn)的二阶导数
u:存插值点{u(i)} 0<=i<=R
求得的结果s(ui)放入s[R+1] 0<=i<=R
返回0表示成功,1表示失败
*/
int SPL(int Nint Rdouble x[]double y[]double P0double Pndouble u[]double s[])
{
/*声明局部变量*/
double *h; /*存放步长:{hi} 0<=i<=N-1 */
double *a; /*存放系数矩阵{ai} 1<=i<=N ; 分量0没有利用 */
double *c; /*先存放系数矩阵{ci} 后存放{Bi} 0<=i<=N-1 */
double *g; /*先存放方程组右端项{gi} 后存放求解中间结果{yi} 0<=i<=N */
double *af; /*存放系数矩阵{a(f)i} 1<=i<=N ; */
double *ba; /*存放中间结果 0<=i<=N-1*/
double *m; /*存放方程组的解{m(i)} 0<=i<=N ; */
int ik;
double p1p2p3p4;
/*分配空间*/
if(!(h=(double*)malloc(N*sizeof(double)))) exit(1);
if(!(a=(double*)malloc((N+1)*sizeof(double)))) exit(1);
if(!(c=(double*)malloc(N*sizeof(double)))) exit(1);
if(!(g=(double*)malloc((N+1)*sizeof(double)))) exit(1);
if(!(af=(double*)malloc((N+1)*sizeof(double)))) exit(1);
if(!(ba=(double*)malloc((N)*sizeof(double)))) exit(1);
if(!(m=(double*)malloc((N+1)*sizeof(double)))) exit(1);
/*第一步:计算方程组的系数*/
for(k=0;k h[k]=x[k+1]-x[k];
for(k=1;k a[k]=h[k]/(h[k]+h[k-1]);
for(k=1;k c[k]=1-a[k];
for(k=1;k g[k]=3*(c[k]*(y[k+1]-y[k])/h[k]+a[k]*(y[k]-y[k-1])/h[k-1]);
c[0]=a[N]=1;
g[0]=3*(y[1]-y[0])/h[0]-P0*h[0]/2;
g[N]=3*(y[N]-y[N-1])/h[N-1]+Pn*h[N-1]/2;
/*第二步:用追赶法解方程组求{m(i)} */
ba[0]=c[0]/2;
g[0]=g[0]/2;
for(i=1;i {
af[i]=2-a[i]*ba[i-1];
g[i]=(g[i]-a[i]*g[i-1])/af[i];
ba[i]=c[i]/af[i];
}
af[N]=2-a[N]*ba[N-1];
g[N]=(g[N]-a[N]*g[N-1])/af[N];
m[N]=g[N]; /*P110 公式:6.32*/
for(i=N-1;i>=0;i--)
m[i]=g[i]-ba[i]*m[i+1];
/*第三步:求值*/
for(i=0;i<=R;i++)
{
/*判断u(i)属于哪一个子区间,即确定k */
if(u[i]x[N])
{
/*释放空间*/
free(h);
free(a);
free(c);
free(g);
free(af);
free(ba);
free(m);
return 1;
}
k=0;
while(u[i]>x[k+1])
k++;
p1=(h[k]+2*(u[i]-x[k])*pow((u[i]-x[k+1])2)*y[k])/pow(h[k]3);
p2=(h[k]-2*(u[i]-x[k+1])*pow((u[i]-x[k])2)*y[k+1])/pow(h[k]3);
p3=(u[i]-x[k])*pow((u[i]-x[k+1])2)*m[k]/pow(h[k]2);
p4=(u[i]-x[k+1])*pow((u[i]-x[k])2)*m[k+1]/pow(h[k]2);
s[i]=p1+p2+p3+p4;
}
/*释放空间*/
free(h);
free(a);
free(c);
free(g);
free(af);
free(ba);
free(m);
return 0;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4792 2017-10-17 23:31 spline\spline.c
目录 0 2017-10-17 23:32 spline
----------- --------- ---------- ----- ----
4792 2
相关资源
- 基于DSP2812的SVPWM算法C语言编程
- C语言试题库含答案.rar
- C语言课程设计学生成绩管理系统源码
- 分治法解决凸包问题用C语言递归调用
- 178个经典C语言源代码
- LMSE(Ho-Kashyap).rar
- BASIC语言编程初学者手册
- C语言socket编程指南(讲解+)
- JPEG源码(C语言实现)
- STC单片机与si4432C语言程序
- C语言strassen矩阵乘法代码
- 超完美大学C语言期末复习题库,附答
- C语言程序设计实现 雪花飘落
- 杨辉三角形(循环队列的应用C语言描
- c语言编写的超级玛丽
- 单片机常用的C语言程序和继电器备用
- 有效值计算 c语言
- C语言32个关键字九种控制语句34种运算
- 航班信息的查询与检索数据结构课设
- 矩阵相乘的c语言代码
- C语言链表完整代码
- 三维装箱问题C语言代码
- 华南农业大学c语言oj答案
- C语言实现迷宫问题
- C语言复习知识点汇总-计算机二级C语
- 无优先级运算问题C语言
- C语言的机房管理系统
- C51程序设计——打地鼠C语言.rar
- 几种常用的滤波算法C语言filter.c
- 数据结构(C语言版)(第2版)课后习
评论
共有 条评论