- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
38
Глава_3.
Решение систем линейных алгебраических уравнений
1) МЕТОД ГАУССА
Имеем систему уравнений:
A11*x1 |
+ |
A12 *x2 |
+ |
.... |
+ |
A1n *xn |
= |
B1 ; |
|||||
A *x |
+ |
A *x |
+ |
.... |
+ |
A |
*x |
= |
B ; |
||||
21 |
1 |
|
22 |
2 |
|
|
|
2n |
|
n |
|
2 |
|
|
|
|
.... |
|
.... |
|
|
.... |
|
....; |
|||
.... |
|
|
|
|
|
||||||||
A |
*x |
+ |
A |
*x |
+ .... |
A |
|
*x = |
B |
; |
|||
n−11 |
1 |
|
n−12 |
2 |
|
|
|
n−1n |
|
n |
n−1 |
|
|
|
|
+ |
`An2 *x2 |
+ |
.... |
+ |
Ann *xn |
= |
Bn ; |
||||
An1 *x1 |
|||||||||||||
Идея метода состоит в том, чтобы последовательно исключать неизвестные из уравнений с тем, чтобы последнее уравнение стало уравнением с одним неизвестным. Это прямой ход метода Гаусса. Первый его шаг состоит в том, чтобы исключить переменную x 1 из
второго, третьего, …. , n - ного уравнения. Это можно сделать, умножив
1 - вое уравнение на коэффициент A21 , и вычесть его (уравнение) из
A11
2 - ого уравнения. Аналогично поступим со следующими уравнениями,
используя коэффициент A21 . Нетрудно заметить, что при таком
Ai1
преобразовании коэффициенты при x1 в этих уравнениях обращаются в 0. Повторяя процедуру n −1 раз и исключая переменные x2 , x3 ,... из следующих строк, мы приведем систему к треугольной форме:
S *x |
+ |
S *x |
+ |
|
.... |
+ |
|
S |
*x |
= |
C ; |
||
11 1 |
|
12 2 |
|
|
|
|
|
1n |
|
n |
|
1 |
|
0 |
+ |
S22*x2 |
+ |
|
.... |
+ |
|
S2n *xn |
= |
C2 ; |
|||
|
|
.... |
|
|
.... |
|
|
|
.... |
|
....; |
|
|
.... |
|
|
|
|
|
|
|
|
|||||
0 |
+ |
0 |
+ |
.... |
+ S |
|
*x |
S |
|
*x = |
C |
; |
|
|
|
|
|
|
n−1n−1 |
n−1 |
n−1n |
|
n |
n−1 |
|
||
|
+ |
`0 |
+ |
|
.... |
+ 0 |
Snn*xn |
= |
Cn ; |
||||
0 |
|
||||||||||||
Теперь совершаем обратный ход метода Гаусса:
39
Из n - ного уравнения |
xn = |
Cn |
подставим в ( n −1) – вое уравнение, |
|
|||
находим xn−1 и т.д. |
|
Snn |
|
|
|
|
|
Давайте теперь на конкретном примере разберем этот метод.
Дано уравнение:
x1 + x2 + 3x3 = 72x1 + x2 − x3 =53x1 + 5x2 − 7x3 =9
7
Замечание: вектор 5 - называется вектором свободных членов.
9
Работаем с матрицей коэффициентов данного уравнения:
1 |
1 |
3 |
|
7 |
|
||
|
2 |
1 |
−1 |
|
|
|
умножаем первую строку матрицы на 2 и вычитаем из |
|
|
5 |
|
||||
|
|
|
|
|
|
|
|
3 |
5 |
− 7 |
|
|
|
||
|
9 |
|
|||||
второй строки (после чего, для удобства, снова делим первую строку матрицы на 2, чтобы она осталась прежней); затем умножаем первую строку матрицы на 3 и вычитаем из 3 - ей строки, имеем:
1 |
1 |
3 |
7 |
|
|
|||
|
0 |
−1 − 7 |
|
|
−9 |
|
начинаем второй шаг прямого хода метода Гаусса: |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||
0 |
2 |
−16 |
|
|
|
|
||
|
−12 |
|
||||||
умножаем вторую строку матрицы на -2 и вычитаем ее из третьей строки, имеем:
1 |
1 |
3 |
|
7 |
|
|
|
|
|
|
|
|||
|
0 |
−1 |
− 7 |
|
|
−9 |
|
|
вот и закончен прямой ход метода. |
|||||
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
0 |
0 |
−30 |
|
|
|
|
|
|
|
|
|
|||
|
−30 |
|
|
|
−30 |
|
||||||||
Начинаем обратный ход: x |
|
= |
=1, |
|||||||||||
3 |
|
|||||||||||||
имеем: |
|
|
|
|
|
|
|
|
|
−30 |
||||
|
|
7 |
|
|
|
|
|
|
|
|||||
1 |
1 |
3 |
|
|
|
|
|
|
|
|
||||
|
0 |
−1 |
− 7 |
|
|
−9 |
|
умножаем третью строку матрицы на -7 и вычитаем ее |
||||||
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
0 |
0 |
1 |
|
|
|
|
|
|
|
|
|
|
||
|
|
1 |
|
|
|
|
|
|
|
|||||
из второй строки, (не забываем, как умножили на -7 и вычли третью строку из второй, так снова третью строку лучше поделить на -7)
имеем:
40
1 |
1 |
3 |
|
7 |
|
|
|
|
|
0 |
−1 |
0 |
|
|
x2 = − 2 |
= 2 . Теперь аналогичными преобразованиями |
|
|
− 2 |
|||||||
|
|
|
|
|
|
|
−1 |
|
0 |
0 |
1 |
|
|
|
|
||
|
|
1 |
|
|
|
|||
получим окончательно:
1 |
0 |
0 |
2 |
|
|
|
||
|
0 1 |
0 |
|
|
, т.е. x1 |
= 2, x2 |
= 2, x3 =1 |
|
|
2 |
|||||||
|
0 |
|
|
|
|
|
|
|
|
0 1 1 |
|
|
|
|
|||
Имеем вектор ответов:
x1 = 2x2 = 2 ;x3 =1
• Теперь представим решение в системе Scilab.
Матрица читается из файла (см. рис.3.1). Организуем цикл по i, начиная с первой строки матрицы до последней. Выбор главного элемента для начала можно и опустить, но в этом случае, если первый коэффициент окажется равным 0, у нас могут возникнуть проблемы.
Внутри этого цикла организуем цикл по j для перебора последующих строк матрицы коэффициентов, причем, если коэффициент a(i, i) верхней строки равен 0, мы считаем, что определитель системы равен нулю и система несовместна, в связи с чем дальнейшие вычисления не имеют смысла.
Рис.3.1. Матрица коэффициентов
Листинг 3.1 (метод Гаусса)
// читаем матрицу из файла f = mopen('C:\Matrix.txt','r'); n = mfscanf(f,'%d');
m = mfscanf(f,'%d');
41
for i = 1:n for j = 1:m
a(i,j) = mfscanf(f,'%g'); end
end mclose(f);
// прямой ход метода Гаусса for i = 1:n
z = abs(a(i,i)); j = i;
//для повышения точности осуществим выбор
//главного элемента, т.е. найдём строку с максимальным
//значением коэффициента a(k,i) и обменяем строки уравнения так,
//чтобы уравнение с максимальным по модулю первым
//коэффициентом было верхним
for k = i+1:n
q = abs(a(k,i)); if q > z
z = q; j = k;
end end
if j != i
for k = i:n+1
// обмен строк
z = a(i,k); a(i,k) = a(j,k); a(j,k) = z; end
end
for j = i+1:n q = a(i,i); if q == 0.0
disp('система несовместна'); return;
end
z = a(j,i)/q; for k = i:n+1
a(j,k) = a(j,k)-a(i,k)*z; end
end end
k = n;
q = a(k,k); if q == 0.0
disp('система несовместна'); return;
end
// обратный ход метода Гаусса x(k) = a(k,m)/q;
i = k-1;
