资源简介
三次样条插值(简称Spline插值)是通过一系列形值点的一条光滑曲线,数学上通过求解三弯矩方程组得出曲线函数组的过程。本资源提供了三次样条插值的C语言工程实现程序,供大家学习参考。
![](http://www.nz998.com/pic/65685.jpg)
代码片段和文件信息
/* 三次样条插值计算算法 */
#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
相关资源
- C++中头文件与源文件的作用详解
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- 个人日常财务管理系统(C语言)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- C语言实现的一个内存泄漏检测程序
- DES加密算法C语言实现
- LINUX下命令行界面的C语言细胞游戏
- 用单片机控制蜂鸣器播放旋律程序(
- 学校超市选址问题(数据结构C语言版
- 电子时钟 有C语言程序,PROTEUS仿真图
- 尚观培训linux许巍老师关于c语言的课
- 算符优先语法分析器(C语言编写)
- 基于C语言的密码锁程序
评论
共有 条评论