如何对多变量函数使用拉格朗日插值多项式?

问题描述 投票:0回答:1

在对单个变量的函数进行插值的情况下,事情相对简单:

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

但是我们如何实现处理多变量函数的逻辑呢?

python machine-learning math interpolation
1个回答
0
投票

Вместо одномерных точек, нужно использовать массивы точек с несколькими координатами, где каждая точка может содержа ть координаты и значение функции в этой точке. Вместо одной переменной 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
© www.soinside.com 2019 - 2024. All rights reserved.