Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Численные методы. Учебное пособие для СПО

.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
851 Кб
Скачать

производные. В некоторых случаях применяют гибридные подходы, например, используют метод Ньютона с конечномерными приближениями Якоби (квазиньютоновские методы).

3.1. МЕТОД ПРОСТОЙ ИТЕРАЦИИ (МЕТОД ЯКОБИ)

Метод простой итерации — это один из самых простых итерационных методов решения систем нелинейных уравнений. Система уравнений ( ) = 0 преобразуется к эквивалентному виду = ( ), где — некоторая новая функция. Затем выбирается начальное приближение (0) и последовательно вычисляются новые приближения по формуле:

( +1) = ( ).

Процесс продолжается до тех пор, пока разница между последовательными приближениями не станет меньше заданной точности. Метод простой итерации сходится, если функция является сжимающей, то есть если существует константа

< 1 для всех и такая, что: ‖ ( ) − ( )‖ ≤ ‖ − ‖.

Хотя метод прост в реализации, он может сходиться медленно или вообще не сходиться, если условия сжимаемости не выполнены.

Реализация на языке Python

import matplotlib.pyplot as plt import numpy as np

import math

def newton(F, dF, x1, e): kx = x1 - F(x1)/dF(x1)

31

while abs(kx - x1) > e:

Y1 = lambda x: F(x1)/(x1-kx)*(x-kx) x = np.arange(-1, 1.5, 0.001)

y = list(map(Y1, x)) plt.plot(x, y)

x1 = kx

kx = x1 - F(x1)/dF(x1)

x= np.arange(-1, 1.5, 0.001)

y= list(map(F, x))

y = np.array(y) plt.plot(x, y) plt.show() return F(x1), x1

F = lambda x: x**3 + x + 1 dF = lambda x: 3*x**2 + 1 x0 = 1

e = 0.01

Result = newton(F, dF, x0, e) print('X =', Result[0]) print('F(X) =', Result[1])

Реализация на языке Matlab

function Res = newton2(F, dF, x0, e) kx = x0 - F(x0)/dF(x0);

while abs(kx - x0) > e

Y1FUN = @(x) F(x0)/(x0-kx)*(x-kx); X1 = -1.0:0.001:1.2;

for i = 1:length(X1) Y1(i) = Y1FUN(X1(i)); end

plot(X1, Y1) hold on

x0 = kx;

32

kx = x0 - F(x0)/dF(x0); hold on

end

X = -1.0:0.001:1.2; for i = 1:length(X) Y(i) = F(X(i)); end

plot(X, Y,"LineWidth",4) Res(1) = x0;

Res(2) = F(x0); end

3.2.МЕТОД ЗЕЙДЕЛЯ ДЛЯ СИСТЕМ НЕЛИНЕЙНЫХ УРАВНЕНИЙ

Метод Зейделя является модификацией метода простой итерации и применяется как для линейных, так и для нелинейных систем. Основное отличие заключается в том, что при вычисле-

нии нового значения i( +1) используются уже обновленные значения:

( +1)

, ( +1)

, … , ( +1).

1

2

i−1

Такой подход зачастую ускоряет сходимость. Для системы уравнений = ( ) итерационный процесс выглядит следующим образом:

( +1)

= ( ( +1)

, … , ( +1)

, ( )

… , ( )),

= 1,2, … , .

i

 

1

i−1

i

 

 

Метод Зейделя может сходиться быстрее, чем метод простой итерации, особенно если матрица Якоби системы имеет диагональное преобладание. Однако, как и метод простой итерации,

33

он требует выполнения определенных условий сходимости и может не работать для произвольных нелинейных систем.

Реализация на языке Python

import numpy as np

def seidel_method(F, J_inv, x0, tol=1e-6, max_iter=100): x = x0.copy()

iter_count = 0

for _ in range(max_iter): x_new = x.copy()

for i in range(len(x)):

# Обновляем i-ю компоненту, используя уже обновленные значения

x_new[i] = x[i] - J_inv(x_new)[i] @ np.array([f(x_new) for f in

F])

# Проверка условия сходимости if np.linalg.norm(x_new - x) < tol:

break

x = x_new iter_count += 1

return x, iter_count

# Обратная матрица Якоби (упрощенно, в общем случае нужно вычислять на каждой итерации)

def J_inv(x):

return np.linalg.inv([

34

[2*x[0], 2*x[1]], [1, -1]

])

x0 = np.array([0.5, 0.5]) # Начальное приближение solution, iterations = seidel_method(F, J_inv, x0) print(f"Решение: {solution}, Итераций: {iterations}")

Реализация на языке Matlab

function [x, iter] = seidel_method(F, J_inv, x0, tol, max_iter) x = x0;

iter = 0;

for k = 1:max_iter x_old = x;

for i = 1:length(x)

% Обновляем i-ю компоненту x(i) = x_old(i) - J_inv(x)(i,:) * F(x);

end

% Проверка условия сходимости if norm(x - x_old) < tol

break; end

iter = iter + 1; end

end

% Обратная матрица Якоби (упрощенно)

35

J_inv = @(x) inv([2*x(1), 2*x(2); 1, -1]);

x0 = [0.5; 0.5]; % Начальное приближение tol = 1e-6;

max_iter = 100;

[solution, iterations] = seidel_method(F, J_inv, x0, tol, max_iter); fprintf('Решение: [%f, %f], Итераций: %d\n', solution(1), solution(2), iterations)

3.3. МЕТОД НЬЮТОНА РЕШЕНИЯ СИСТЕМ НЕЛИНЕЙНЫХ УРАВНЕНИЙ

Метод Ньютона (также известный как метод НьютонаРафсона) является одним из самых мощных и быстрых методов решения систем нелинейных уравнений. Он основан на линеаризации системы в окрестности текущего приближения. Для системы ( ) = 0 метод Ньютона использует итерационную формулу:

( +1) = ( ) −1(( ))(( )).

Здесь ( ) — матрица Якоби системы, то есть матрица

частных производных = .

Метод Ньютона обладает квадратичной сходимостью вблизи решения, что означает очень быструю сходимость при хорошем начальном приближении. Однако у метода есть и недостатки: необходимость вычисления матрицы Якоби на каждом шаге (что может быть сложно для сложных систем) и чувствительность к выбору начального приближения. Если начальная точка далека от решения, метод может расходиться или требовать дополнительных модификаций, таких как выбор шага или глобализация.

36

Реализация на языке Python

import numpy as np

def newton_system(F, J, x0, tol=1e-6, max_iter=100):

"""

Решение системы нелинейных уравнений методом Ньютона.

Параметры:

F : функция, возвращающая вектор уравнений F(x) = 0. J : функция, возвращающая матрицу Якоби для F.

x0 : начальное приближение. tol : допустимая погрешность.

max_iter : максимальное число итераций.

Возвращает:

x : найденное решение.

"""

x = x0.copy()

for _ in range(max_iter): F_val = F(x)

J_val = J(x)

#Решаем линейную систему J·Δ = -F delta = np.linalg.solve(J_val, -F_val)

x += delta

#Проверка на сходимость (норма поправки меньше tol) if np.linalg.norm(delta) < tol:

return x

print("Достигнуто максимальное число итераций.") return x

37

Реализация на языке Matlab

function Newton value = fnc(0,2,2) c = 1000000; mean = 0;

for c = 1:c t0 = tic(); fnc(0,2,2);

mean = mean + toc(t0); end

mean = mean/c end

function y = F(x) y = x^2 - 2;

end

function y = F1(x) y = 2*x;

end

function y = fnc(a,b,x0) xn = F(x0);

xn1 = xn - F(xn) / F1(xn); while abs(xn1 - xn) > (10^-5); xn = xn1;

xn1 = xn - F(xn) / F1(xn); end

y = xn1; end

38

Самостоятельная работа

Теоретические вопросы:

1.Что представляют собой системы нелинейных урав-

нений?

2.Чем отличаются системы нелинейных уравнений от линейных?

3.В чем основное достоинство метода простой итера-

ции?

4.По каким критериям выбирают начальное приближение для метода Ньютона?

5.Как влияет форма функции на сходимость метода Зейделя?

6.Может ли метод простой итерации обеспечить точную сходимость?

7.Какова роль матрицы Якоби в методе Ньютона?

8.В каких случаях эффективнее использовать метод Зейделя?

9.Возможны ли расхождения в методе Ньютона при неудачном начальном приближении?

10.Какие требования предъявляет метод Ньютона к гладкости функций?

Практические задания:

1.Реализуйте на Python метод простой итерации для системы уравнений { 2 + 2 = 1, = 0}.

2.Примените метод Ньютона для системы уравнений

{ 2 + 2 = 4, + = 2} с точностью 10−4.

3.Решите систему нелинейных уравнений методом

Зейделя: 2 + 2 = 1, 2 + = 2.

4. Установите связь между выбором начального приближения и скоростью сходимости метода Ньютона.

39

5.Попробуйте применить метод Зейделя к плохо обусловленной системе и проанализируйте результаты.

6.Предложите стратегию улучшения сходимости метода простой итерации путем подбора подходящей формы функции.

7.Напишите код на MATLAB для решения системы нелинейных уравнений методом Ньютона.

8.Оцените влияние размерности системы на эффективность метода Ньютона.

9.Примените гибридный подход (комбинация методов простой итерации и Ньютона) для быстрого нахождения корней.

10.Исследуйте устойчивость метода Зейделя относительно малых изменений входных данных.

40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]