Как использовать интерполяционный многочлен Лагранжа для функций от многих переменных?
В случае интерполяции функции от одной переменной всё относительно просто:
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
Но как же реализовать логику работы с функциями от многих переменных?
Ответы (1 шт):
Если сетка прямоугольная, т.е. если есть наборы X-ов и Y-ов, а целевые значения известны для каждой пары (x,y) из этих наборов f(X[i],Y[j])=F[i][j], то можно применить следующий подход:
Пусть нам заданы входные параметры (x, y), не из множества X*Y, тогда для каждого x_i из X, с помощью полинома Лагранжа находим значение G[i]=f(X[i],y) используя при этом только те точки целевой функции, которые соответствуют x==X[i], т.е. применим одномерную формулу только для y. Потом, применим одномерную формулу по оси x: используем X- как множество контрольных точек, а G - значения в них.
Пример (простой для понимая, но о-очень плохой по производительности):
def create_lagrange_polynomial_2D(x_values, y_values, f_values):
def lagrange_polynomial(x, y):
G = []
for i in range(len(x_values)):
G.append( create_lagrange_polynomial(y_values, f_values[i])(y) )
return create_lagrange_polynomial(x_values, G)(x)
return lagrange_polynomial
Если использовать обозначения из https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%87%D0%BB%D0%B5%D0%BD_%D0%9B%D0%B0%D0%B3%D1%80%D0%B0%D0%BD%D0%B6%D0%B0 , то после подстановок, можно получить формулу:
Из формулы видно, что вычисления можно сильно оптимизировать, если заранее посчитать полиномы l по каждой оси.
