import math
def task_variant_2():
# 1. Определение параметров варианта
f = lambda x: x**2 + 4 * math.sin(x) - 1
a, b = 0.3, 1.3
h = 0.1
# Генерация узлов x_i и значений функции y_i
n = int(round((b - a) / h))
x_values = [round(a + i * h, 2) for i in range(n + 1)]
y_values = [f(x) for x in x_values]
y_prime = [0.0] * (n + 1)
y_double_prime = [0.0] * (n + 1)
# 2. Численное дифференцирование
for i in range(n + 1):
if i == 0:
# Начальная точка (Правая разность по формуле 8.2)
y_prime[i] = (y_values[i+1] - y_values[i]) / h
y_double_prime[i] = (y_values[i+2] - 2*y_values[i+1] + y_values[i]) / (h**2)
elif i == n:
# Конечная точка (Левая разность по формуле 8.7)
y_prime[i] = (y_values[i] - y_values[i-1]) / h
y_double_prime[i] = (y_values[i] - 2*y_values[i-1] + y_values[i-2]) / (h**2)
else:
# Внутренние точки (Центральная разность по формуле 8.5)
y_prime[i] = (y_values[i+1] - y_values[i-1]) / (2 * h)
# Вторая производная через центральную разность
y_double_prime[i] = (y_values[i+1] - 2*y_values[i] + y_values[i-1]) / (h**2)
# 3. Вывод результатов
print(f"{'x_i':<10} | {'y_i':<10} | {'y_i_prime':<10} | {'y_i_double_prime':<10}")
print("-" * 50)
for i in range(n + 1):
print(f"{x_values[i]:<10.2f} | {y_values[i]:<10.4f} | {y_prime[i]:<10.4f} | {y_double_prime[i]:<10.4f}")
if __name__ == "__main__":
task_variant_2()