@Ledruid提出的解决方案是最优的。它不需要2维数组。分化差异树就像2D数组。更原始的方式(从@可以获得Leudruid算法)正在考虑一个“矩阵$ F_ {IJ} $对应的树的节点。这样的算法将是。
import numpy as np
from numpy import *
def coeficiente(x,y) :
''' x: absisas x_i
y : ordenadas f(x_i)'''
x.astype(float)
y.astype(float)
n = len(x)
F = zeros((n,n), dtype=float)
b = zeros(n)
for i in range(0,n):
F[i,0]=y[i]
for j in range(1, n):
for i in range(j,n):
F[i,j] = float(F[i,j-1]-F[i-1,j-1])/float(x[i]-x[i-j])
for i in range(0,n):
b[i] = F[i,i]
return np.array(b) # return an array of coefficient
def Eval(a, x, r):
''' a : retorno de la funcion coeficiente()
x : abcisas x_i
r : abcisa a interpolar
'''
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
那MATLAB代码非常糟糕('for'循环遍历所有地方而不是向量化),但是通过将大部分'()'s改为'[]'s(用于索引),您可以将它变成类似可怕的numpy代码,并且使索引从0到'n-1'而不是1到'n'。 – Dougal 2013-02-12 01:40:09
这是我室友的书。 – Scrubatpython 2013-02-12 01:44:35