#Barycentric Lagrange補間（Floater-Hormann変形）

import numpy as np

def compute_weights(x_nodes):
    """
    バリセントリック重みを計算
    """
    n = len(x_nodes)
    weights = np.ones(n)
    for i in range(n):
        for j in range(n):
            if i != j:
                weights[i] /= (x_nodes[i] - x_nodes[j])
    return weights

def barycentric_interpolation(x, x_nodes, f_values, weights):
    """
    Barycentric Lagrange補間法を実行
    """
    numerator = 0
    denominator = 0
    
    for i in range(len(x_nodes)):
        if np.isclose(x, x_nodes[i]):  # xが補間点の1つに等しい場合
            return f_values[i]
        weight_term = weights[i] / (x - x_nodes[i])
        numerator += weight_term * f_values[i]
        denominator += weight_term
    
    return numerator / denominator

# テスト用データ
x_nodes = np.array([0, 1, 2, 3])
f_values = np.array([1, 2, 0, 3])

# バリセントリック重みを計算
weights = compute_weights(x_nodes)

# 補間点を指定
x = 1.5
result = barycentric_interpolation(x, x_nodes, f_values, weights)

print(f"補間結果: {result}")
