拉格朗日插值

数学原理

此处的拉格朗日插值均为多项式插值,固定下节点,多项式立刻确定下来。
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

数值计算方法(一)——插值相关推荐

  1. 插值与多项式逼近的数值计算方法——《数值计算方法》

    <数值计算方法>系列总目录 第一章 误差序列实验 第二章 非线性方程f(x)=0求根的数值方法 第三章 CAD模型旋转和AX=B的数值方法 第四章 插值与多项式逼近的数值计算方法 第五章 ...

  2. 数值计算方法在计算机的应用,数值计算方法在计算机科学中的应用和误差序列实验推荐.doc...

    数值计算方法在计算机科学中的应用和误差序列实验推荐 数值计算方法在计算机科学中的应用和误差序列实验 [摘要]计算数学也叫做数值计算方法或数值分析.主要内容包括代数方程.线性代数方程组.微分方程的数值解 ...

  3. 栅格单元值的选取方法_计算机求解微分方程的六大数值计算方法

    今天介绍关于计算机求解微分方程的六大数值计算的方法. 1.有限元法 有限元方法的基础是变分原理和加权余量法,其基本求解思想是把计算域划分为有限个互不重叠的单元,在每个单元内,选择一些合适的节点作为求解 ...

  4. 【例题+习题】【数值计算方法复习】【湘潭大学】(二)

    第二章:函数基本逼近(一)--插值逼近 目录 第二章:函数基本逼近(一)--插值逼近 写在前面的话 知识点(重点) 拉格朗日插值公式 Neville 插值公式 牛顿插值公式 拉格朗日插值多项式和牛顿插 ...

  5. 【课后习题】数值计算方法期末复习

    目录 写在前面的话 习题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 ...

  6. 曲线拟合的数值方法——《数值计算方法》

    <数值计算方法>系列总目录 第一章 误差序列实验 第二章 非线性方程f(x)=0求根的数值方法 第三章 CAD模型旋转和AX=B的数值方法 第四章 插值与多项式逼近的数值计算方法 第五章 ...

  7. 内德-米德方法——《数值计算方法》

    <数值计算方法>系列总目录 第一章 误差序列实验 第二章 非线性方程f(x)=0求根的数值方法 第三章 CAD模型旋转和AX=B的数值方法 第四章 插值与多项式逼近的数值计算方法 第五章 ...

  8. 高等数值计算方法学习笔记第4章第一部分【数值积分(数值微分)】

    高等数值计算方法学习笔记第4章第一部分[数值积分(数值微分)] 一.数值积分概论 1.数值求积的基本思想(牛-莱公式找不到原函数,用矩形近似) 2.代数精度的概念 1.上述四个公式的代数精度(梯形,左 ...

  9. 数值计算方法python实现

    包括: 泰勒级数展开 差分逼近微分 二分法求解 试位法求解 迭代法求根 牛顿法求根 正割法 贝尔斯托法多项式求跟 多项式回归 牛顿差商插值 拉格朗日插值法 三次样条插值法 二次样条插值法 高斯消元法( ...

  10. 数值计算方法上机c语言编程,数值计算方法上机实验报告.doc-资源下载在线文库www.lddoc.cn...

    <数值计算方法>上机实验报告.doc 华 北 电 力 大 学实 验 报 告实验名称 数值计算方法上机实验 课程名称 数值计算方法 专业班级电力实 08 学生姓名李超然学 号20080100 ...

最新文章

  1. 何为OKR?为何使用OKR?
  2. python从零基础到项目实战怎么样-2018完整Python零基础到项目精通的学习书籍
  3. redis 亿级查询速度_亿级流量系统架构之如何保证百亿流量下的数据一致性(上)...
  4. hutool获取5天前的日期_JavaSE基础:18个Java8处理日期的新花样,肯定没用过!
  5. 吴恩达《序列模型》精炼笔记(2)-- NLP和Word Embeddings
  6. [android笔记]常用的Uri例子
  7. STL 之reverse,reverse_copy,rotate,rotate_copy
  8. 【原创】关于ASP.NET WebForm与ASP.NET MVC的比较
  9. HoloLens开发手记-凝视 Gaze
  10. [codevs] 1098 均分纸牌
  11. 11134 - Fabled Rooks
  12. android课程设计时钟,单片机制作的电子钟(含闹钟功能)课程设计报告
  13. 18th, Oct 端正心态,积蓄实力,等待爆发的一刻
  14. 计算机视觉图像去噪原理,AI笔记: 计算机视觉之图像滤波去噪: 原理、方法和效果比较...
  15. 我们总结了每个技术团队都会遇到的 4 个难题 1
  16. matlab gaot工具箱安装详细说明
  17. 一. Vue项目引入字体(思源黑体)
  18. 康奈尔笔记法(5R笔记法)
  19. 考勤系统需求分析(软件工程)
  20. Android Camera HAL3 - 开篇词

热门文章

  1. 如何验证登录oracle,Oracle登录验证方式详解
  2. mysql创建数据库时使用sql/wordbench使主键(primary key)自增
  3. simpy练习案例(二):不直接控制流程,而是使用事件隐形控制流程 env.event()
  4. Bytecoin节点搭建
  5. pandas切割字符串并保存为新列
  6. mysql.sys_MySQL sys Schema
  7. at java.net.url init,java.net 基本测试
  8. php如何跟踪调试,PHP使用debug_backtrace方法跟踪调试代码调用详解
  9. Python学习 Day4-1 Python3 条件控制、循环语句
  10. HTML5 学习总结(二)——HTML5新增属性与表单元素