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


import math
import numpy as np
import matplotlib.pyplot as plt

EPS = 1e-15
N_MAX = 10**6

def f(x):
    return math.asin(x) / math.sqrt(1 - x**2) - 0.5

def df(x):
    return (1 + x * math.asin(x) / math.sqrt(1 - x**2)) / (1 - x**2)

def bisection(a, b, eps=EPS, n_max=N_MAX):
    fa = f(a)
    fb = f(b)

    if fa * fb > 0:
        raise ValueError("На отрезке [a, b] нет смены знака функции.")

    x_prev = None

    for n in range(1, n_max + 1):
        x = (a + b) / 2
        fx = f(x)

        if abs(fx) < eps:
            return x, n

        if x_prev is not None and abs(fx - f(x_prev)) < eps:
            return x, n

        if fa * fx < 0:
            b = x
            fb = fx
        else:
            a = x
            fa = fx

        x_prev = x

    return x, n_max

def newton(a, b, eps=EPS, n_max=N_MAX):
    x = (a + b) / 2

    for n in range(1, n_max + 1):
        fx = f(x)

        if abs(fx) < eps:
            return x, n

        dfx = df(x)
        if dfx == 0:
            raise ZeroDivisionError("Производная равна нулю.")

        x_new = x - fx / dfx

        if abs(f(x_new)) < eps:
            return x_new, n

        if abs(f(x_new) - fx) < eps:
            return x_new, n

        x = x_new

    return x, n_max

a = -0.5
b = 0.8

root_bis, iter_bis = bisection(a, b)
root_new, iter_new = newton(a, b)

print(f"Метод бисекции: x = {root_bis:.16f}, итераций = {iter_bis}, f(x) = {f(root_bis):.3e}")
print(f"Метод касательных: x = {root_new:.16f}, итераций = {iter_new}, f(x) = {f(root_new):.3e}")

x_vals = np.linspace(a, b, 1000)
y_vals = [f(x) for x in x_vals]

plt.figure(figsize=(10, 6))
plt.plot(x_vals, y_vals, label='f(x)')
plt.axhline(0, color='black', linewidth=1)
plt.scatter(root_bis, f(root_bis), color='red', label=f'Корень ~ {root_bis:.6f}')
plt.grid(True)
plt.legend()
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('График функции варианта 22')
plt.show()