![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
otherside |
![]()
Сообщение
#1
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
помогите пожалуйста написать такую программу : написать массив, который вычисляет определитель матрицы 3х3 по методу Гаусса. Значения в матрице запрашиваются случайно.
|
![]() ![]() |
tig81 |
![]()
Сообщение
#2
|
Академик ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 15 617 Регистрация: 15.12.2007 Город: Украина, Запорожье Учебное заведение: ЗНУ Вы: преподаватель ![]() |
помогите пожалуйста написать такую программу : написать массив, который вычисляет определитель матрицы 3х3 по методу Гаусса. Значения в матрице запрашиваются случайно. Простите, а что это за метод Гауссса для вычисления определителей третьего порядка!? Первый раз о таком слышу. |
otherside |
![]()
Сообщение
#3
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Простите, а что это за метод Гауссса для вычисления определителей третьего порядка!? Первый раз о таком слышу. как нам говорил препод нужно по методу Гаусса избавиться от чисел в верхнем треугольнике и в нижнем (то есть обнулить их) и тогда остается одна главная диагональ по которой можно посчитать определитель... |
tig81 |
![]()
Сообщение
#4
|
Академик ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 15 617 Регистрация: 15.12.2007 Город: Украина, Запорожье Учебное заведение: ЗНУ Вы: преподаватель ![]() |
как нам говорил препод нужно по методу Гаусса избавиться от чисел в верхнем треугольнике и в нижнем (то есть обнулить их) и тогда остается одна главная диагональ по которой можно посчитать определитель... ясно, спасибо. Т.е. приведение определителя к верхне- или нижнетреугольному виду. Тогда определитель равен произведению элементов главной диагонали. Чтобы, например, сделать нули в первом столбце (кроме элемента а11) поступаем следующим образом: a[i,j]-a[i,j]/a[1,1], где a[i,j] - элемент в первом столбце. Т.е. от второй строки отнимаем первую, умноженную на a[2,1]/a[1,1] |
otherside |
![]()
Сообщение
#5
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
ясно, спасибо. Т.е. приведение определителя к верхне- или нижнетреугольному виду. Тогда определитель равен произведению элементов главной диагонали. Чтобы, например, сделать нули в первом столбце (кроме элемента а11) поступаем следующим образом: a[i,j]-a[i,j]/a[1,1], где a[i,j] - элемент в первом столбце. Т.е. от второй строки отнимаем первую, умноженную на a[2,1]/a[1,1] а как написать что от второй строки отнимается первая? |
tig81 |
![]()
Сообщение
#6
|
Академик ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 15 617 Регистрация: 15.12.2007 Город: Украина, Запорожье Учебное заведение: ЗНУ Вы: преподаватель ![]() |
а как написать что от второй строки отнимается первая? Вот есть программка на Паскале метод Гаусса для СЛАУ Код 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 |
![]()
Сообщение
#7
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Вот есть программка на Паскале метод Гаусса для СЛАУ Посмотрите, может разберетесь. спасибо... попробую разобраться... (IMG:style_emoticons/default/smile.gif) |
tig81 |
![]()
Сообщение
#8
|
Академик ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 15 617 Регистрация: 15.12.2007 Город: Украина, Запорожье Учебное заведение: ЗНУ Вы: преподаватель ![]() |
|
otherside |
![]()
Сообщение
#9
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
у меня вопрос. я все-таки не могу разобраться, программа начинает не выполняться уже с самого начала.. когда я только объявляю переменные... 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 |
![]()
Сообщение
#10
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Лучше использовать real при задании массивов (если не нравится extended), при использовании integer пожет получаться неверный ответ.
При делении получается число с плавающей точкой, если хочется использовать целочисленный тип, то нужно писать C:=round(A[i,j]/A[j,i]); |
otherside |
![]()
Сообщение
#11
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Лучше использовать real при задании массивов (если не нравится extended), при использовании integer пожет получаться неверный ответ. При делении получается число с плавающей точкой, если хочется использовать целочисленный тип, то нужно писать C:=round(A[i,j]/A[j,i]); паскаль при вот этой строке C:=round(A[i,j]/A[j,i]) пишет что неверная вещественная операция |
creer |
![]()
Сообщение
#12
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Массив должен быть заполнен перед решением, иначе будет происходить деление на 0, возможно дело в этом. Во всех строчках где проиходит деление и значение присваивается целочисленной переменной, необходимо писать round(здесь делим) или trunc(здесь делим). Round округляет число по правилам математики, а trunc откидывает дробную часть.
|
otherside |
![]()
Сообщение
#13
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Массив должен быть заполнен перед решением, иначе будет происходить деление на 0, возможно дело в этом. Во всех строчках где проиходит деление и значение присваивается целочисленной переменной, необходимо писать round(здесь делим) или trunc(здесь делим). Round округляет число по правилам математики, а trunc откидывает дробную часть. спасибо попробую разобраться (IMG:style_emoticons/default/bigwink.gif) |
creer |
![]()
Сообщение
#14
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Удачи, но это не слишком простая программа.
|
otherside |
![]()
Сообщение
#15
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
|
creer |
![]()
Сообщение
#16
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Матрица всего 3x3. Может быть проще написать свое решение? В 4 сообщении tig81 рассказала как это можно сделать (IMG:style_emoticons/default/smile.gif). Необходимо всего 3 раза сложить один ряд с другим, умноженным на константу, а затем умножить значения диагонали.
|
otherside |
![]()
Сообщение
#17
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 98 Регистрация: 29.2.2008 Город: красноярск Учебное заведение: КрижтИрГупс Вы: студент ![]() |
Матрица всего 3x3. Может быть проще написать свое решение? В 4 сообщении tig81 рассказала как это можно сделать (IMG:style_emoticons/default/smile.gif). Необходимо всего 3 раза сложить один ряд с другим, умноженным на константу, а затем умножить значения диагонали. дак вот в том то и дело, что принцип я понимаю, но как это осуществить в програмном виде не понимаю |
creer |
![]()
Сообщение
#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 элемента. |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 15:33 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru