详解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函数中的函数(闭包)用法实例
Mar 15 Python
win与linux系统中python requests 安装
Dec 04 Python
详解使用python crontab设置linux定时任务
Dec 08 Python
python django 访问静态文件出现404或500错误
Jan 20 Python
pandas实现选取特定索引的行
Apr 20 Python
python学习基础之循环import及import过程
Apr 22 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
简单介绍django提供的加密算法
Dec 18 Python
python实现上传文件到linux指定目录的方法
Jan 03 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 Python
python绘图subplots函数使用模板的示例代码
Apr 30 Python
Python中使用subprocess库创建附加进程
有趣的二维码:使用MyQR和qrcode来制作二维码
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
Python批量将csv文件转化成xml文件的实例
python基础之爬虫入门
python设置 matplotlib 正确显示中文的四种方式
提取视频中的音频 Python只需要三行代码!
You might like
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
destoon复制新模块的方法
2014/06/21 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
Python实现豆瓣图片下载的方法
2015/05/25 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
简历中自我评价怎么写
2014/02/12 职场文书
展览会邀请函
2015/02/02 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
教你怎么用Python监控愉客行车程
2021/04/29 Python
详解Redis瘦身指南
2021/05/26 Redis
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS