Версия для печати темы
Образовательный студенческий форум _ Информатика / Программирование _ массив в Паскале
Автор: otherside 26.3.2008, 13:47
помогите пожалуйста написать такую программу : написать массив, который вычисляет определитель матрицы 3х3 по методу Гаусса. Значения в матрице запрашиваются случайно.
Автор: tig81 26.3.2008, 13:57
Цитата(otherside @ 26.3.2008, 15:47)

помогите пожалуйста написать такую программу : написать массив, который вычисляет определитель матрицы 3х3 по методу Гаусса. Значения в матрице запрашиваются случайно.
Простите, а что это за метод Гауссса для вычисления определителей третьего порядка!? Первый раз о таком слышу.
Автор: otherside 26.3.2008, 14:03
Цитата(tig81 @ 26.3.2008, 20:57)

Простите, а что это за метод Гауссса для вычисления определителей третьего порядка!? Первый раз о таком слышу.
как нам говорил препод нужно по методу Гаусса избавиться от чисел в верхнем треугольнике и в нижнем (то есть обнулить их) и тогда остается одна главная диагональ по которой можно посчитать определитель...
Автор: tig81 26.3.2008, 14:19
Цитата(otherside @ 26.3.2008, 16:03)

как нам говорил препод нужно по методу Гаусса избавиться от чисел в верхнем треугольнике и в нижнем (то есть обнулить их) и тогда остается одна главная диагональ по которой можно посчитать определитель...
ясно, спасибо. Т.е. приведение определителя к верхне- или нижнетреугольному виду. Тогда определитель равен произведению элементов главной диагонали.
Чтобы, например, сделать нули в первом столбце (кроме элемента а11) поступаем следующим образом:
a[i,j]-a[i,j]/a[1,1], где a[i,j] - элемент в первом столбце.
Т.е. от второй строки отнимаем первую, умноженную на a[2,1]/a[1,1]
Автор: otherside 26.3.2008, 14:32
Цитата(tig81 @ 26.3.2008, 21:19)

ясно, спасибо. Т.е. приведение определителя к верхне- или нижнетреугольному виду. Тогда определитель равен произведению элементов главной диагонали.
Чтобы, например, сделать нули в первом столбце (кроме элемента а11) поступаем следующим образом:
a[i,j]-a[i,j]/a[1,1], где a[i,j] - элемент в первом столбце.
Т.е. от второй строки отнимаем первую, умноженную на a[2,1]/a[1,1]
а как написать что от второй строки отнимается первая?
Автор: tig81 26.3.2008, 14:40
Цитата(otherside @ 26.3.2008, 16:32)

а как написать что от второй строки отнимается первая?
Вот есть программка на Паскале метод Гаусса для СЛАУ
Код
Program Metod_Gaussa;
const
R=6;
A:array [1..R,1..R+1] of extended =
(( 2.1, 1.3, -5.2, 1.4, 3.3, 4.6, 14.35),
( 6.3, -0.4, -14.4, 7.8, 14.0, 21.0, 90.95),
( 2.1, -3.0, -1.7, 9.2, 7.8, 24.6, 129.28),
( 4.2, -1.7, -6.9, 10.6, 11.1, 29.2, 143.63),
(-2.1, 3.0, -0.6, -13.4, -0.5, 0.0, -65.30),
( 4.2, 2.6, -15.0, -5.6, 13.5, 0.6, -43.71));
var
i,j,k:byte;
X:array [1..R] of extended;
C:extended;
BEGIN
writeln;
for i:=1 to R-1 do
begin
k:=i;
for j:=i+1 to R do
if abs(A[j,i])>abs(A[k,i]) then
k:=j;
if k<>i then
for j:=i to R+1 do
begin
C:=A[i,j];
A[i,j]:=A[k,j];
A[k,j]:=C;
end;
for j:=i+1 to R do
begin
C:=A[i,i]/A[j,i];
for k:=i+1 to R+1 do
A[j,k]:=A[j,k]*C-A[i,k];
end;
end;
for i:=R downto 1 do
begin
C:=0;
for j:=i+1 to R do
C:=C+A[i,j]*X[j];
X[i]:=(A[i,R+1]-C)/A[i,i];
end;
for i:=1 to R do
writeln('X',i,'=',X[i]:10:6);
writeln;
END.
посмотрите, может разберетесь.
Автор: otherside 26.3.2008, 15:35
Цитата(tig81 @ 26.3.2008, 21:40)

Вот есть программка на Паскале метод Гаусса для СЛАУ
Посмотрите, может разберетесь.
спасибо... попробую разобраться...
Автор: tig81 26.3.2008, 15:41
Цитата(otherside @ 26.3.2008, 17:35)

спасибо... попробую разобраться...

пробуйте!
Автор: otherside 3.4.2008, 12:56
Цитата(tig81 @ 26.3.2008, 23:41)

пробуйте!

у меня вопрос. я все-таки не могу разобраться, программа начинает не выполняться уже с самого начала.. когда я только объявляю переменные...
Program Metod_Gaussa;
const
R=6;
var
A:array [1..R,1..R+1]of integer;
i,j,k:integer;
X:array [1..R] of integer;
C:integer;
если здесь поставить real то паскаль пишет что "попытка присвоить переменной типа integer выражение типа real", но если ставишь integer, то в C:=A[i,j]/A[j,i]; он пишет такую же ошибкуBEGIN
writeln;
for i:=1 to R-1 do
begin
k:=i;
for j:=i+1 to R do
if abs(A[j,i])>abs(A[k,i]) then
k:=j;
if k<>i then
for j:=i to R+1 do
begin
C:=A[i,j];
A[i,j]:=A[k,j];
A[k,j]:=C;
end;
for j:=i+1 to R do
begin
C:=A[i,j]/A[j,i];
for k:=i+1 to R+1 do
A[j,k]:=A[j,k]*C-A[i,k];
end;
end;
for i:=R downto 1 do
begin
C:=0;
for j:=i+1 to R do
C:=C+A[i,j]*X[j];
X[i]:=(A[i,R+1]-C)/A[i,i];
end;
for i:=1 to R do
writeln('X',i,'=',X[i]:10:6);
writeln;
END.
Автор: creer 3.4.2008, 13:11
Лучше использовать real при задании массивов (если не нравится extended), при использовании integer пожет получаться неверный ответ.
При делении получается число с плавающей точкой, если хочется использовать целочисленный тип, то нужно писать C:=round(A[i,j]/A[j,i]);
Автор: otherside 3.4.2008, 14:15
Цитата(creer @ 3.4.2008, 21:11)

Лучше использовать real при задании массивов (если не нравится extended), при использовании integer пожет получаться неверный ответ.
При делении получается число с плавающей точкой, если хочется использовать целочисленный тип, то нужно писать C:=round(A[i,j]/A[j,i]);
паскаль при вот этой строке C:=round(A[i,j]/A[j,i]) пишет что неверная вещественная операция
Автор: creer 3.4.2008, 14:44
Массив должен быть заполнен перед решением, иначе будет происходить деление на 0, возможно дело в этом. Во всех строчках где проиходит деление и значение присваивается целочисленной переменной, необходимо писать round(здесь делим) или trunc(здесь делим). Round округляет число по правилам математики, а trunc откидывает дробную часть.
Автор: otherside 3.4.2008, 15:21
Цитата(creer @ 3.4.2008, 22:44)

Массив должен быть заполнен перед решением, иначе будет происходить деление на 0, возможно дело в этом. Во всех строчках где проиходит деление и значение присваивается целочисленной переменной, необходимо писать round(здесь делим) или trunc(здесь делим). Round округляет число по правилам математики, а trunc откидывает дробную часть.
спасибо попробую разобраться
Автор: creer 3.4.2008, 15:28
Удачи, но это не слишком простая программа.
Автор: otherside 3.4.2008, 15:32
Цитата(creer @ 3.4.2008, 23:28)

Удачи, но это не слишком простая программа.
в том то и дело нам преподаватель ее дал на половину автомата по экзамену.. вот я и хочу разобраться, сделать.
Автор: creer 3.4.2008, 16:00
Матрица всего 3x3. Может быть проще написать свое решение? В 4 сообщении tig81 рассказала как это можно сделать
. Необходимо всего 3 раза сложить один ряд с другим, умноженным на константу, а затем умножить значения диагонали.
Автор: otherside 3.4.2008, 16:47
Цитата(creer @ 4.4.2008, 0:00)

Матрица всего 3x3. Может быть проще написать свое решение? В 4 сообщении
tig81 рассказала как это можно сделать

. Необходимо всего 3 раза сложить один ряд с другим, умноженным на константу, а затем умножить значения диагонали.
дак вот в том то и дело, что принцип я понимаю, но как это осуществить в програмном виде не понимаю
Автор: creer 3.4.2008, 17:17
Вот, скажем, мы прошли второй ряд. В a[2,1] будет ноль.
for j:=1 to 3 do
a[2,j]:=a[2,j]-a[1,j]*a[2,1]/a[1,1];
Аналогично нужно пройти третий ряд, но 2 раза, поскольку необходимо "обнулить" 2 элемента.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)