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

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

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

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

function A = MyGauss(A) tic

a = A;

n = size(a,1); for i = 1:n-1

if abs(a(i, i)) < 0.00000001 for k = i + 1:n

if abs(a(k, i)) > 0.00000001 for j = 1:n+1

tmp = a(i, j); a(i, j) = a(k, j); a(k, j) = tmp; end

break

end end end

if abs(a(i, i)) > 0.00000001 for k = i + 1:n

f = -a(k, i) / a(i, i); for j = i:n + 1

a(k, j) = a(k, j) + f * a(i, j); end

end end end for i = n:-1:1

tmp = a(i, n + 1); for k = i + 1:n

tmp = tmp - a(i, k) * a(k, n + 2); end

a(i, n + 2) = tmp / a(i, i); end

21

for i = 1:n disp(a(i, n + 2)); end

toc end

2.2. МЕТОД ОБРАТНОЙ МАТРИЦЫ

Рассматриваемую СЛАУ можно представить в матричном виде как = , где элементы имеют вид:

11

 

1

1

1

 

= (

 

) , = (

) , = (

).

1

 

 

 

 

 

 

 

 

 

 

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

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

import numpy as np import time

def obraMatrMethod():

matrA = np.array([[13,-2,1,-4], [2,0,-3,5], [4,-1,3,9], [7,-5,11,-4]])

matrB = np.array([[8],

22

[-7], [1], [-5]])

for row in matrA: # делаем перебор всех строк матрицы A for elem in row: # перебираем все элементы в строке row print(elem, end = ' ')

print()

det = np.linalg.det(matrA) # Находим детерминанту print('Determinant matrix A = ', np.round(det, 3), '\n') invMatr = np.linalg.inv(matrA) # Обратная матрица print('Inverse matrix A = \n', invMatr, '\n')

print('Result = \n', np.matmul(invMatr, matrB)) # Матричное умножение

start_time = time.time() obraMatrMethod()

print("--- %s seconds ---" % (time.time() - start_time))

2.3. МЕТОД ПРОГОНКИ

Метод прогонки (алгоритм Томаса) — это эффективный алгоритм решения систем линейных уравнений с трехдиагональной матрицей:

1 1 + 1 2 = 12 1 + 2 2 + 2 3 = 2

−1 −2 + −1 −1 + −1 = −1.

{−1 + =

Такую систему можно записать в матричной форме= , где — трехдиагональная матрица. Используется в задачах с дискретизацией дифференциальных уравнений (например, метод конечных разностей для краевых задач. Метод состоит

23

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

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

function x = thomas(a, b, c, d)

%Входные параметры:

%a - поддиагональ [a2, a3, ..., an] (n-1 элементов)

%b - главная диагональ [b1, b2, ..., bn] (n элементов)

%c - наддиагональ [c1, c2, ..., c_{n-1}] (n-1 элементов)

%d - вектор правой части [d1, d2, ..., dn] (n элементов) n = length(b);

alpha = zeros(n-1, 1); beta = zeros(n, 1);

% Прямой ход alpha(1) = -c(1) / b(1); beta(1) = d(1) / b(1);

for i = 2:n-1

denom = a(i-1) * alpha(i-1) + b(i); alpha(i) = -c(i) / denom;

beta(i) = (d(i) - a(i-1) * beta(i-1)) / denom; end

24

beta(n) = (d(n) - a(n-1) * beta(n-1)) / (a(n-1) * alpha(n-1) + b(n));

% Обратный ход x = zeros(n, 1); x(n) = beta(n);

for i = n-1:-1:1

x(i) = alpha(i) * x(i+1) + beta(i); end

end

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

Метод Якоби — это итерационный алгоритм для решения систем линейных уравнений вида = . Он применяется для больших разреженных систем, где прямые методы (например, Гаусса) неэффективны. Основная идея заключается в том, что необходимо разделить матрицу на (сумму) диагональную ( ), нижнюю ( ) и верхнюю ( ) и выразить систему в форме: −1( − ( + ) ( )), где элементы ищутся итерационно по следующей формуле:

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

Итерации прекращаются, когда: ( +1) ( )‖ < или количество итерации превышает заданный максимум.

При выполнении некоторых заранее оговоренных условий процесс сходится при → ∞.

25

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

import math def fun(x):

return x - math.exp(-x) def g(x):

return math.exp(-x) eps=float(0.00001) i=int(1)

x0=float(0.0)

x1=g(x0)

while (i <= 100):

if (abs(x1 - x0) <= eps): break

x0=x1

x1=g(x0) i = i + 1 print(x1) print(i)

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

function x = jacobi(A, b, x0, tol, max_iter)

n = length(b); x = x0;

for k = 1:max_iter x_new = zeros(n, 1); for i = 1:n

x_new(i) = (b(i) - A(i, [1:i-1, i+1:n]) * x([1:i-1, i+1:n])) /

A(i, i);

26

end

if norm(x_new - x) < tol break;

end

x = x_new; end

end

2.5. МЕТОД ЗЕЙДЕЛЯ

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

( +1)

 

 

( − ∑−1

 

( +1)

 

 

 

( )) .

=

 

− ∑

 

 

 

 

 

 

 

=1

 

 

 

 

 

 

 

 

 

 

 

 

 

= +1

 

 

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

function x = gauss_seidel(A, b, x0, tol, max_iter) n = length(b);

x = x0;

for k = 1:max_iter x_old = x;

27

for i = 1:n

sigma1 = A(i,1:i-1)*x(1:i-1); sigma2 = A(i,i+1:n)*x_old(i+1:n); x(i) = (b(i) - sigma1 - sigma2)/A(i,i);

end

if norm(x - x_old) < tol break;

end end

end

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

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

1.В чем различие между прямыми и итерационными методами решения СЛАУ?

2.Когда целесообразно применять метод Гаусса?

3.Опишите основную идею метода обратной матрицы.

4.Какие недостатки характерны для метода обратной матрицы?

5.В каком случае предпочтительнее использовать метод прогонки?

6.Что представляет собой метод простой итерации (метод Якоби)?

7.Укажите достоинства и недостатки метода Зейделя.

8.Почему важна проверка сходимости в итерационных методах?

9.В каких ситуациях лучше использовать метод Гаусса,

ав каких — метод Зейделя?

10.Можно ли решить любую систему линейных уравнений прямым методом?

28

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

1.Реализуйте на Python метод Гаусса для решения си-

стемы 3 + − = 5, 2 − + = −1, + 2 + 3 = 4.

2.Используйте метод обратной матрицы для системы

2 + 3 = 8, − 2 = 1

3.Создайте программу на MATLAB для решения СЛАУ методом прогонки.

4.Исследуйте влияние выбора начального приближения на скорость сходимости метода Якоби.

5.Продемонстрируйте разницу в эффективности метода Зейделя и метода Якоби на примере большой разреженной матрицы.

6.Проанализируйте сходимость метода простой итерации для случайной симметричной положительно определенной матрицы.

7. С помощью метода

Зейделя решите систему

4 + 3 − = 10, 2 − 2 + 3

= 5, + + = 6.

8.Реализуйте параллельный вариант метода Якоби для ускорения счета.

9.Проверьте возможность использования метода прогонки для пятидиагональной матрицы.

10.Разработайте тестовую задачу, демонстрирующую преимущества метода Гаусса перед итерационным методом.

29

3. ЧИСЛЕННЫЕ МЕТОДЫ РЕШЕНИЯ СИСТЕМ НЕЛИНЕЙНЫХ УРАВНЕНИЙ

Общая форма записи систем нелинейных уравнений имеет вид:

1( 1, 2, … , ) = 02( 1, 2, … , ) = 0

( 1, 2, … , ) = 0

Подобные уравнения возникают во многих областях науки и техники, например, при моделировании химических реакций, расчете электрических цепей или оптимизации сложных систем. В отличие от линейных систем, нелинейные уравнения не имеют общего аналитического решения, поэтому для их решения применяются итерационные численные методы. Основная идея таких методов заключается в последовательном приближении к решению, начиная с некоторого начального приближения. Рассмотрим три наиболее распространенных метода: метод простой итерации, метод Зейделя и метод Ньютона.

Метод простой итерации прост в реализации, но может сходиться медленно или не сходиться вовсе.

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

Метод Ньютона обеспечивает быструю сходимость, но требует вычисления матрицы Якоби и чувствителен к начальному приближению.

Выбор метода зависит от конкретной задачи: для простых систем может хватить метода простой итерации, для более сложных — метода Ньютона, особенно если доступны аналитические

30

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