#include<stdio.h>

#include<stdlib.h>

#include<math.h>

int cpm_x(double, double*, int);

double res[12] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 };

int main()

{

int i;//在循环中计数

const int n=19;//n为数据个数

int test[12] = {2,4,6,12,16,30,60,110,180,280,400,515};//test为待计算的值

double result;//每一次计算的结果先保存在result内再赋值给res[i]

double * p;

double x[n] = {0.52,3.1,8.0,17.95,28.65,39.62,50.65,78,104.6,156.6,208.6,260.7, 312.5, 364.4,416.3,468,494,507,520};//输入x0-x18的数据

double y[n+2] = {5.28794,9.4,13.84,20.2,24.9,28.44,31.1,35,36.5,36.6,34.6, 31.0,26.34, 20.9,14.8,7.8,3.7,1.5,0.2,1.86548,-0.046115};//输入y0-y18及y'0、y'18

double h[n-1];

double u[n-2];

double g[n];

double a[n-1];//三对角阵中主对角线下方元素

double b[n];//三对角阵中主对角线的元素

double c[n-1];//三对角阵中主对角阵上方元素

double f[n];

double z[n];

double M[n];

double alpha[n];

double Beta[n-1];

for(i=1;i<n;i++)

{

h[i-1]=x[i]-x[i-1];

}

for(i=0;i<n-2;i++)

{

u[i]=h[i]/(h[i]+h[i+1]);

}

g[0]=6/h[0]*((y[1]-y[0])/h[0]-y[n]);

g[n-1]=6/h[n-2]*(y[n+1]-(y[n-1]-y[n-2])/h[n-2]);

for(i=1;i<n-1;i++)

{

g[i]=(6/(h[i-1]+h[i]))*((y[i+1]-y[i])/h[i]-(y[i]-y[i-1])/h[i-1]);

}

//用追赶法解三对角线方程组AM=f,其中M为要解的未知量

//给三对角阵A赋值,并处理下标不一致的问题

for(i=0;i<n;i++)

{

b[i]=2;

}

for(i=0;i<n-2;i++)

{

a[i]=u[i];

}

a[n-2]=1;

c[0]=1;

for(i=1;i<n-1;i++)

{

c[i]=1-u[i-1];

}

for(i=0;i<n;i++)

{

f[i]=g[i];

}

//A=LU分解

Beta[0]=c[0]/b[0];

for(i=1;i<n-1;i++)

{

Beta[i]=c[i]/(b[i]-a[i-1]*Beta[i-1]);

}

alpha[0]=b[0];

for(i=1;i<n;i++)

{

alpha[i]=b[i]-a[i-1]*c[i-1]/alpha[i-1];

}

//解Lz=f

z[0]=f[0]/b[0];

for(i=1;i<n;i++)

{

z[i] = (f[i] - a[i - 1] * z[i - 1]) / alpha[i];

}

//解UM=z

M[n-1]=z[n-1];

for(i=n-2;i>=0;i--)

{

M[i]=z[i]-(Beta[i]*M[i+1]);

}

//通过循环计算每一个测试值的结果并将答案保存到res数组

for(i=0;i<12;i++)

{

int pos=cpm_x(test[i],x,n); //判断x0所在的区间,将i带入三次样条插值函数Si即可得到对应区间的插值函数,再将test[i]的测试数据代入插值函数即可得到对应的插值结果

result=pow((x[pos]-test[i]),3)*M[pos-1]/(6*h[pos-1])+pow((test[i]-x[pos-1]),3)*M [pos]/(6*h[pos-1])+(y[pos-1]-M[pos-1]*pow(h[pos-1],2)/6)*(x[pos]-test[i])/h[pos-1]+(y[pos]-M [pos]*pow(h[pos-1],2)/6)*(test[i]-x[pos-1])/h[pos-1];

res[i]=result;

}

//输出插值结果

for(i=0;i<12;i++)

{

printf("S(%d)=%-12f\t",test[i],res[i]);

if(i%3==2)printf("\n");//每输出三个结果便换行,同时各结果右对齐

}

}

int cpm_x(double x0,double* x,int n)

{

int i;

for(i=0;i<n;i++)//若x0<x[i]则表明x0在当前区间,因此返回i

{

if(x0<x[i])

return i;

else continue;

}

}

插值法(三次样条插值)相关推荐

  1. 【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】

    光滑曲线在数学上的定义是什么?? 原文链接:光滑曲线在数学上的定义是什么? 回答1: 定义:切线随切点的移动而连续转动. 若函数f(x)f(x)f(x)在区间(a,b)(a,b)(a,b)内具有一阶连 ...

  2. 三次样条插值 cubic spline interpolation

    什么是三次样条插值 插值(interpolation)是在已知部分数据节点(knots)的情况下,求解经过这些已知点的曲线, 然后根据得到的曲线进行未知位置点函数值预测的方法(未知点在上述已知点自变量 ...

  3. 数学建模 | MATLAB学习 | 插值 一维插值函数、三次样条插值

    1.一维插值函数 Matlab中有现成的一维插值函数interp1,语法为  y=interp1(x0,y0,x,'method') x0,y0是已知的数据向量,其中x应以升序或者降序排列(所有的插值 ...

  4. 【20220207】【信号处理】三次样条插值原理详解

    方程组的求解本文不做介绍. 一.三次样条插值 1. 定义 三次样条插值(Cublic Spline Interpolation),简称 Spline 插值,是通过一系列样本点的光滑曲线,数学上通过求解 ...

  5. 数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)

    文章目录 摘要(必看) 0 基础概念 什么是插值 插值用途 什么是拟合 插值和拟合的相同点 插值和拟合的不同点 1 常用的基本插值方法 1.1 多项式插值法 1.1.1 拉格朗日多项式插值法 多项式插 ...

  6. python三次样条插值拟合的树行线_数学建模笔记——插值拟合模型(一)

    啊好像距离上次写作又过了七天,啊好像我之前计划的一周两三篇,啊辣鸡小说毁我青春,啊我是一只可怜的鸽子. 不管怎样,我又回来了,并坚定地更新着hhh.再过两三天就是我们学校数学建模选拔,再过八九天就是期 ...

  7. 数学建模十大算法02—插值与拟合(拉格朗日插值、三次样条插值、线性最小二乘法……)

    文章目录 引入 一.插值 1.1 分段线性插值 1.2 牛顿插值法 1.3 拉格朗日插值多项式 1.4 样条插值 1.4.1 三次样条插值 1.5 二维插值 1.5.1 插值节点为网格节点 1.5.2 ...

  8. 清风数学建模学习笔记——应用matlab实现分段三次埃尔米特(Hermite)插值与三次样条插值

    插值算法   数模比赛中,常常需要根据已知的函数点进行数据.模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,模拟产生一些新的但又比较靠谱的值来满足需求 ...

  9. 轨迹生成--三次样条插值

    三次样条函数插值(Cubic spline function interpolation)   对于样条概念解释得很好 三次样条插值算法C++实现 开源项目推荐:我个人中意的Python/C++数学库 ...

  10. python 插值_三次样条插值在Python中的实现

    什么是三次样条插值 三次样条插值(Cubic Spline Interpolation)简称Spline插值,是通过一系列形值点的一条光滑曲线,数学上通过求解三弯矩方程组得出曲线函数组的过程. 实际计 ...

最新文章

  1. 状态栏消息提示——使用Notification
  2. oracle10g_vista_,Vista系统 安装Oracle10g 不成功?
  3. ubuntu安装配置elasticSearch(vagrant)
  4. 比dropout更好的方法_经营公司有更好的方法
  5. 字节跳动:高级人才的五个基本素质
  6. 经典查找算法及其Python实现
  7. 使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像)
  8. 暑期训练第四次团队赛
  9. 微信公众号H5之微信分享常见错误和问题(the permission value is offline verifying)
  10. Python win32gui.ShowWindow() 窗口没弹出来解决方法
  11. android 自动亮屏解锁,android锁屏唤醒并解锁屏幕实现方法
  12. 年薪5w和50w的职场人思考力有什么区别
  13. 2018年11月25日ICPC焦作站参赛总结
  14. 游戏开发 - 开发流程 - 收集
  15. 前端知识点整理(待续)
  16. Java——API(接口)
  17. Linux ARM平台开发系列讲解(TTY) 2.5.2 串口TTY子系统驱动源码分析
  18. 微信小程序开发【前端+后端(Java)】附完整源码,拿来接私活简直不要太香
  19. gnuradio的安装以及安装常见错误
  20. 刘德华要我做地下夫人 喻可欣说刘德华不是负心汉(图)

热门文章

  1. buuctf-misc部分wp(更新一下)
  2. html格式kindle能看吗,Kindle Voyage支持哪些文本格式
  3. AutoCAD二次开发_从入门到放弃
  4. Python数据分析:数据可视化案例
  5. Unity3D关于iTween知识详解和接口总结
  6. Cesium的坐标拾取
  7. Xposed模拟位置
  8. win10商店游戏存档修改
  9. 广东开放大学形考任务保险学原理(本,2022春)形考三答案
  10. 计算机中三大总线:地址总线、数据总线、控制总线