IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> массив в Паскале, определитель матрицы
otherside
сообщение 26.3.2008, 13:47
Сообщение #1


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



помогите пожалуйста написать такую программу : написать массив, который вычисляет определитель матрицы 3х3 по методу Гаусса. Значения в матрице запрашиваются случайно.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
tig81
сообщение 26.3.2008, 13:57
Сообщение #2


Академик
********

Группа: Преподаватели
Сообщений: 15 617
Регистрация: 15.12.2007
Город: Украина, Запорожье
Учебное заведение: ЗНУ
Вы: преподаватель



Цитата(otherside @ 26.3.2008, 15:47) *

помогите пожалуйста написать такую программу : написать массив, который вычисляет определитель матрицы 3х3 по методу Гаусса. Значения в матрице запрашиваются случайно.

Простите, а что это за метод Гауссса для вычисления определителей третьего порядка!? Первый раз о таком слышу.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 26.3.2008, 14:03
Сообщение #3


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(tig81 @ 26.3.2008, 20:57) *

Простите, а что это за метод Гауссса для вычисления определителей третьего порядка!? Первый раз о таком слышу.

как нам говорил препод нужно по методу Гаусса избавиться от чисел в верхнем треугольнике и в нижнем (то есть обнулить их) и тогда остается одна главная диагональ по которой можно посчитать определитель...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
tig81
сообщение 26.3.2008, 14:19
Сообщение #4


Академик
********

Группа: Преподаватели
Сообщений: 15 617
Регистрация: 15.12.2007
Город: Украина, Запорожье
Учебное заведение: ЗНУ
Вы: преподаватель



Цитата(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
Сообщение #5


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(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
Сообщение #6


Академик
********

Группа: Преподаватели
Сообщений: 15 617
Регистрация: 15.12.2007
Город: Украина, Запорожье
Учебное заведение: ЗНУ
Вы: преподаватель



Цитата(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
Сообщение #7


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(tig81 @ 26.3.2008, 21:40) *

Вот есть программка на Паскале метод Гаусса для СЛАУ
Посмотрите, может разберетесь.

спасибо... попробую разобраться... (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
tig81
сообщение 26.3.2008, 15:41
Сообщение #8


Академик
********

Группа: Преподаватели
Сообщений: 15 617
Регистрация: 15.12.2007
Город: Украина, Запорожье
Учебное заведение: ЗНУ
Вы: преподаватель



Цитата(otherside @ 26.3.2008, 17:35) *

спасибо... попробую разобраться... (IMG:style_emoticons/default/smile.gif)

пробуйте! (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 3.4.2008, 12:56
Сообщение #9


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(tig81 @ 26.3.2008, 23:41) *

пробуйте! (IMG:style_emoticons/default/smile.gif)

у меня вопрос. я все-таки не могу разобраться, программа начинает не выполняться уже с самого начала.. когда я только объявляю переменные...
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
Сообщение #10


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Лучше использовать real при задании массивов (если не нравится extended), при использовании integer пожет получаться неверный ответ.
При делении получается число с плавающей точкой, если хочется использовать целочисленный тип, то нужно писать C:=round(A[i,j]/A[j,i]);
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 3.4.2008, 14:15
Сообщение #11


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(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
Сообщение #12


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Массив должен быть заполнен перед решением, иначе будет происходить деление на 0, возможно дело в этом. Во всех строчках где проиходит деление и значение присваивается целочисленной переменной, необходимо писать round(здесь делим) или trunc(здесь делим). Round округляет число по правилам математики, а trunc откидывает дробную часть.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 3.4.2008, 15:21
Сообщение #13


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(creer @ 3.4.2008, 22:44) *

Массив должен быть заполнен перед решением, иначе будет происходить деление на 0, возможно дело в этом. Во всех строчках где проиходит деление и значение присваивается целочисленной переменной, необходимо писать round(здесь делим) или trunc(здесь делим). Round округляет число по правилам математики, а trunc откидывает дробную часть.

спасибо попробую разобраться
(IMG:style_emoticons/default/bigwink.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 3.4.2008, 15:28
Сообщение #14


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Удачи, но это не слишком простая программа.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 3.4.2008, 15:32
Сообщение #15


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(creer @ 3.4.2008, 23:28) *

Удачи, но это не слишком простая программа.

в том то и дело нам преподаватель ее дал на половину автомата по экзамену.. вот я и хочу разобраться, сделать.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 3.4.2008, 16:00
Сообщение #16


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Матрица всего 3x3. Может быть проще написать свое решение? В 4 сообщении tig81 рассказала как это можно сделать (IMG:style_emoticons/default/smile.gif). Необходимо всего 3 раза сложить один ряд с другим, умноженным на константу, а затем умножить значения диагонали.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
otherside
сообщение 3.4.2008, 16:47
Сообщение #17


Студент
**

Группа: Продвинутые
Сообщений: 98
Регистрация: 29.2.2008
Город: красноярск
Учебное заведение: КрижтИрГупс
Вы: студент



Цитата(creer @ 4.4.2008, 0:00) *

Матрица всего 3x3. Может быть проще написать свое решение? В 4 сообщении tig81 рассказала как это можно сделать (IMG:style_emoticons/default/smile.gif). Необходимо всего 3 раза сложить один ряд с другим, умноженным на константу, а затем умножить значения диагонали.

дак вот в том то и дело, что принцип я понимаю, но как это осуществить в програмном виде не понимаю
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 3.4.2008, 17:17
Сообщение #18


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Вот, скажем, мы прошли второй ряд. В 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 элемента.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 28.3.2024, 13:25

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru