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))