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


import math

def f(x):

    return x**4 - x - 1

a = -1.1

b = -0.1

h = 0.1

# Узлы

x = []

current = a

while current <= b + 1e-12:

    x.append(round(current, 10))

    current += h

y = [f(xi) for xi in x]

n = len(x)

# Конечные разности

dy = [y[i+1] - y[i] for i in range(n-1)]

d2y = [dy[i+1] - dy[i] for i in range(n-2)]

d3y = [d2y[i+1] - d2y[i] for i in range(n-3)]

d4y = [d3y[i+1] - d3y[i] for i in range(n-4)]

# Производные

y1 = [0]*n

y2 = [0]*n

# Остаточные члены

R1 = [0]*n

R2 = [0]*n

for i in range(n):

    if i == 0:

        # производные

        y1[i] = (y[1] - y[0]) / h

        y2[i] = (y[2] - 2*y[1] + y[0]) / h**2

        # остатки

        R1[i] = -(1/(2*h)) * d2y[0]

        R2[i] = -(1/(h**2)) * d3y[0]

    elif i == n-1:

        y1[i] = (y[i] - y[i-1]) / h

        y2[i] = (y[i] - 2*y[i-1] + y[i-2]) / h**2

        R1[i] = -(1/(2*h)) * d2y[-1]

        R2[i] = -(1/(h**2)) * d3y[-1]

    else:

        y1[i] = (y[i+1] - y[i-1]) / (2*h)

        y2[i] = (y[i+1] - 2*y[i] + y[i-1]) / h**2

        # для внутренних берем рядом

        if i < len(d2y):

            R1[i] = -(1/(2*h)) * d2y[i]

        if i < len(d3y):

            R2[i] = -(1/(h**2)) * d3y[i]

print(" i     x        y          y'         y''        R1         R2")

print("-"*80)

for i in range(n):

    print(f"{i:2d}  {x[i]:6.2f}  {y[i]:10.6f}  {y1[i]:10.6f}  {y2[i]:10.6f}  {R1[i]:10.6f}  {R2[i]:10.6f}")

# Точные значения

print("\nПроверка:")

print(" i     x        y' точн.    y'' точн.")

for i in range(n):

    exact_y1 = 4*x[i]**3 - 1

    exact_y2 = 12*x[i]**2

    print(f"{i:2d}  {x[i]:6.2f}  {exact_y1:10.6f}  {exact_y2:10.6f}")