Консультация № 184040
16.09.2011, 21:40
0.00 руб.
0 5 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
нужно реализовать решение заданной СЛАУ, учитывая тот факт, что на главной диагонали матрицы могут присутствовать нули.
Решить методом Гаусса, матрицу выводить из файла
заранее спасибо!

Обсуждение

Неизвестный
17.09.2011, 16:26
общий
Для исключения влияния нулей на главной диагонали, нужно сделать перестановку строк в матрице коэффициентов ( чтобы на диагональной позиции не было нулей) и не забыть о перестановке в векторе свободных членов.
давно
Профессионал
304622
583
18.09.2011, 03:06
общий
Вот тут 172614 обсуждали такой вопрос. Только ответ я там написал несколько поспешно. Посмотрите в мини-форум.
Неизвестный
18.09.2011, 13:59
общий
Адресаты:
там на Delphi же
да и четко собранной программы нет
давно
Профессионал
304622
583
18.09.2011, 23:13
общий
18.09.2011, 23:15
Цитата: 381027
там на Delphi же
да и четко собранной программы нет


Поэтому я не оформлял ответ, а лишь написал сообщение в мини-форум. Конечно, там надо малость переделать и доработать. Но практически затруднения минимальны -- я бы советовал вам попытаться. Если у меня найдётся время -- попробую сделать. Пока времени заняться вашей задачей нет.
давно
Профессионал
304622
583
27.09.2011, 22:20
общий
это ответ
Здравствуйте, Посетитель - 381027!

Текст программы:
[code h=200]
const n=5;

var a,aa:array[1..n,1..n] of real;
b,x:array[1..n] of real;
i,j,k:integer;
h:real;
fa,fb:text;

begin
{Считывание матрицы A}
assign(fa,'a.txt');
reset(fa);
for i:=1 to n do
begin
for j:=1 to n do
read(fa,a[i,j]);
readln(fa);
end;
close(fa);
{Копия матрицы для проверки}
aa:=a;

{Считывание вектора B}
assign(fb,'b.txt');
reset(fb);
for i:=1 to n do
readln(fb,b[i]);
close(fb);
bb:=b;

{Прямой ход - исключение переменных}
for i:=1 to n-1 do
begin
j:=i;
{Перестановка строк при нулевом диагональном элементе}
while (a[j,i]=0) and (j<=n) do inc(j);
if j<>i then
begin
for k:=1 to n do
begin
h:=a[i,k];
a[i,k]:=a[j,k];
a[j,k]:=h;
end;
h:=b[i];
b[i]:=b[j];
b[j]:=h;
end;
{Обнуление поддиагональных коэффициентов A}
for j:=i+1 to n do
begin
a[j,i]:=-a[j,i]/a[i,i];
for k:=i+1 to n do
a[j,k]:=a[j,k]+a[j,i]*a[i,k];
b[j]:=b[j]+a[j,i]*b[i]
end;
end;

{Обратный ход - нахождение корней}
for i:=n downto 1 do
begin
h:=b[i];
for j:=i+1 to n do
h:=h-x[j]*a[i,j];
x[i]:=h/a[i,i]
end;

writeln('Ответ: X=');
for i:=1 to n do
writeln(x[i]:0:3);

writeln('Проверка: A*x=');
for i:=1 to n do
begin
b[i]:=0;
for j:=1 to n do
b[i]:=b[i]+aa[i,j]*x[j];
writeln(b[i]:0:3);
end;
readln;

end.[/code]

Исходный файл с матрицей A -- a.txt
Код:

1 2 3 4 5
5 4 3 2 1
3 2 4 1 5
5 5 1 1 2
2 2 3 3 4


Исходный файл с вектором b -- b.txt
Код:

10
11
12
13
14


Результат выполнения:
Код:

Ответ: X=
15.200
-14.000
-8.900
6.500
4.700

Проверка: A*x=
10.000
11.000
12.000
13.000
14.000
5
Спасибо большое!!
Форма ответа