想用python来求解牛顿插值问题,编了一段程序,其中有些错误看不出来,恳请大佬指出错误,代码如下

def chashang(xi=[],yi=[]):
if len(xi)>2 and len(yi)>2:
return ((chashang(xi[ :len(xi)-1],yi[ :len(yi)-1])-chashang(xi[1:len(xi)],y[1:len(yi)]))/float(xi[0]-xi[-1]))
else:
return (yi[0]-yi[1])/float(xi[0]-xi[1])
def Newtons(i,xi=[]):
def Wi(x):
result=1
for each in range(i):
result*=(x-xi[each])
return result
return Wi
def hanshu(xi=[],yi=[]):
result=yi[0]
for i in range(2,len(xi)):
result+=(chashang(xi[:i],yi[:i]) * Newtons(i-1,xi))
return result
xi=[-28.9,-12.2,4.4,21.1,37.8]
yi=[2.2,3.9,6.6,10.3,15.4]
x=20
g=hanshu(xi,yi)
print("{:.1f}".format(g))

import matplotlib.pyplot as plt
from pylab import mpl
import math
"""
牛顿插值法
插值的函数表为
xi      -28.9, -12.2, 4.4, 21.1,  37.8
f(xi)   2.2,    3.9,     6.6, 10.3, 15.4
"""
x=[-28.9,-12.2,4.4,21.1,37.8]
y=[2.2,3.9,6.6,10.3,15.4]

"""计算4次差商的值"""
def Four_time_difference_quotient(x, y):
    i = 0            # i记录计算差商的次数
    quotient = [0, 0, 0, 0, 0,]
    while i < 4:
        j = 4
        while j > i:
            if i == 0:
                quotient[j]=((y[j]-y[j-1])/(x[j]-x[j-1]))
            else:
                quotient[j] = (quotient[j]-quotient[j-1])/(x[j]-x[j-1-i])
            j -= 1
        i += 1
    return quotient;

def function(data):
    return x[0]+parameters[1]*(data-0.4)+parameters[2]*(data-0.4)*(data-0.55)+\
           parameters[3]*(data-0.4)*(data-0.55)*(data-0.65)\
           +parameters[4]*(data-0.4)*(data-0.55)*(data-0.80)

"""计算插值多项式的值和相应的误差"""
def calculate_data(x,parameters):
    returnData=[];
    for data in x:
        returnData.append(function(data))
    return returnData

"""画函数的图像
newData为曲线拟合后的曲线
"""

def draw(newData):
    plt.scatter(x,y,label="离散数据",color="red")
    plt.plot(x,newData,label="牛顿插值拟合曲线",color="black")
    plt.scatter(0.596,function(0.596),label="预测函数点",color="blue")
    plt.title("牛顿插值法")
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    plt.legend(loc="upper left")
    plt.show()

parameters=Four_time_difference_quotient(x, y)
yuanzu=calculate_data(x,parameters)
draw(yuanzu)

温馨提示:答案为网友推荐,仅供参考
相似回答