Численные методы. Учебное пособие для СПО
.pdf
Реализация на языке 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
