数值计算方法(一)——插值
拉格朗日插值
数学原理
此处的拉格朗日插值均为多项式插值,固定下节点,多项式立刻确定下来。
n+1个互异节点满足插值条件的n次拉格朗日插值多项式为:
代码实现
算法实现过程:
1.获取节点个数
2.将节点的x和y存入两个数组中
3.在进行拉格朗日插值中,利用两层循环,外循环累加每一项lk(x)的的值,内循环计算各项lk(x)的值(i!=j时进行累乘)
#include<iostream>
#include<stdlib.h>
using namespace std;float x[10];
float y[10];
int count;void load_data()
{cout<<"the count is";cin>>count;for(int i=0;i<count;i++){cin>>x[i]>>y[i];cout<<"\n";}
}void print_data()
{for(int i=0;i<count;i++){cout<<"x is "<<x[i]<<" y is "<<y[i]<<'\n';}
}float Lagrange_interpolation(float value_x)
{float sum_all=0;float sum_single;for (int i=0;i<count;i++){sum_single=y[i];for(int j=0;j<count;j++){if(i==j)continue;else{sum_single*=(value_x-x[j])/(x[i]-x[j]);}}//cout<<"the sum_single is "<<sum_single<<endl;sum_all+=sum_single;}return sum_all;
}void main()
{float value_x;float result;load_data();print_data();cout<<"please input the value_x ";cin>>value_x;result=Lagrange_interpolation(value_x);cout<<"the output is "<<result;system("pause");
}
埃特金插值
数学原理
采用逐次线性插值的方法,可以灵活地增加插值节点,且具有所谓的“承袭性”
上图即为原理图,每一次新增的插值都是采用线性插值,即取两个节点。
举例:
得到的表达式将与拉格朗日插值相同。
特点:
1.将一个高次插值过程归结为线性插值的多次重复
2.埃特金插值表中的每个数据均可视为差值结果;这些数据的一致程度即可判断差值结果的精度
3.可以逐行生成插值表,每做一步便检查一下计算结果的精度,如不满足精度,则增加一个节点再算,直到满足精度为止
4.在插值节点较多的情况下,可以降低插值次数
代码实现
1.建立了数组node用于存放节点的x坐标,建立数组result用于存放不同阶数的插值,为一个三角矩阵
2.数组result的存放格式为:行代表的是插值的阶数,列代表的是对应阶数的不同的插值项
3.具体的计算逻辑见Aitken_interpolation(float x),主要是找前一阶的插值(首项以及对应项),前一阶的插值找到后就可以找到对应的节点值
#include <iostream>
#include <stdlib.h>
using namespace std;int count;
float result[10][10];
float node[10];void Load_data()
{cout<<"please input the count ";cin>>count;cout<<"input the node and result"<<endl;for(int i=0;i<count;i++){cin>>node[i]>>result[0][i];cout<<endl;}
}void Print_result()
{for (int i=0;i<count;i++){for (int j=0;j<count;j++){cout<<result[i][j]<<" ";}cout<<endl;}
}void Aitken_interpolation(float x)
{for (int i=1;i<count;i++){for (int j=i;j<count;j++){result[i][j]=result[i-1][j]*(x-node[i-1])/(node[j]-node[i-1])+result[i-1][i-1]*(x-node[j])/(node[i-1]-node[j]);}}
}void main()
{float x;Load_data();cout<<"please input the value_x ";cin>>x;Aitken_interpolation(x);Print_result();system("pause");
}
PS:如何实现尾部插入不需全部重新计算?
牛顿插值
数学原理
差商的定义:
一阶:
二阶:
n阶差商:
差商表:
建立差商表后,利用差商的定义式进行递推:
最后留出余项:
可以发现,实际用到的各阶差商值为差商表中的对角线项。
代码实现
1.建立两个数组,数组node代表节点的x值,二维数组quotient_table代表的是各阶的差商的表
2.差商表的每一行代表的是阶数,每一列代表的是同一阶数的不同项的差商
3.在计算差商时,需要找到上一阶的差商值(即上一阶的同列以及上一列),也要找到节点(一个节点的索引为该列序号,另一个节点索引应为该列序号减去阶数),具体见Build_quotient_table()
4.实现牛顿插值时,使用temp_x作为中间变量对(x-xi)的累乘进行保存,减少计算次数
#include <iostream>
#include <stdlib.h>
using namespace std;int count;
float quotient_table[10][10];
float node[10];void Load_Data()
{cout<<"please input the count ";cin>>count;cout<<"\nplease input the node and zero order of quotient"<<endl;for (int i=0;i<count;i++){cin>>node[i]>>quotient_table[0][i];cout<<endl;}
}void Print_quotient_table()
{for (int i=0;i<count;i++){for (int j=0;j<count;j++){cout<<quotient_table[i][j]<<" ";}cout<<endl;}
}/**@name Build_quotient_table:建立差商表*@return none
*/
void Build_quotient_table()
{for (int i=1;i<count;i++){for (int j=i;j<count;j++){//二维数组每一行i对应的是i阶差商,每一列j对应的是在该阶差商中的不同项之间的差商quotient_table[i][j]=(quotient_table[i-1][j]-quotient_table[i-1][j-1])/(node[j]-node[j-i]);}}
}/**@name Newton_interpolation:利用牛顿插值进行计算*@param x:变量x*@return:牛顿插值得到的结果
*/
float Newton_interpolation(float x)
{float sum=0;float temp_x=1;for (int i=0;i<count;i++){sum+=temp_x*quotient_table[i][i];temp_x*=(x-node[i]);}return sum;
}void main()
{Load_Data();Build_quotient_table();Print_quotient_table();cout<<"the result is "<<Newton_interpolation(0.596)<<endl;system("pause");
}
可以参考一下别人的代码(没有通过数组去保存,直接迭代):https://blog.csdn.net/weixin_43242836/article/details/90813652
数值计算方法(一)——插值相关推荐
- 插值与多项式逼近的数值计算方法——《数值计算方法》
<数值计算方法>系列总目录 第一章 误差序列实验 第二章 非线性方程f(x)=0求根的数值方法 第三章 CAD模型旋转和AX=B的数值方法 第四章 插值与多项式逼近的数值计算方法 第五章 ...
- 数值计算方法在计算机的应用,数值计算方法在计算机科学中的应用和误差序列实验推荐.doc...
数值计算方法在计算机科学中的应用和误差序列实验推荐 数值计算方法在计算机科学中的应用和误差序列实验 [摘要]计算数学也叫做数值计算方法或数值分析.主要内容包括代数方程.线性代数方程组.微分方程的数值解 ...
- 栅格单元值的选取方法_计算机求解微分方程的六大数值计算方法
今天介绍关于计算机求解微分方程的六大数值计算的方法. 1.有限元法 有限元方法的基础是变分原理和加权余量法,其基本求解思想是把计算域划分为有限个互不重叠的单元,在每个单元内,选择一些合适的节点作为求解 ...
- 【例题+习题】【数值计算方法复习】【湘潭大学】(二)
第二章:函数基本逼近(一)--插值逼近 目录 第二章:函数基本逼近(一)--插值逼近 写在前面的话 知识点(重点) 拉格朗日插值公式 Neville 插值公式 牛顿插值公式 拉格朗日插值多项式和牛顿插 ...
- 【课后习题】数值计算方法期末复习
目录 写在前面的话 习题1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 习题2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 ...
- 曲线拟合的数值方法——《数值计算方法》
<数值计算方法>系列总目录 第一章 误差序列实验 第二章 非线性方程f(x)=0求根的数值方法 第三章 CAD模型旋转和AX=B的数值方法 第四章 插值与多项式逼近的数值计算方法 第五章 ...
- 内德-米德方法——《数值计算方法》
<数值计算方法>系列总目录 第一章 误差序列实验 第二章 非线性方程f(x)=0求根的数值方法 第三章 CAD模型旋转和AX=B的数值方法 第四章 插值与多项式逼近的数值计算方法 第五章 ...
- 高等数值计算方法学习笔记第4章第一部分【数值积分(数值微分)】
高等数值计算方法学习笔记第4章第一部分[数值积分(数值微分)] 一.数值积分概论 1.数值求积的基本思想(牛-莱公式找不到原函数,用矩形近似) 2.代数精度的概念 1.上述四个公式的代数精度(梯形,左 ...
- 数值计算方法python实现
包括: 泰勒级数展开 差分逼近微分 二分法求解 试位法求解 迭代法求根 牛顿法求根 正割法 贝尔斯托法多项式求跟 多项式回归 牛顿差商插值 拉格朗日插值法 三次样条插值法 二次样条插值法 高斯消元法( ...
- 数值计算方法上机c语言编程,数值计算方法上机实验报告.doc-资源下载在线文库www.lddoc.cn...
<数值计算方法>上机实验报告.doc 华 北 电 力 大 学实 验 报 告实验名称 数值计算方法上机实验 课程名称 数值计算方法 专业班级电力实 08 学生姓名李超然学 号20080100 ...
最新文章
- 何为OKR?为何使用OKR?
- python从零基础到项目实战怎么样-2018完整Python零基础到项目精通的学习书籍
- redis 亿级查询速度_亿级流量系统架构之如何保证百亿流量下的数据一致性(上)...
- hutool获取5天前的日期_JavaSE基础:18个Java8处理日期的新花样,肯定没用过!
- 吴恩达《序列模型》精炼笔记(2)-- NLP和Word Embeddings
- [android笔记]常用的Uri例子
- STL 之reverse,reverse_copy,rotate,rotate_copy
- 【原创】关于ASP.NET WebForm与ASP.NET MVC的比较
- HoloLens开发手记-凝视 Gaze
- [codevs] 1098 均分纸牌
- 11134 - Fabled Rooks
- android课程设计时钟,单片机制作的电子钟(含闹钟功能)课程设计报告
- 18th, Oct 端正心态,积蓄实力,等待爆发的一刻
- 计算机视觉图像去噪原理,AI笔记: 计算机视觉之图像滤波去噪: 原理、方法和效果比较...
- 我们总结了每个技术团队都会遇到的 4 个难题 1
- matlab gaot工具箱安装详细说明
- 一. Vue项目引入字体(思源黑体)
- 康奈尔笔记法(5R笔记法)
- 考勤系统需求分析(软件工程)
- Android Camera HAL3 - 开篇词
热门文章
- 如何验证登录oracle,Oracle登录验证方式详解
- mysql创建数据库时使用sql/wordbench使主键(primary key)自增
- simpy练习案例(二):不直接控制流程,而是使用事件隐形控制流程 env.event()
- Bytecoin节点搭建
- pandas切割字符串并保存为新列
- mysql.sys_MySQL sys Schema
- at java.net.url init,java.net 基本测试
- php如何跟踪调试,PHP使用debug_backtrace方法跟踪调试代码调用详解
- Python学习 Day4-1 Python3 条件控制、循环语句
- HTML5 学习总结(二)——HTML5新增属性与表单元素