牛顿差商多项式的理解与C++实现
这篇接着上一篇,对牛顿基本插值多项式的理解与代码实现
在拉格朗日插值法中,
一般插值公式为:
其中的每次计算都依赖于全部的插值结点,在增加或减少结点时,必须全部重新计算。(不是特别理解)为了克服这个缺点从而引入了牛顿插值法。
牛顿基本插值多项式的一般公式为:
其中定义:
为零阶差商
为一阶差商
为二阶差商
以此类推。。。
另有公式:
在编程实现的过程中就需要考虑,怎么计算,
可分为定义法和公式法。
- 定义法:基本思路便是先算出一阶差商,然后算出二阶差商,。。。
这样设计必然需要设定一个数组用于存储中间。
- 公式法:利用公式直接计算得到
这样设计的后果很明显,在公式中会有大量乘法运算,速度会比较慢。
下面是代码阶段:
在代码中用quotient_array用于存储所有差商,
quotient_list用于存储从x0开始的差商。
#include<iostream>
#define maxsize 100
using namespace std;
double quotient_array[maxsize][maxsize];
void D_creat_quotient_list(int n,double x[maxsize],double y[maxsize],double quotient_list[maxsize])
{//构造差商表//定义法 占空间但是省时间for(int k=0;k<n;k++){for(int i=0;i<n-k;i++){if(k==0){quotient_array[i][0]=y[i];}else{quotient_array[i][k]=(quotient_array[i+1][k-1]-quotient_array[i][k-1])/(x[i+k]-x[i]);}}quotient_list[k]=quotient_array[0][k];}
}
void F_creat_quotient_list(int n,double x[maxsize],double y[maxsize],double quotient_list[maxsize])
{//构造差商表//公式法 省空间 但是费时间quotient_list[0]=y[0];double temp;for(int k=1;k<n;k++){quotient_list[k]=0;for(int j=0;j<=k;j++){temp = 1;for(int i=0;i<=k;i++){if(i!=j){temp*=(x[j]-x[i]);}}temp = y[j]/temp;quotient_list[k]+=temp ;}}
}double F_interpolitation(int n,double x[maxsize],double y[maxsize],double vx,double result,double quotient_list[maxsize])
{//差商牛顿插值法//两种方法二选一D_creat_quotient_list(n,x,y,quotient_list);//定义法//F_creat_quotient_list(n,x,y,quotient_list);//公式法double temp;result = quotient_list[0];for(int k=1;k<=n;k++){temp=1;for(int i=0;i<k;i++){temp*=(vx-x[i]);}result+=quotient_list[k]*temp;}return result;
}
int main()
{int n;double x[maxsize],y[maxsize],result=0,vx,temp;double quotient_list[maxsize];cin>>n>>vx;for(int i=0;i<n;i++){cin >> x[i] >> y[i];}result=F_interpolitation(n,x,y,vx,result,quotient_list);cout<<result<<endl;return 0;
}
测试样例:
参考:
x | 100 | 121 | 144 | 169 |
10 | 11 | 12 | 13 |
分别用定义法和公式法求的值
定义法:
4
115
100 10
121 11
144 12
169 13
公式法:
4
115
100 10
121 11
144 12
169 13
对比也可以看出速度上是有差距的,一般都用定义法求值。
其中两个函数得到的quotient_list的值相同。
quotient_list | 10 | 0.047619 | -0.00009411 | 0.0000003138 |
牛顿差商多项式的理解与C++实现相关推荐
- 多项式插值与牛顿差商
一.定义 那么多项式插值(牛顿差商公式)被形式化描述为: 其中 二.例子 对于三个点的多项式插值问题,我们可以通过以上的定义计算得到牛顿差商公式的各个系数(红色横线的标记)如下: 再详细点: 那么,得 ...
- 插值MATLAB实现(牛顿差商、插值误差、龙格现象、切比雪夫插值)
牛顿差商 function [c,y] = newtondd(a,b,x) n=length(a); for i=1:nv(i,1)=b(i); end for j=2:nfor i=1:n-j+1v ...
- python牛顿迭代公式_python计算牛顿迭代多项式实例分析
本文实例讲述了python计算牛顿迭代多项式的方法.分享给大家供大家参考.具体实现方法如下: ''' p = evalPoly(a,xData,x). Evaluates Newton's polyn ...
- python 计算牛顿差商,计算并化简牛顿插值多项式
1. 程序 1.1 导入库 import numpy as np import sympy as sy 1.2 函数 def NewtonInt(x_value, y_value):"&qu ...
- 数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)
文章目录 摘要(必看) 0 基础概念 什么是插值 插值用途 什么是拟合 插值和拟合的相同点 插值和拟合的不同点 1 常用的基本插值方法 1.1 多项式插值法 1.1.1 拉格朗日多项式插值法 多项式插 ...
- python计算差商_Python实现牛顿插值法(差商表)
def func(x,y,X,infor=True): list2=[y[0]] # 差商表的对角线的第一个元素始终是y0 count=1 while(True): if len(y)>1: l ...
- 利用均差的牛顿插值法(Newton)
函数f的零阶均差定义为 ,一阶定义均差为: 一般地,函数f 的k阶均差定义为: 或者上面这个式子求的k+1阶均差 利用均差的牛顿插值法多项式为: 简单计算的时候可以观看下面的差商(均差)表: 怎么利用 ...
- [模板]多项式全家桶小记(求逆,开根,ln,exp)
前言 这里的全家桶目前只包括了ln,exp,sqrtln,exp,sqrtln,exp,sqrt.还有一些类似于带余数模,快速幂之类用的比较少的有时间再更,NTTNTTNTT这种前置知识这里不多说. ...
- 多项式:从什么都不知道到门都没入
多项式 单项式:由数字和字母组成的积的代数式称为单项式 多项式:由若干个单项式相加组成的代数式叫做多项式 (废话,这上过初中的人都知道) 一.一元多项式 设\(n\in N^*\),则我们称多项式 \ ...
最新文章
- 企业云桌面-07-安装虚拟机-001-Win701
- java 注册忘记密码操作_Java实战项目(1):swing图书管理系统的登录,注册,找回密码,增删查,个人解析等...
- 彻底掌握Linux文件与目录管理命令?进来看看硬核总结
- PS教程第八课:新建文件
- 9.关于Unicode字符集
- JAVA 简单综合题目 小型公司职工对象
- 力扣—— 224. 基本计算器(困难)
- canvas学习笔记-贝塞尔曲线
- 5个界面效果很炫的JavaScript UI框架
- 手机安装python模块吗_1-Python-非root用户安装Python及Python模块
- 关于lisp的一些资源
- 直播预告 | 端云协同的淘宝机器学习系统
- PTA习题-python 7-4 多个数的最小公倍数
- 2022圣诞节用canvas实现流星雨
- DDR4的特性与电气参数
- 人际关系三维理论(转载)
- 脉冲编码器的工作原理
- MySQL 中事务的实现原理全解析
- 微信小程序实战 (WXSS:小程序版CSS、WXS:小程序版JavaScript)
- 10款超赞的Android智能车机软件