牛顿多项式

拉格朗日多项式的公式不具备递推性,每个多项式需要单独构造。但很多时候我们需要从若干个逼近多项式选择一个。这个时候我们就需要一个具有递推关系的方法来构造——牛顿多项式
这里的的a0,a1…等可以通过逐一带入点的值来求得。但是当项数多起来时,会发现式子变得很大,这个时候我们便要引入差商的概念(利用差分思想)具体见式子能更好理解


这里在编程实现中我们可以推出相应的差商推导方程

d(k,0)=y(k)
d(k,j)=(d(k,j-1)-d(k-1,j-1)) / (x(k)-x(k-j))

例题

【问题描述】考虑[0,3]内的函数y=f(x)=cos(x)。利用多个(最多为6个)节点构造牛顿插值多项式。
【输入形式】在屏幕上依次输入在区间[0,3]内的一个值x*,构造插值多项式后求其P(x*)值,和多个节点的x坐标。
【输出形式】输出牛顿插值多项式系数向量,差商矩阵,P(x*)值(保留6位有效数字),和与真实值的绝对误差(使用科学计数法,保留小数点后6位有数字)。
【样例1输入】
0.8
0 0.5 1
【样例1输出】
-0.429726
-0.0299721
1
1 0 0
0.877583 -0.244835 0
0.540302 -0.674561 -0.429726
0.700998
4.291237e-03
【样例1说明】
输入:x为0.8,3个节点为(k, cos(k)),其中k = 0, 0.5, 1。
输出:
牛顿插值多项式系数向量,表示P2(x)=-0.429726x^2 - 0.0299721x + 1;
3行3列的差商矩阵;
当x
为0.8时,P2(0.8)值为0.700998
与真实值的绝对误差为:4.291237*10^(-3)
【评分标准】根据输入得到的输出准确

ACcode:

C++(后面还有python代码)

/** @Author: csc* @Date: 2021-04-30 08:52:45* @LastEditTime: 2021-04-30 11:57:46* @LastEditors: Please set LastEditors* @Description: In User Settings Edit* @FilePath: \code_formal\course\cal\newton_quo.cpp*/
#include <bits/stdc++.h>
#define pr printf
#define sc scanf
#define for0(i, n) for (i = 0; i < n; i++)
#define for1n(i, n) for (i = 1; i <= n; i++)
#define forab(i, a, b) for (i = a; i <= b; i++)
#define forba(i, a, b) for (i = b; i >= a; i--)
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define int long long
#define pii pair<int, int>
#define vi vector<int>
#define vii vector<vector<int>>
#define vt3 vector<tuple<int, int, int>>
#define mem(ara, n) memset(ara, n, sizeof(ara))
#define memb(ara) memset(ara, false, sizeof(ara))
#define all(x) (x).begin(), (x).end()
#define sq(x) ((x) * (x))
#define sz(x) x.size()
const int N = 2e5 + 100;
const int mod = 1e9 + 7;
namespace often
{inline void input(int &res){char c = getchar();res = 0;int f = 1;while (!isdigit(c)){f ^= c == '-';c = getchar();}while (isdigit(c)){res = (res << 3) + (res << 1) + (c ^ 48);c = getchar();}res = f ? res : -res;}inline int qpow(int a, int b){int ans = 1, base = a;while (b){if (b & 1)ans = (ans * base % mod + mod) % mod;base = (base * base % mod + mod) % mod;b >>= 1;}return ans;}int fact(int n){int res = 1;for (int i = 1; i <= n; i++)res = res * 1ll * i % mod;return res;}int C(int n, int k){return fact(n) * 1ll * qpow(fact(k), mod - 2) % mod * 1ll * qpow(fact(n - k), mod - 2) % mod;}int exgcd(int a, int b, int &x, int &y){if (b == 0){x = 1, y = 0;return a;}int res = exgcd(b, a % b, x, y);int t = y;y = x - (a / b) * y;x = t;return res;}int invmod(int a, int mod){int x, y;exgcd(a, mod, x, y);x %= mod;if (x < 0)x += mod;return x;}
}
using namespace often;
using namespace std;int n;signed main()
{auto polymul = [&](vector<double> &v, double er) {v.emplace_back(0);vector<double> _ = v;int m = sz(v);for (int i = 1; i < m; i++)v[i] += er * _[i - 1];};auto polyval = [&](vector<double> const &c, double const &_x) -> double {double res = 0.0;int m = sz(c);for (int ii = 0; ii < m; ii++)res += c[ii] * pow(_x, (double)(m - ii - 1));return res;};int __ = 1;//input(_);while (__--){double _x, temp;cin >> _x;vector<double> x, y;while (cin >> temp)x.emplace_back(temp), y.emplace_back(cos(temp));n = x.size();vector<vector<double>> a(n, vector<double>(n));int i, j;for0(i, n) a[i][0] = y[i];forab(j, 1, n - 1) forab(i, j, n - 1) a[i][j] = (a[i][j - 1] - a[i - 1][j - 1]) / (x[i] - x[i - j]);vector<double> v;v.emplace_back(a[n - 1][n - 1]);forba(i, 0, n - 2){polymul(v, -x[i]);int l = sz(v);v[l - 1] += a[i][i];}for0(i, n)pr("%g\n", v[i]);for0(i, n){for0(j, n)pr("%g ", a[i][j]);puts("");}double _y =  polyval(v, _x);pr("%g\n", _y);pr("%.6e",fabs(_y-cos(_x)));}return 0;
}

python代码

'''
Author: csc
Date: 2021-04-29 23:00:57
LastEditTime: 2021-04-30 09:58:07
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \code_py\newton_.py
'''
import numpy as npdef difference_quotient(x, y):n = len(x)a = np.zeros([n, n], dtype=float)for i in range(n):a[i][0] = y[i]for j in range(1, n):for i in range(j, n):a[i][j] = (a[i][j-1]-a[i-1][j-1])/(x[i]-x[i-j])return adef newton(x, y, _x):a = difference_quotient(x, y)n = len(x)s = a[n-1][n-1]j = n-2while j >= 0:s = np.polyadd(np.polymul(s, np.poly1d([x[j]], True)), np.poly1d([a[j][j]]))j -= 1for i in range(n):print('%g' % s[n-1-i])for i in range(n):for j in range(n):print('%g' % a[i][j], end=' ')print()_y = np.polyval(s, _x)print('%g' % _y)# re_errreal_y = np.cos(_x)err = abs(_y-real_y)print('%.6e' % err)def main():_x = float(input())x = list(map(float, input().split()))y = np.cos(x)newton(x, y, _x)if __name__ == '__main__':main()

【计算方法】牛顿插值法相关推荐

  1. 利用均差的牛顿插值法(Newton)

    函数f的零阶均差定义为 ,一阶定义均差为: 一般地,函数f 的k阶均差定义为: 或者上面这个式子求的k+1阶均差 利用均差的牛顿插值法多项式为: 简单计算的时候可以观看下面的差商(均差)表: 怎么利用 ...

  2. 拉格朗日插值的优缺点_拉格朗日插值法与牛顿插值法的比较

    第 1 页 共 7 页 拉格朗日插值法与牛顿插值法的比较 [ 摘 要 ] 在生产和科研中出现的函数是多样的.对于一些函数很难找出其解析表达式.即使在某些情况下,可以写出函 数的解析表达式,但由于解析表 ...

  3. 拉格朗日插值的优缺点_拉格朗日插值的优缺点_拉格朗日插值法与牛顿插值法的比较...

    第 1 页 共 7 页 拉格朗日插值法与牛顿插值法的比较 [ 摘 要 ] 在生产和科研中出现的函数是多样的.对于一些函数很难找出其解析表达式.即使在某些情况下,可以写出函 数的解析表达式,但由于解析表 ...

  4. 牛顿法的matlab实现例题,【MATLAB|MATLAB牛顿插值法例题与程序Word版】

    『易坊知识库摘要_MATLAB|MATLAB牛顿插值法例题与程序Word版』x12345678y22.523.324.421.7025.228.524.825.4二.数学原理假设有n+1个不同的节点及 ...

  5. 牛顿插值法 matlab m文件,牛顿插值法matlab程序

    <牛顿插值法matlab程序>由会员分享,可在线阅读,更多相关<牛顿插值法matlab程序(3页珍藏版)>请在人人文库网上搜索. 1.计算方法数值实验报告班级090712学号0 ...

  6. java 多项式拟合最多的项数_牛顿插值法、曲线拟合、多项式拟合

    2020年10月4日研究了一下牛顿插值法,其用途是使用x.y两组数值,根据新的x值返回对应的y值,与TREND.FORECAST函数不同,这种方法可应对非线性数据.其作用类似于图表中的曲线拟合或LIN ...

  7. 2021-01-07 matlab数值分析  插值法 拉格朗日插值法 牛顿插值法

    matlab数值分析  插值法 1 拉格朗日插值法 function yh=lagrange(x,y,xh) n=length(x); m=length(xh); yh=zeros(1,m); for ...

  8. 拉格朗日插值的优缺点_拉格朗日与牛顿插值法的比较

    第 1 页 共 7 页 拉格朗日插值法与牛顿插值法的比较 一. 背景 在工程和科学研究中出现的函数是多种多样的.常常会遇到这样的情况:在某个实际 问题中,虽然可以断定所考虑的函数 ) ( x f 在区 ...

  9. 牛顿插值法及其C++实现

    牛顿插值法 一.背景引入 相信朋友们,开了拉格朗日插值法后会被数学家的思维所折服,但是我想说有了拉格朗日插值法还不够,因为我们每次增加一个点都得重算所有插值基底函数,这样会增加计算量,下面我们引入牛顿 ...

  10. Python03 拉格朗日插值法 牛顿插值法(附代码)

    1.实验结果 (1)在定义的类中设置已知的函数值列表为: (2)在 test.py 中选择 Lagrange 插值法求解: 输入:需求的 y 值对应的 x 值: 输出:所求函数值: (3)选择 New ...

最新文章

  1. 2022-2028年中国液化石油气(LPG)行业投资分析及前景预测报告
  2. Android Handler sendMessage和 sendMessageDelayed的使用
  3. Android/Java 获取一个byte[]的真实编码,用于解决乱码问题
  4. psql:FATAL:数据库“user”不存在
  5. 递归与递推 普通排队问题及带约束条件的排队问题 c代码
  6. Python+MySQL学习笔记(一)
  7. postgres 显示变量_sql - 如何在PostgreSQL查询中声明变量
  8. 如何初始化局部变量c语言_【C语言更新】C语言中如何来定义一个指针,并且对其进行初始化...
  9. qt提升控件之后,编译报错
  10. oracle查询字段嵌套子查询,Oracle通过嵌套子查询连接
  11. 朗读评价语言集锦_干货 | 教师课堂评价规范用语的几点建议,建议收藏!
  12. 一个服务器端和多个客户端消息互发_python:OSError: [WinError 10022] 提供了一个无效的参数...
  13. 拓端tecdat|R语言极值理论:希尔HILL统计量尾部指数参数估计可视化
  14. 2015 多校联赛 ——HDU5302(矩阵快速幂)
  15. 微信小程序事件绑定无效
  16. 18104 练习使用多case解题(3种多case的情况)(c语言或c++)
  17. 思科模拟器交换机的几种配置模式
  18. 计算机网络自顶向下第二章应用层笔记
  19. 中国电子学会-全国青少年机器人技术等级考试标准 (1-6级)
  20. 苹果三代耳机_p360 AirPods Pro 苹果三代耳机

热门文章

  1. 马哥linux的ppt,包合集马哥linux-2016全新专用ppt mysql replication.pdf
  2. 史上最强之《Pyqt》写游戏
  3. 【指南 】北理珠第十届C语言程序设计挑战杯
  4. html中怎么让图片做背景透明背景图片,透明背景图片怎么做?
  5. 5G网络结构核心网侧接口介绍
  6. java开发入行真功夫pdf_Visual C++开发入行真功夫
  7. iTextSharp笔记
  8. java cryptojs_CryptoJS用法
  9. 旧电脑再次起飞 分享一次联想Thinkpad X230黑苹果的完整过程
  10. MySQL基础教程4-SQL基础概念