在对单个变量的函数进行插值的情况下,事情相对简单:
def create_basic_polynomial(x_values, i):
def basic_polynomial(x):
divider = 1
result = 1
for j in range(len(x_values)):
if j != i:
result *= (x-x_values[j])
divider *= (x_values[i]-x_values[j])
return result/divider
return basic_polynomial
def create_lagrange_polynomial(x_values, y_values):
basic_polynomials = []
for i in range(len(x_values)):
basic_polynomials.append(create_basic_polynomial(x_values, i))
def lagrange_polynomial(x):
result = 0
for i in range(len(y_values)):
result += y_values[i]*basic_polynomials[i](x)
return result
return lagrange_polynomial
x_values = [0, 2, 3, 5]
y_values = [0, 1, 3, 2]
lag_pol = create_lagrange_polynomial(x_values, y_values)
for x in x_values:
print("x = {:.4f}\t y = {:4f}".format(x,lag_pol(x)))
x = 0.0000 y = 0.000000
x = 2.0000 y = 1.000000
x = 3.0000 y = 3.000000
x = 5.0000 y = 2.000000
但是我们如何实现处理多变量函数的逻辑呢?
Вместо одномерных точек, нужно использовать массивы точек с несколькими координатами, где каждая точка может содержа ть координаты и значение функции в этой точке. Вместо одной переменной x используем массив переменных x.
def create_basic_polynomial(points, i):
def basic_polynomial(x):
divider = 1
result = 1
for j in range(len(points)):
if j != i:
result *= (x[0]-points[j][0])*(x[1]-points[j][1])
divider *= (points[i][0]-points[j][0])*(points[i][1]-points[j][1])
return result/divider
return basic_polynomial
def create_lagrange_polynomial(points):
basic_polynomials = []
for i in range(len(points)):
basic_polynomials.append(create_basic_polynomial(points, i))
def lagrange_polynomial(x):
result = 0
for i in range(len(points)):
result += points[i][2]*basic_polynomials[i](x)
return result
return lagrange_polynomial
points = [(0, 0, 0), (2, 3, 1), (3, 5, 3), (5, 7, 2)]
lag_pol = create_lagrange_polynomial(points)
for point in points:
print("x = {:.4f}, y = {:.4f}, z = {:4f}".format(point[0], point[1], lag_pol((point[0], point[1]))))
Вывод:
x = 0.0000, y = 0.0000, z = 0.000000
x = 2.0000, y = 3.0000, z = 1.000000
x = 3.0000, y = 5.0000, z = 3.000000
x = 5.0000, y = 7.0000, z = 2.000000