插值法(三次样条插值)
#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;
}
}
插值法(三次样条插值)相关推荐
- 【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】
光滑曲线在数学上的定义是什么?? 原文链接:光滑曲线在数学上的定义是什么? 回答1: 定义:切线随切点的移动而连续转动. 若函数f(x)f(x)f(x)在区间(a,b)(a,b)(a,b)内具有一阶连 ...
- 三次样条插值 cubic spline interpolation
什么是三次样条插值 插值(interpolation)是在已知部分数据节点(knots)的情况下,求解经过这些已知点的曲线, 然后根据得到的曲线进行未知位置点函数值预测的方法(未知点在上述已知点自变量 ...
- 数学建模 | MATLAB学习 | 插值 一维插值函数、三次样条插值
1.一维插值函数 Matlab中有现成的一维插值函数interp1,语法为 y=interp1(x0,y0,x,'method') x0,y0是已知的数据向量,其中x应以升序或者降序排列(所有的插值 ...
- 【20220207】【信号处理】三次样条插值原理详解
方程组的求解本文不做介绍. 一.三次样条插值 1. 定义 三次样条插值(Cublic Spline Interpolation),简称 Spline 插值,是通过一系列样本点的光滑曲线,数学上通过求解 ...
- 数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)
文章目录 摘要(必看) 0 基础概念 什么是插值 插值用途 什么是拟合 插值和拟合的相同点 插值和拟合的不同点 1 常用的基本插值方法 1.1 多项式插值法 1.1.1 拉格朗日多项式插值法 多项式插 ...
- python三次样条插值拟合的树行线_数学建模笔记——插值拟合模型(一)
啊好像距离上次写作又过了七天,啊好像我之前计划的一周两三篇,啊辣鸡小说毁我青春,啊我是一只可怜的鸽子. 不管怎样,我又回来了,并坚定地更新着hhh.再过两三天就是我们学校数学建模选拔,再过八九天就是期 ...
- 数学建模十大算法02—插值与拟合(拉格朗日插值、三次样条插值、线性最小二乘法……)
文章目录 引入 一.插值 1.1 分段线性插值 1.2 牛顿插值法 1.3 拉格朗日插值多项式 1.4 样条插值 1.4.1 三次样条插值 1.5 二维插值 1.5.1 插值节点为网格节点 1.5.2 ...
- 清风数学建模学习笔记——应用matlab实现分段三次埃尔米特(Hermite)插值与三次样条插值
插值算法 数模比赛中,常常需要根据已知的函数点进行数据.模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,模拟产生一些新的但又比较靠谱的值来满足需求 ...
- 轨迹生成--三次样条插值
三次样条函数插值(Cubic spline function interpolation) 对于样条概念解释得很好 三次样条插值算法C++实现 开源项目推荐:我个人中意的Python/C++数学库 ...
- python 插值_三次样条插值在Python中的实现
什么是三次样条插值 三次样条插值(Cubic Spline Interpolation)简称Spline插值,是通过一系列形值点的一条光滑曲线,数学上通过求解三弯矩方程组得出曲线函数组的过程. 实际计 ...
最新文章
- 状态栏消息提示——使用Notification
- oracle10g_vista_,Vista系统 安装Oracle10g 不成功?
- ubuntu安装配置elasticSearch(vagrant)
- 比dropout更好的方法_经营公司有更好的方法
- 字节跳动:高级人才的五个基本素质
- 经典查找算法及其Python实现
- 使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像)
- 暑期训练第四次团队赛
- 微信公众号H5之微信分享常见错误和问题(the permission value is offline verifying)
- Python win32gui.ShowWindow() 窗口没弹出来解决方法
- android 自动亮屏解锁,android锁屏唤醒并解锁屏幕实现方法
- 年薪5w和50w的职场人思考力有什么区别
- 2018年11月25日ICPC焦作站参赛总结
- 游戏开发 - 开发流程 - 收集
- 前端知识点整理(待续)
- Java——API(接口)
- Linux ARM平台开发系列讲解(TTY) 2.5.2 串口TTY子系统驱动源码分析
- 微信小程序开发【前端+后端(Java)】附完整源码,拿来接私活简直不要太香
- gnuradio的安装以及安装常见错误
- 刘德华要我做地下夫人 喻可欣说刘德华不是负心汉(图)