详解Python牛顿插值法


Posted in Python onMay 11, 2021

一、牛顿多项式

拉格朗日多项式的公式不具备递推性,每个多项式需要单独构造。但很多时候我们需要从若干个逼近多项式选择一个。这个时候我们就需要一个具有递推关系的方法来构造——牛顿多项式

详解Python牛顿插值法

这里的的a0,a1…等可以通过逐一带入点的值来求得。但是当项数多起来时,会发现式子变得很大,这个时候我们便要引入差商的概念(利用差分思想)具体见式子能更好理解

详解Python牛顿插值法
详解Python牛顿插值法

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

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 np


def 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 a


def newton(x, y, _x):
    a = difference_quotient(x, y)
    n = len(x)
    s = a[n-1][n-1]
    j = n-2
    while j >= 0:
        s = np.polyadd(np.polymul(s, np.poly1d(
            [x[j]], True)), np.poly1d([a[j][j]]))
        j -= 1
    for 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_err
    real_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()

到此这篇关于详解Python牛顿插值法的文章就介绍到这了,更多相关Python牛顿插值法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现对PPT文件进行截图操作的方法
Apr 28 Python
Python基于Tkinter的HelloWorld入门实例
Jun 17 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
python多任务及返回值的处理方法
Jan 22 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
基于python解线性矩阵方程(numpy中的matrix类)
Oct 21 Python
Python sys模块常用方法解析
Feb 20 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
pymongo insert_many 批量插入的实例
Dec 05 Python
Python中使用subprocess库创建附加进程
有趣的二维码:使用MyQR和qrcode来制作二维码
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
Python批量将csv文件转化成xml文件的实例
python基础之爬虫入门
python设置 matplotlib 正确显示中文的四种方式
提取视频中的音频 Python只需要三行代码!
You might like
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
JavaScript 字符串连接性能优化
2008/12/20 Javascript
JS 字符串连接[性能比较]
2009/05/10 Javascript
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
Angularjs 基础入门
2014/12/26 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
JavaScript字符串对象
2017/01/14 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
jquery实现下载图片功能
2019/07/18 jQuery
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
Python完全新手教程
2007/02/08 Python
python重试装饰器示例
2014/02/11 Python
Python学习笔记(二)基础语法
2014/06/06 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
python中字符串内置函数的用法总结
2018/09/13 Python
Python线程threading模块用法详解
2020/02/26 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
城市规划应届生推荐信
2014/09/08 职场文书
2014年公务员工作总结
2014/11/18 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
CSS3实现指纹特效代码
2022/03/17 HTML / CSS