Ньютоновская интерполяция в python с использованием matplotlib - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу использовать matplotlib, чтобы нарисовать картину интерполяции Ньютона, но я столкнулся с некоторыми трудностями. Моя фигура не доходит до последних нескольких пунктов. Вы можете мне помочь? Если мой код неверен, пожалуйста, сообщите мне детали, спасибо.

import numpy as np
import matplotlib.pyplot as plt


def coef(x, y):
    '''x : array of data points
       y : array of f(x)  '''
    x.astype(float)
    y.astype(float)
    n = len(x)
    a = []
    for i in range(n):
        a.append(y[i])

    for j in range(1, n):

        for i in range(n - 1, j - 1, -1):
            a[i] = float(a[i] - a[i - 1]) / float(x[i] - x[i - j])

    return np.array(a)  # return an array of coefficient


def Eval(a, x, r):
    ''' a : array returned by function coef()
       x : array of data points
       r : the node to interpolate at  '''
    x.astype(float)
    n = len(a) - 1
    temp = a[n]
    for i in range(n - 1, -1, -1):
        temp = temp * (r - x[i]) + a[i]
    return temp  # return the y_value interpolation


if __name__ == '__main__':
    x = np.linspace(0, 20, 11)
    y = np.random.randint(0, 10, 11)
    # y = np.asarray([i ** 2 for i in x])

    a = coef(x, y)
    tmp_x = np.linspace(0, 21, 21)
    tmp_y = [Eval(a, tmp_x, i) for i in tmp_x]

    plt.plot(x, y, linestyle='', marker='o', color='b')
    plt.plot(tmp_x, tmp_y, linestyle='--', color='r')
    plt.show()

изображение кода

1 Ответ

0 голосов
/ 14 ноября 2018

ОК , Я решил свою проблему после прочтения статьи о «Ньютон Интерпролейшн». Но комментарии написаны на китайском , когда у меня будет время, я переведу его на английский. изображение интерполяции Ньютона

import numpy as np
import matplotlib.pyplot as plt


class Newton(object):
def __init__(self, x, y):
    self.x = x
    self.y = y

def run(self, tmp_x):
    # 构造差商表
    table = np.zeros([len(self.x), len(self.x) + 1], dtype=float)

    for i in range(len(self.x)):  # 将x 和 y 放入 差商表的前两列
        table[i][0] = self.x[i]
        table[i][1] = self.y[i]
    # 计算差商
    for i in range(2, table.shape[1]):  # i is 2 to 5
        for j in range(i - 1, table.shape[0]):  # j is
            table[j][i] = (table[j][i - 1] - table[j - 1][i - 1]) / (self.x[j] - self.x[j - i + 1])

    # print(table)  # 输出差商表
    # for i in range(table.shape[0]):
    #     for j in range(table.shape[1]):
    #         print(table[i][j], end=' ')
    #     print('\n')
    # print('\n\n')

    # 由牛顿插值函数求给出的x序列对应的y序列
    tmp_y = []
    for ans_x in tmp_x:  # 遍历每个x
        ans_y = 0  # 对应于输入序列每个x的相应y值
        for i in range(table.shape[0]):
            tmp = table[i][i + 1]  # 求值多项式第 i 项, tab[i][i + 1]为其系数
            for j in range(i):
                tmp *= (ans_x - self.x[j])
            ans_y += tmp
        tmp_y.append(ans_y)
    return tmp_y


if __name__ == '__main__':
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    sr_x = np.linspace(0, 20, 11)
    sr_fx = np.random.randint(0, 20, 11)

    tmp_x = np.linspace(0, 20)

    demo = Newton(sr_x, sr_fx)
    tmp_y = demo.run(tmp_x)

    print(tmp_x)
    print(tmp_y)

    plt.plot(sr_x, sr_fx, 'ro', label='插值节点')
    plt.plot(tmp_x, tmp_y, label='牛顿插值')
    enter code here
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...