Автор работы: Пользователь скрыл имя, 12 Декабря 2012 в 06:20, контрольная работа
Решение систем линейных алгебраических уравнений – одна из основных задач вычислительной линейной алгебры. Хотя задача решения системы линейных уравнений сравнительно редко представляет самостоятельный интерес для приложений, от умения эффективно решать такие системы часто зависит сама возможность математического моделирования самых разнообразных процессов с применением ЭВМ. Значительная часть численных методов решения различных (в особенности – нелинейных) задач включает в себя решение систем линейных уравнений как элементарный шаг соответствующего алгоритма.
Решение систем линейных алгебраических уравнений – одна из основных задач вычислительной линейной алгебры. Хотя задача решения системы линейных уравнений сравнительно редко представляет самостоятельный интерес для приложений, от умения эффективно решать такие системы часто зависит сама возможность математического моделирования самых разнообразных процессов с применением ЭВМ. Значительная часть численных методов решения различных (в особенности – нелинейных) задач включает в себя решение систем линейных уравнений как элементарный шаг соответствующего алгоритма.
К счастью, приложения очень
часто приводят к матрицам, в которых
число ненулевых элементов
Известны примеры решенных в последние годы задач, где число неизвестных достигало сотен тысяч. Естественно, это было бы невозможно, если бы соответствующие матрицы не являлись разреженными (матрица системы из 100 тыс. уравнений в формате двойной точности заняла бы около 75 Гбайт).
Одним из самых распространенных методов решения систем линейных уравнений является метод Гаусса. Этот метод (который также называют методом последовательного исключения неизвестных) известен в различных вариантах уже более 2000 лет.
Вычисления с помощью метода Гаусса заключаются в последовательном исключении неизвестных из системы для преобразования ее к эквивалентной системе с верхней треугольной матрицей. Вычисления значений неизвестных производят на этапе обратного хода.
(схема частичного выбора). Описание метода. На k-м шаге прямого хода коэффициенты уравнений системы с номерами i = k + 1, …, n преобразуются по формулам
aij(k) = aij(k–1) − qikakj , bi(k) = bi(k–1) − qikbk(k–1) , i = k + 1, …, n.
Интуитивно ясно, что во избежание сильного роста коэффициентов системы и связанных с этим ошибок нельзя допускать появления больших множителей qik.
В методе Гаусса с выбором главного элементоа по столбцу гарантируется, что |qik| ≤ 1 для всех k = 1, 2, …, n – 1 и i = k + 1, …, n. Отличие этого варианта метода Гаусса от схемы единственного деления заключается в том, что на k-м шаге исключения в качестве главного элемента выбирают максимальный по модулю коэффициент aikk при неизвестной xk в уравнениях с номерами i = k + 1, …, n. Затем соответствующее выбранному коэффициенту уравнение с номером ik меняют местами с k-м уравнением системы для того, чтобы главный элемент занял место коэффициента akk(k-1). После этой перестановки исключение неизвестного xk производят, как в схеме единственного деления.
2. Практическая часть
2.1 Программа
решения систем линейных
2.1.1. Постановка задачи. Требуется решить систему линейных алгебраических уравнений с вещественными коэффициентами вида
a11x1 + a12x2 + … + a1nxn = b1 ,
a21x2 + a22x2 + … + a2nxn = b2 ,
. . . . .
. . . . .
. . .
an1x1 + an2x2 + … + annxn = bn
для n ≤ 10 по методу Гаусса c выбором ведущего элемента по столбцу.
2.1.2. Тестовый пример.
3,2x1 + 5,4x2 + 4,2x3 + 2,2x4 = 2,6 ,
2,1x1 + 3,2x2 + 3,1x3 + 1,1x4 = 4,8 ,
1,2x1 + 0,4x2 – 0,8x3 – 0,8x4 = 3,6 ,
4,7x1 + 10,4x2 + 9,7x3 + 9,7x4 = –8,4 ,
x1 = 5, x2 = –4, x3 = 3, x4 = –2.
2.1.3. Описание алгоритма
2.1.4. Листинг программы и результаты работы
{*****************************
Решение систем линейных алгебраических уравнений (СЛАУ)
Метод Гаусса. Выбор ведущего элемента по столбцу v. 1.0
******************************
uses crt;
const
MAX_SIZE=20;
type
TMatrix = array [1..MAX_SIZE] of array [1..MAX_SIZE+1] of double;
TVector = array [1..MAX_SIZE] of double;
var
a: TMatrix;
x: TVector;
n, i, j: integer;
data_file: text;
result_file: text;
{обмен строк матрицы}
procedure swapRow(var a: TMatrix;
n: integer;
i1: integer;
i2: integer);
var
j: integer;
t: double;
begin
for j:=1 to n+1 do begin
t := a[i1,j];
a[i1,j] := a[i2,j];
a[i2,j] := t;
end
end;
{решение СЛАУ методом Гаусса}
procedure linearSolveGaussColLead(a: TMatrix; {расширенная матрица коэфф.}
var x: TVector; {результат}
var
i, j, k: integer;
max, lead, a_div_lead, sum, eps: double;
max_i : integer;
begin
eps := 0.000001;
{прямой ход}
for k:=1 to n do begin
{поиск максимального по модулю элемента в столбце}
max := 0;
max_i := -1;
for i:=k to n do begin
if(abs(a[i,k]) > max) then begin
max := abs(a[i,k]);
max_i := i;
end;
end;
if((max_i = -1) or (abs(a[max_i,k])<eps)) then begin
writeln('Ошибка: определитель равен нулю');
end
else begin
if(max_i <> k) then begin
{обмен строк}
swapRow(a,n,max_i,k);
end;
end;
{обнуление элементов}
lead := a[k,k];
for j:=k to n+1 do begin
a[k,j] := a[k,j]/lead;
end;
for i:=k+1 to n do begin
a_div_lead := a[i,k]/a[k,k];
for j:=k to n+1 do begin
a[i,j] := a[i,j]-a[k,j]*a_div_lead;
end;
end;
end;
{обратный ход}
x[n] := a[n][n+1];
for k:=n-1 downto 1 do begin
sum := a[k][n+1];
for j:=k+1 to n do begin
sum := sum-a[k,j]*x[j];
end;
x[k] := sum;
end;
end;
begin
clrscr;
writeln('Решение систем
writeln('Метод Гаусса. Выбор ведущего элемента по столбцу');
writeln;
assign(data_file, 'a.txt');
reset(data_file);
read(data_file, n);
for i:=1 to n do begin
for j:=1 to n+1 do begin
read(data_file, a[i,j]);
end;
end;
close(data_file);
writeln('Расширенная матрица системы:');
for i:=1 to n do begin
for j:=1 to n+1 do begin
write(a[i,j]:14:6);
end;
writeln;
end;
writeln;
linearSolveGaussColLead(a,x,n)
writeln('Результат:');
for i:=1 to n do begin
writeln(x[i]:14:6);
end;
writeln;
assign(result_file, 'result.txt');
rewrite(result_file);
for i:=1 to n do begin
writeln(result_file, x[i]:14:6);
end;
close(result_file);
readkey;
end.
Информация о работе Решение систем линейных алгебраических уравнений