Перейти к содержимому

Почему определитель матрицы паскаля равен 1

  • автор:

Почему определитель матрицы паскаля равен 1

Помогите пожалуйста написать комментарии для каждой строки программы.
Условие задачи: Найти детерминант матрицы А размером nxn.

Program Determinant; const N1=10; type Matrice=array[1..N1,1..N1] of real; var A:matrice; I,J,N:integer; D:real; Function Det(A:Matrice;N:integer):real; var B:matrice; I:integer; T,Mn,S:real; Function Minor(var C:matrice;A:Matrice;N,I,J:integer):real; var Im,Jm,Ia,Ja,Nm:integer; begin Nm:=N-1; Im:=1; Ia:=1; while ImI then begin Jm:=1; Ja:=1; while JmJ then begin C[Im,Jm]:=A[Ia,Ja]; Ja:=Ja+1; Jm:=Jm+1; end else Ja:=Ja+1; Ia:=Ia+1; Im:=Im+1; end else Ia:=Ia+1; end; begin if N=1 then Det:=A[N,N]; if N=2 then Det:=A[1,1]*A[2,2]-A[2,1]*A[1,2]; if N>2 then begin S:=0; for I:=1 to N do begin Mn:=Minor(B,A,N,I,1); if (I mod 2)=1 then begin T:=Det(B,N-1); S:=S+T*A[I,1]; end else begin T:=Det(B,N-1); S:=S-T*A[I,1]; end; end; Det:=S; end; end; begin Write('Vvedite porajdok matrichi N: '); readln(N); for I:=1 to N do begin writeln('Vvoditeelementu stroki ',I:2); for J:=1 to N do readln(A[I,J]); end; D:=Det(A,N); Writeln('Opredelitel raven: ',D:7:4); readln; end.
Andrew2012
Посмотреть профиль
Найти ещё сообщения от Andrew2012

Форумчанин
Регистрация: 29.10.2009
Сообщений: 259

Набор данных функций вычисляет определитель матрицы разложением по строке. Зайди на элементарную Википедию, там аналогичным образом считается определитель матрицы третьего порядка. Когда прочтешь и разберешься, думаю, сам комментарии напишешь. Сам когда-то вычислял определитель таким образом.
Серьезно в код не всматривался, но условие:

if N=2 then

можно убрать

Из всех классических книг, посвященных программированию, ненавижу всего одну — русский перевод книги Роберта Седжвика-«Фундаментальные алгоритмы C++». Предпочитаю читать её в оригинале.

Регистрация: 02.07.2011
Сообщений: 2

Program Determinant;//название программы const N1=10;//константа (используется везде (не изменяется)) type Matrice=array[1..N1,1..N1] of real;//свой тип массива var//глобальные переменные (способный измениться по ходу программы) A:matrice;//переменная с нашим массивом I,J,N:integer;//переменные для работы с массивом D:real;//переменная для нахождения детерминанта Function Det(A:Matrice;N:integer):real; var B:matrice; I:integer; T,Mn,S:real; Function Minor(var C:matrice;A:Matrice;N,I,J:integer):real; //нахождение дополнительного минора var Im,Jm,Ia,Ja,Nm:integer; //Im - строки минора, Jm - столбцы минора, Ia - строки матрицы А, Ja - столбцы матрицы А, Nm - порядок (размерность) минора. begin Nm:=N-1; //порядок минора на единицу меньше порядка матрицы Im:=1; //берем первую строку Ia:=1; while ImI then begin Jm:=1; Ja:=1; while JmJ then begin C[Im,Jm]:=A[Ia,Ja]; Ja:=Ja+1; Jm:=Jm+1; //определяем какой элемент будет стоять перед минором ? end else Ja:=Ja+1; Ia:=Ia+1; Im:=Im+1; end else Ia:=Ia+1; end; begin if N=1 then //если n=1 Det:=A[N,N]; //нашей функции передается число из массива if N=2 then Det:=A[1,1]*A[2,2]-A[2,1]*A[1,2];//нашей функции передается число из массива if N>2 then//всё что больше 2 begin S:=0; //сумма for I:=1 to N do begin Mn:=Minor(B,A,N,I,1);//находим дополнительный минор if (I mod 2)=1 then //если после деления на 2 равно единице begin T:=Det(B,N-1); S:=S+T*A[I,1]; end else //если не равно выполняется begin T:=Det(B,N-1); S:=S-T*A[I,1]; end; end; Det:=S; end; end; begin Write('Vvedite porajdok matrichi N: '); readln(N);//ввод длины массива не больше 10 for I:=1 to N do begin writeln('Vvoditeelementu stroki ',I:2); for J:=1 to N do //заполнение массива readln(A[I,J]); end; D:=Det(A,N);//нахождение деттерминанта Writeln('Opredelitel raven: ',D:7:4);//вывод результата readln;//пауза end.
Andrew2012
Посмотреть профиль
Найти ещё сообщения от Andrew2012

Определитель матрицы

Определитель матрицы
Привет ребят, решите задачу плиз каму не сложно. Задача. Вычислить определитель матрицы ( рекурсия.

Определитель матрицы
Написать программу вычисления определителя матрицы к-го порядка. k

Найти определитель матрицы
Напишыте плиз прогу (или кусок) которая находить детерминант матрицы NxN, где N вводят с.

Вычислить определитель матрицы
Как вычислить определитель для матрицы a, где i изменяется от 0 до n-1, j от 0 до N-1?

Регистрация: 16.09.2008
Сообщений: 45
Что ета програма должна делать . Для чего она.
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
Что ета програма должна делать . Для чего она.

Человек пытается найти определитель матрицы. Содрал окуда-то кривой код или криво списал, а что делать, понятия не имеет.

(Yellow_Duck)
1261 / 130 / 15
Регистрация: 16.10.2008
Сообщений: 733

Трансер, ты код оформи нормально, тогда скажу

Добавлено через 31 секунду
надо чтобы не все в одну линию было

Регистрация: 29.10.2008
Сообщений: 100
что тебе нужно сделать в задаче?
Регистрация: 30.10.2008
Сообщений: 3

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

Добавлено через 1 час 51 минуту 41 секунду

ЦитатаСообщение от YeLLoW DucK Посмотреть сообщение

Трансер, ты код оформи нормально, тогда скажу

Добавлено через 31 секунду
надо чтобы не все в одну линию было

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
program fav; const n=3; var i,j,k:integer; A:array [1..n,1..n] of real; detA:real; pr:real; begin writeln('Westi a[i,j]'); for i:=1 to n do begin for j:=1 to n do readln(a[i,j]); end; detA:=1; for k:=1 to n-1 do begin if a[k,k]=0 then begin i:=k+1; if a[i,k]=0 then begin i:=i+1; if i>n then begin detA:=0; writeln('Opredelitel raven nylyu');exit; end; end; end else for j:=k to n do begin pr:=a[i,j]; a[i,j]:=a[k,j]; a[k,j]:=pr; detA:=-detA; end; detA:=a[k,k]*detA; for j:=k+1 to n do a[k,j]:=a[k,j]/a[k,k]; a[k,k]:=1; for i:=k+1 to n do begin for j:=k+1 to n do a[i,j]:=a[i,j]-a[i,k]*a[k,j]; a[i,k]:=0; end; if a[n,n]=0 then detA:=0 else detA:=a[n,n]*detA; end; writeln('detA=',detA:8:6); end.

Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181

Лучший ответ

Сообщение было отмечено как решение

Решение

Вы меня конечно извините, но в следующий раз оформляйте код так, чтобы его можно было читать и приводите полное условие Вашей задачи, а то почему код не работает? Ответ: а фиг его знает. Потому что читать такой код никто не будет.
Вообще нахождение определителя лучше оформлять в виде отдельных процедур, тогда четко представляешь как работает программа, в Вашем коде я запутался. Поэтому не буду пытаться исправлять, а предложу свой вариант. Если хотите без процедур, попробуйте разобраться и переделать.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
program opred; uses crt; const n=3; type Tmatr=array [1..n,1..n] of real; var a:Tmatr; det:real;//определитель //процедура перестановки строк, чтобы главный элемент не оказался //нолем или близким к нулю значением procedure Per(k,n:integer;var a:Tmatr; var p:integer); var i,j:integer;z:real; begin z:=a[k,k];i:=k;p:=0; //после каждого преобразования for j:=k+1 to n do //ищем по оставшимся строкам begin if abs(a[j,k])>z then //максимальный по модулю элемент begin z:=abs(a[j,k]);i:=j; //запоминаем номер строки p:=p+1;//считаем количество перестановок, т.к. при каждой //перестановке меняется знак определителя end; end; if i>k then //если эта строка ниже данной for j:=k to n do begin z:=a[i,j];a[i,j]:=a[k,j];a[k,j]:=z;//перестановка end; end; function znak(p:integer):integer;//ф-я определения знака определителя begin if p mod 2=0 then //если четное количество перестановок, "+" , если нет "-" znak:=1 else znak:=-1; end; procedure opr(n:integer;var a:Tmatr;var det:real);//собственно определитель var k,i,j,p:integer; r:real; begin det:=1; for k:=1 to n do //считаем по алгоритму, который во всех учебниках begin if a[k,k]=0 then per(k,n,a,p);//если главный элемент=0, делаем перестановку det:=znak(p)*det*a[k,k]; //меняем знак определителя for j:=k+1 to n do //делаем преобразования begin r:=a[j,k]/a[k,k]; for i:=k to n do begin a[j,i]:=a[j,i]-r*a[k,i]; end; end; end; end; begin //основная программа clrscr; //здесь напишете ввод как Вам больше нравится opr(n,a,det); write('opr=',det:4:0); readln end.

линейная-алгебра — Доказать, что детерминант симметричной матрицы Паскаля равен 1

На Википедии приведено доказательство через произведение треугольных матриц. Оно какое-то искусственное (как до него додуматься, не зная про треугольные матрицы Паскаля?) + не понимаю, как в общем виде доказать, что произведение треугольных матриц Паскаля равно симметричной.

Сам пробовал приводить матрицу к верхнетреугольному виду: $$\begin1 & 1 & 1 & 1\\1 & 2 & 3 & 4\\1 & 3 & 6 & 10\\1 & 4 & 10 & 20\end=\begin1 & 1 & 1 & 1\\0 & 1 & 2 & 3\\0 & 2 & 5 & 9\\0 & 3 & 9 & 19\end=\begin1 & 1 & 1 & 1\\0 & 1 & 2 & 3\\0 & 0 & 1 & 3\\0 & 0 & 3 & 10\end=\begin1 & 1 & 1 & 1\\0 & 1 & 2 & 3\\0 & 0 & 1 & 3\\0 & 0 & 0 & 1\end=1$$ В частных случаях получается, а в общем опять не могу.

задан 1 Дек ’17 11:31

@SerVB: попробуйте сделать так: вычитать из строки предыдущую, начиная снизу. Записывать это всё в виде сочетаний. Тогда будет получаться понятная закономерность того, что возникает, с учётом тождества C(n+1,m)=C(n,m-1)+C(n,m).

(1 Дек ’17 15:36) falcao

@falcao, закономерность понял, спасибо!

(3 Дек ’17 11:55) SerVB

не понимаю, как в общем виде доказать, что произведение треугольных матриц Паскаля равно симметричной. — если я не ошибаюсь, то там просто заметили, что можно каждый элемент записать как свёртку Вандермонда. отсюда и треугольные матрицы Паскаля появились.

(3 Дек ’17 12:05) all_exist

Здравствуйте

Математика — это совместно редактируемый форум вопросов и ответов для начинающих и опытных математиков, с особенным акцентом на компьютерные науки.

задан
1 Дек ’17 11:31

показан
2822 раза

обновлен
3 Дек ’17 12:05

Матрица Паскаля

title-icon

В математике, особенно в теории матриц и комбинаторике, матрица Паскаля — это бесконечная матрица, элементами которой являются биномиальные коэффициенты. Существует три варианта расположения элементов в матрице: в виде верхнетреугольной, нижнетреугольной или симметричной матрицы. 5×5-ограничения таких матриц имеют вид:

S 5 = ( 1 1 1 1 1 1 2 3 4 5 1 3 6 10 15 1 4 10 20 35 1 5 15 35 70 ) . =1&1&1&1&11&2&3&4&51&3&6&10&151&4&10&20&351&5&15&35&70end>.>

Эти матрицы удовлетворяют соотношению Sn = LnUn. Отсюда легко видеть, что все три матрицы имеют единичный определитель, так как определитель треугольных матриц Ln и Un равен произведению их диагональных элементов. Другими словами, матрицы Sn, Ln, и Un унимодулярны. След матриц Ln и Un равен n.

Элементы симметричной матрицы Паскаля имеют вид:

S i j = ( n r ) = n ! r ! ( n − r ) ! , n = i + j , r = i . ==>,quad n=i+j,quad r=i.>

S i j = C i + j i = ( i + j ) ! ( i ) ! ( j ) ! . = extstyle C_^=>.>

Таким образом, след матрицы Sn равен

в зависимости от n образуя последовательность: 1, 3, 9, 29, 99, 351, 1275, … последовательность A006134 в OEIS.

Построение

Матрица Паскаля может быть построена посредством взятия экспоненты от поддиагональной или наддиагональной матрицей специального вида. В следующем примере строятся матрицы 7×7, но этот метод работает для любых n×n-матриц Паскаля. (Точками обозначены нулевые элементы.)

Важно отметить, что нельзя просто положить exp(A)exp(B) = exp(A + B) для n×n-матирц A и B, такое равенство имеет место только при AB = BA (то есть когда матрицы A и B коммутируют). В приведённом построении симметричных матриц Паскаля наддиагональные и поддиагональные матрицы не коммутируют. Таким образом, нельзя провести (возможно) ожидаемое упрощение, включающее сумму матриц.

Полезное свойство поддиагональных и наддиагональных матриц, используемое в данном построении — это их нильпотеность, то есть при возведении в достаточно большую целую степень они вырождаются в нулевую матрицу. (Смотри матрица сдвига для дальнейших деталей.) Так как обобщённые n×n-матрицы сдвига, которые тут используются, становятся равными нулю при возведении в степень n, то при вычислении матричной экспоненты необходимо рассматривать только первый n + 1 член бесконечного ряда, чтобы получить точный результат.

Варианты

Интересные варианты могут быть получены посредством очевидных модификаций матриц PL7, от которых берётся экспонента.

Первый пример ниже использует квадраты значений в PL7 вместо исходных и приводит к построению 7×7-матрицы Лагерра (матрицы, элементами которой являются полиномы Лагерра).

(Матрица Лагерра на самом деле использует другое масштабирование и знаки некоторых коэффициентов.)

Второй пример использует v(v + 1) в качестве элементов, если v— элементы исходной матрицы. Он приводит к построению 7×7-матрицы Лаха (матрицы с элементами в виде чисел Лаха).

Использование v(v − 1) приводит к диагональному сдвигу вниз-вправо.

Третий пример использует квадрат исходной PL7-матрицы, делёный на 2, другими словами: биномиальные коэффициенты первого порядка C k 2 ^> на второй поддиагонали и приводит к построению матрицы, которая возникает в связи с производными и интегралами от гауссовской функции ошибок:

Если обратить эту матрицу (например, снова беря экспоненту, но с другим знаком), то знаки коэффициентов меняются и дают коэффициенты производных гауссовской функции ошибок.

Другой вариант может быть получен при расширении исходной матрицы на отрицательные числа:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *