Загрузка данных


def my_log(val):
    # Вычисление натурального логарифма через ряд
    t = (val - 1) / (val + 1)
    t2 = t * t
    total = 0.0
    curr = t
    k = 1
    while k < 100:
        total += curr / k
        curr *= t2
        k += 2
    return 2.0 * total

def target_func(x, deg):
    return my_log(x) ** deg

def basis_poly(x_val, idx, nodes_arr):
    # Расчет базисного полинома для текущего узла
    b = 1.0
    for j in range(len(nodes_arr)):
        if j != idx:
            # Проверка: если узлы одинаковые, будет деление на ноль
            b *= (x_val - nodes_arr[j]) / (nodes_arr[idx] - nodes_arr[j])
    return b

# --- Блок ввода ---
deg_val = float(eval(input("Введите степень p (например, 11/2): ")))
nodes_input = input("Введите узлы через пробел (например, 6 7 8): ").split()
nodes_arr = [float(item) for item in nodes_input]
x_point = float(input("Введите точку a (например, 6.5): "))

# --- Проверка на дурака (защита от деления на ноль) ---
if len(nodes_arr) < 2:
    print("Ошибка: нужно ввести минимум 2 узла.")
    exit()
if len(nodes_arr) != len(set(nodes_arr)):
    print("Ошибка: узлы не должны повторяться! Проверьте ввод (например, 6 7 8).")
    exit()

# --- Вычисления ---
approx_val = 0.0  # ВАЖНО: инициализация переменной перед циклом
for i in range(len(nodes_arr)):
    approx_val += target_func(nodes_arr[i], deg_val) * basis_poly(x_point, i, nodes_arr)

exact_val = target_func(x_point, deg_val)

print("\n--- Результаты ---")
print("Истинное значение f(a):", exact_val)
print("Приближенное значение L(a):", approx_val)
print("Абсолютная погрешность:", abs(exact_val - approx_val))