Метод Зейделя.
Решить систему линейных уравненийметодом Зейделя с точностью = 0,001:
Введите матрицу коэффициентов при неизвестных и матрицу свободных членов.
,
.
Задайте функцию, выполняющую последовательно:
приведение системы к нормальному виду;
приведение нормальной системы к виду, пригодному для итерационного процесса Зейделя;
реализация итерационного процесса Зейделя. Аргументы функции: А - матрица исходной системы, B - вектор-столбец свободных членов, - точность решения. Функция возвращает решение системы и его погрешность.
Замечание: При
наборе оператора if:
,
сделайте слева команду Add
Line
дважды и получите
Решите систему, используя эту функцию:
Проверьте решение:
Метод Гаусса — Зейделя. Отладьте программы и проверьте их решение на примерах, выданных преподавателем.
Пример реализация на С++
// Условие окончания
bool converge(double *xk, double *xkp)
{
for (int i = 0; i < n; i++)
{
if (fabs(xk[i] - xkp[i]) >= eps)
return false;
}
return true;
}
/*
Ход метода, где:
a[n][n] - Матрица коэффициентов
x[n], p[n] - Текущее и предыдущее решения
b[n] - Столбец правых частей
Все перечисленные массивы вещественные и
должны быть определены в основной программе,
также в массив x[n] следует поместить начальное
приближение столбца решений (например, все нули)
*/
do
{
for (int i = 0; i < n; i++)
p[i] = x[i];
for (int i = 0; i < n; i++)
{
double var = 0;
for (int j = 0; j < i; j++)
var += (a[i][j] * x[j]);
for (int j = i + 1; j < n; j++)
var += (a[i][j] * p[j]);
x[i] = (b[i] - var) / a[i][i];
}
}
while (!converge(x, p));
Реализация на Pascal
type ar2d = array [1..50, 1..50] of double;
ar1d = array [1..50] of double;
procedure seidel(n: byte; e: extended; a: ar2d; b: ar1d; x: ar1d);
var i, j: longint;
s, v, m: double;
begin
// Проверка на совместность
for i := 1 to n do
begin
s := 0;
for j := 1 to n do
if j <> i then s := s + abs(a[i, j]);
if s >= abs(a[i, i]) then
begin
writeln('SLAE is inconsistent');
exit
end;
end;
// Сам алгоритм
repeat
m := 0;
for i := 1 to n do
begin
s := 0;
for j := 1 to n do
if i <> j then s := s + a[i, j] * x[j];
v := x[i];
x[i] := (b[i] - s) / a[i, i];
m:=abs(x[i])-abs(v);
end;
until m < e;
// Вывод корней
writeln('roots: ');
for i := 1 to n do
writeln('x[', i, ']= ', x[i]:0:4);
end;
Исследуйте однородную систему линейных уравнений:
t
1+4t2+2t3-3t5
=0
2t1+9t2+5t3+2t4+t5=0
t1+3t2+t3-2t4-9t5=0
3t1+12t2+6t3-8t5=0
2t1+10t2+6t3+4t4+7t5=0
Установите режим автоматических вычислений, пометив строку Automatic Calculation в меню Math.
Присвойте переменной ORIGIN значение, равное 1. Значение этой переменной определяет номер первой строки (столбца) матрицы. По умолчанию в Mathcad нумерация начинается с 0.
Введите матрицу системы:
Вычислите ранг матрицы системы:
Приведите матрицу системы к ступенчатому виду:
Определив базисные и свободные переменные, запишите полученную эквивалентную систему:
Здесь
равно ставится с панели:
Используя функцию Find, решите полученную систему относительно базовых переменных: (используйте ту же панель, что в пункте выше)
Запишите общее решение системы:
Найдите фундаментальную систему решений:
Исследуйте неоднородную систему:
Решение:
Присвойте переменной ORIGIN значение, равное 1. Значение этой переменной определяет номер первой строки (столбца) матрицы. По умолчанию в Mathcad нумерация начинается с 0.
Введите матрицу системы и матрицу-столбец свободных членов:
Сформируйте расширенную матрицу системы:
Вычислите ранг основной матрицы и ранг расширенной матрицы системы и сделайте вывод о совместности системы:
Приведите расширенную матрицу совместной системы к ступенчатому виду:
Определив базисные и свободные переменные, запишите полученную эквивалентную систему и разрешите её относительно базисных переменных:
Запишите общее решение:
Найдите фундаментальную систему решений:
