Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2сем / лаб / ЛР-2.docx
Скачиваний:
0
Добавлен:
04.04.2026
Размер:
70.64 Кб
Скачать

1. Импорт библиотек

import numpy as np

  • numpy — библиотека для численных вычислений (работа с массивами, математические функции).

2. Определение функции и численной производной

def func(x):

return (x - np.sqrt(2)) ** 3

def numerical_derivative(f, x, h=1e-5):

return (f(x + h) - f(x - h)) / (2 * h)

  • func(x) — заданная функция f(x)=(x−2)3f(x)=(x−2​)3, корень которой нужно найти (x=2x=2​).

  • numerical_derivative(f, x, h) — вычисляет производную функции f в точке x численно (метод центральных разностей с шагом h).

3. Метод бисекции

def bisection_method(f, l, j, epsilon, max_iter=1000):

calls = 0

for i in range(max_iter):

c = (l + j) / 2

fc = f(c)

calls += 1

if abs(fc) < epsilon:

return c, calls

if f(l) * fc < 0:

j = c

else:

l = c

raise ValueError(f"Метод не сошелся за {max_iter} итераций")

  • Алгоритм:

    1. Делит интервал [l, j] пополам.

    2. Проверяет знак функции в середине интервала (c).

    3. Выбирает подынтервал, где функция меняет знак (условие f(l)⋅f(c)<0f(l)⋅f(c)<0).

    4. Повторяет до достижения точности epsilon или превышения max_iter.

  • calls — счетчик вызовов функции f(x).

4. Метод Ньютона (касательных)

def newton_method(f, z, epsilon, max_iter=1000):

x = z

calls = 0

for i in range(max_iter):

fx = f(x)

calls += 1

if abs(fx) < epsilon:

return x, calls

dfx = numerical_derivative(f, x)

calls += 2 # Учет вызовов в numerical_derivative

if abs(dfx) < 1e-12:

raise ValueError("Производная слишком мала")

x = x - fx / dfx

raise ValueError(f"Метод не сошелся за {max_iter} итераций")

  • Алгоритм:

    1. Использует итерационную формулу: xnew=x−f(x)f′(x)xnew​=xf′(x)f(x)​.

    2. Производная вычисляется численно (numerical_derivative).

    3. Критерий остановки: ∣f(x)∣<ϵ∣f(x)∣<ϵ.

  • calls — учитывает все вызовы f(x) (включая вычисление производной).

5. Параметры задачи

a, b = 1.0, 2.0 # Интервал, содержащий корень √2 ≈ 1.4142

epsilons = [0.01, 0.0001, 0.000001]

exact_root = np.sqrt(2) # Точное значение корня

  • Интервал [a, b] выбран так, чтобы функция имела один корень (22​).

  • epsilons — список точностей для сравнения методов.

6. Сравнение методов

print(f"{'Метод':<15} | {'Точность':<10} | {'Корень':<15} | {'Вызовов':<7} | {'Ошибка':<10}")

print("-" * 70)

for eps in epsilons:

# Метод бисекции

try:

bisect_root, bisect_calls = bisection_method(func, a, b, eps)

bisect_error = abs(bisect_root - exact_root)

print(f"{'Бисекция':<15} | {eps:<10} | {bisect_root:.10f} | {bisect_calls:<7} | {bisect_error:.2e}")

except ValueError as e:

print(f"{'Бисекция':<15} | {eps:<10} | Ошибка: {str(e)}")

# Метод Ньютона

try:

newton_root, newton_calls = newton_method(func, a, eps)

newton_error = abs(newton_root - exact_root)

print(f"{'Ньютон':<15} | {eps:<10} | {newton_root:.10f} | {newton_calls:<7} | {newton_error:.2e}")

except ValueError as e:

print(f"{'Ньютон':<15} | {eps:<10} | Ошибка: {str(e)}")

print("-" * 70)

  • Выводит таблицу с результатами для каждой точности:

    • Найденный корень.

    • Количество вызовов функции.

    • Ошибка (разница с точным значением 22​).

Соседние файлы в папке лаб