85232 (Определитель произведения прямоугольных матриц. Теорема Коши-Бине), страница 4

2016-07-30СтудИзба

Описание файла

Документ из архива "Определитель произведения прямоугольных матриц. Теорема Коши-Бине", который расположен в категории "". Всё это находится в предмете "математика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "математика" в общих файлах.

Онлайн просмотр документа "85232"

Текст 4 страницы из документа "85232"

//Миноры

function VS_Minor(II, Jj: Integer; InMass : TVS_MassData): REal;

Procedure VS_InitMassInStr(InStr: String; CurRow : Integer; Var InMass: TVS_MassData);

Procedure VS_InitMassPErebor;

Procedure VS_Init2xMassPerebot;

Procedure VS_SortMassPerebor;

Procedure VS_GetMAssForDet;

Function VS_IfMassEq(Massin1, MAssIn2: TVS_MassData) : Boolean;

Function VS_GetKoshi_Bine : Real;

procedure VS_GenerateColMinorData(CurCol, Col : Integer; Var inMass : TVS_MassData);

procedure VS_GenerateRowMinorData(CurCol, Col : Integer; Var InMass : TVS_MassData);

Procedure VS_MinorMass(InMass : TVS_MassData; Var OutMass : TVS_MassData);

procedure N6Click(Sender: TObject);

procedure N7Click(Sender: TObject);

procedure N8Click(Sender: TObject);

procedure lll1Click(Sender: TObject);

procedure N9Click(Sender: TObject);

procedure N10Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

MainForm: TMainForm;

MassP : TVS_MAssPerebor;

MassPer,

MassA,

MassB, MassC : TVS_MassData;

DetB,

DetA : TVS_MAssPerebor; //Массив детерминант А

implementation

uses InRazmUnit, InMassUnit;

{$R *.dfm}

function TMainForm.VS_Det(InMass : TVS_MassData): Real;

var

Temp, A: TVS_MassData;

Cols, Rows, Count: Word;

i, j, k: Integer;

begin

Result := 1; //Результат функции по умолчанию

If InMass.N <> InMass.M Then Exit; //если матрица не квадратная - уходим, так как решение методом диагонали

Count := InMass.M ; // Получили размерность исходного массива

SetLength(A.Mass, Count, Count);//Установили размер матрицы

SetLength(Temp.Mass, 1, Count); //Установили размер мартицы

AssignMass(InMass, A); //Во временный массив заносим данные из исходного, чтобы не портить исходный массив

//Поиск и решение

for i := 0 to Count - 2 do {Начало преобразования к верхнему треугольному виду}

begin

for j := i to Count - 1 do {* Поиск }

begin {* нулевых }

Rows := 0; {* строк }

Cols := 0; {* и }

for k := i to Count - 1 do {* столбцов }

begin {* в }

Rows := Rows + Ord(A.Mass[j, k] = 0); {* матрице }

Cols := Cols + Ord(A.Mass[k, j] = 0); {* }

end;{for k := i to Count - 1 do} {* }

if Rows + Cols = 0 then {* }

Break; {* }

if (Cols = Count - i) or (Rows = Count - i) then {* }

begin {* }

Result := 0; {* }

Exit {* }

end {if (Cols = Count - i) or (Rows = Count - i) then }

end; {for j := i to Count - 1 do } {* }

if A.Mass[i, i] = 0 then

for j := i + 1 to Count - 1 do

if A.Mass[j, i] <> 0 then

begin

Result := -Result; {* меняем строку }

Temp.Mass[0] := A.Mass[i]; {* на строку с }

A.Mass[i] := A.Mass[j]; {* первым }

A.Mass[j] := Temp.Mass[0]; {* ненулевым }

Break {* элементом }

end;

for j := i + 1 to Count - 1 do

if A.Mass[j, i] <> 0 then

begin

for k := i + 1 to Count - 1 do

A.Mass[j, k] := A.Mass[j, k] - A.Mass[i, k] * A.Mass[j, i] / A.Mass[i, i];

A.Mass[j, i] := 0

end

end; {Конец преобразования}

for i := 0 to Count - 1 do { Определитель как произведение }

Result := Result * A.Mass[i, i]; { элементов на главной диагонали}

end;

procedure TMainForm.InputMassAClick(Sender: TObject);

begin

If InRazmForm = Nil Then Application.CreateForm(TInRazmForm, InRazmForm);

With InRazmForm do

Begin

Caption := 'Ввод размерности ряда А';

Hint := Caption; //

ShowHint := True; //Разрешаем быстрые подсказки

lbPrompt1.Caption := 'Размерность N ';

//Настройка эелемента ввода для размерности массива по строкам - М

sedtRazmA.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя

sedtRazmA.MaxValue := MaxN ; //Установили максимальное значение для ввода - переключателя

sedtRazmA.Value := MassA.N; //Установили значение, выводимое на экран

//Настройка эелемента ввода для размерности массива по столбцам - N

sedtRazmB.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя

sedtRazmB.MaxValue := MaxM; //Установили максимальное значение для ввода - переключателя

sedtRazmB.Value := MassA.M; //Установили значение, выводимое на экран

lbPrompt2.Caption := 'Размерность M ';

btnNext.Caption := 'Далее';

btnCancel.Caption := 'Отмена';

If InRazmForm.ShowModal = Mrok Then //если пользователь нажал кнопку "Далее"

Begin

MassA.N := sedtRazmA.Value; //Сохраняем размерность массива

MassA.M := sedtRazmB.Value; //Сохраняем размерность массива

VS_InputMass(MassA); //Выводим сетку для ввода масива

end; {If ShowModal = Mrok Then}

end; {With InRazmForm do}

end; {procedure TMainForm.InputMassAClick(Sender: TObject);}

procedure TMainForm.NMultiplicationClick(Sender: TObject);

//Умножение матриц

begin

VS_MultiplicMass(MassA, MassB, MassC); //Умножаем матрицы

VS_ShowMassToMemo('Результат произведения A*B получился ', MassC); //Результат выводим в Мемо

VS_ShowMass('Итоговый результат ', MassC); //Выводим результаты расчета

end;

procedure TMainForm.VS_MultiplicMass(var inMassA, InMassB, MassOut: TVS_MassData);

//Умножаем матрицы

//N, M - размерность матрицы, где

//N - стоблец

//M - строка

//inMassA - массив А

//inMassB - массив Б

//MassOut - массив С / выходной массив

Var P, i, j : Integer;

S : Real;

begin

For I := 0 to inMassA.M - 1 do // i = 1.. m

For J := 0 to inMassB.N - 1 do // j = 1.. k

begin

S := 0; //Сбнуляем счетчик

For P := 0 to inMassA.N -1 do // p = 1..n

S := S + inMassA.Mass[i, p] * InMassB.Mass[p, j]; //Вычисляем по формуле (Cij = Ep (Aip *Bpj)? где i=1..m, j = 1..k)

MassOut.Mass[I, J] := s; //Сохраняем результат в массив С

end;

MassOut.N := inMassB.N; //Сохраняем получившиюся размерность массива С

MassOut.M := inMassA.M; //Сохраняем получившиюся размерность массива С

end;

procedure TMainForm.InputMassBClick(Sender: TObject);

begin

If InRazmForm = Nil Then Application.CreateForm(TInRazmForm, InRazmForm);

With InRazmForm do

Begin

Caption := 'Ввод размерности ряда Б';

Hint := Caption;

ShowHint := True; //Разрешаем быстрые подсказки на форме

lbPrompt1.Caption := 'Размерность N ';

sedtRazmA.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя

sedtRazmA.MaxValue := MaxN; //Установили максимальное значение для ввода - переключателя

sedtRazmA.Value := MassB.N; //Установили значение, выводимое на экран

sedtRazmB.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя

sedtRazmB.MaxValue := MaxM; //Установили максимальное значение для ввода - переключателя

sedtRazmB.Value := MassB.M; //Установили значение, выводимое на экран

lbPrompt2.Caption := 'Размерность M ';

btnNext.Caption := 'Далее';

btnCancel.Caption := 'Отмена';

If ShowModal = Mrok Then //если пользователь нажал "Далее"

Begin

MassB.N := sedtRazmA.Value; //Сохраняем размерность массива

MassB.M := sedtRazmB.Value; //Сохраняем размерность массива

VS_InputMass(MassB); //Выводи окно с сеткой для ввода массива

end{If ShowModal = Mrok Then}

end; {With InRazmForm do}

end;

procedure TMainForm.VS_ShowMass(inCaption : String; inMass: TVS_MassData);

//Выводим массив

//N, M - размерность матрицы, где

//N - стоблец

//M - строка

//inMass - массив, который выводим

Var

I, K : Integer;

begin

If InMassForm = Nil Then Application.CreateForm(TInMassForm, InMassForm);

with InMassForm do

Begin

Caption := 'Вывод массива';

strGrid.RowCount := InMass.M+1;

strGrid.ColCount := inMAss.N+1;

For I := 0 To inMAss.N -1 do //Выводим шапку для столбцов

strGrid.Cells[I + 1, 0] := 'N = ' + IntToStr( I + 1);

For I := 0 To inMAss.M -1 do //Выводим шапку для строк

strGrid.Cells[0, I + 1] := 'M = ' + IntToStr( I + 1);

btnNext.Caption := 'Ok';

btnCancel.Visible := False; //Выключаем кнопку "Отмена". Она нам не нужна

For I := 0 To inMAss.N -1 do //Пробегаемся по строкам

For K := 0 To inMAss.M -1 do //Пробегаемся по столбцам

InMassForm.strGrid.Cells[I +1,K +1] := FloatToStr(inMass.Mass[K, I]); //Выводим в сетку ранее сохраненный массив

ShowModal; //Выводим окно, ждем реакции пользователя

btnCancel.Visible := True; //Не забываем включить кнопку "Отмена", иначе ее не увидят в других нужных нам метсах

end; {with InMassForm do}

End;

procedure TMainForm.FormShow(Sender: TObject);

//Обрабатываемся прри вызове формы

Var I, J : Integer;

begin

//Обнуляем массивы, во избежание шаманских действий программы

SetLength(MassA.Mass, MaxM , MaxN ); //Установили размер массива в памяти

SetLength(MassB.Mass, MaxM , MaxN ); //Установили размер массива в памяти

SetLength(MassC.Mass, MaxM , MaxN ); //Установили размер массива в памяти

For I := 0 to MaxM - 1 Do //Пробегаемся по строкам

For J := 0 to MaxN - 1 do //Пробегаемся по столбцам

Begin

MassA.Mass[I, J] := 0;

MassB.Mass[I, J] := 0;

MassC.Mass[I, J] := 0;

end; {For J := 1 to MaxN do}

//Обнуляем переменные размерностей массивов

MassA.N := DefValueMas; //Устанавливаем размерность матрицы по умолчанию

MassA.M := MassA.N;

MassB.N := MassA.N;

MassB.M := MassA.N;

MassC.N := MassA.N;

MassC.M := MassA.N;

MassA.Name := 'A';

MassB.Name := 'B';

MassC.Name := 'C';

ResultMemo.Clear; //Очищаем Мемо-поле.

end;

procedure TMainForm.VS_InputMass(var InMass: TVS_MassData);

//Вводим Элементы массива

Var

I, K : Integer;

begin

If InMassForm = Nil Then Application.CreateForm(TInMassForm, InMassForm);

with InMassForm do

Begin

Caption := 'Ввод массива';

strGrid.RowCount := InMass.M+1; //указали количество строк рамным М

strGrid.ColCount := InMass.N+1; //Указали количество столбцов, равным N

For I := 0 To InMass.N -1 do //Делаем шапку для столбцов

strGrid.Cells[I +1, 0] := 'N = ' + IntToStr( I +1);

For I := 0 To InMass.M -1 do //Делаем шапку для строк

strGrid.Cells[0, I +1] := 'M = ' + IntToStr( I +1);

//Заносим результаты массива в сетку, если вводили ранее

For I := 0 to InMass.M -1 do //Пробегаемся по строкам массива

For K := 0 to InMass.N -1 do //Пробегаемся по столбцам массива

Try

strGrid.Cells[I+1, K+1] := FloatToStr (InMass.Mass[K, I]); //Выводим массив в сетку

except

strGrid.Cells[I+1, K+1] := '0';

end;

btnNext.Caption := 'Далее';

btnCancel.Caption := 'Отмена';

If ShowModal = Mrok Then //Выводим форму, ждем реакции пользователя

Begin

SetLength(MassA.Mass, InMass.M +1 , InMass.N +1); //Установили размер массива в памяти

For I := 0 To InMass.N -1 do //Пробегаемся по строкам массива

For K := 0 To InMass.M -1 do //Пробегаемся по столбцам массива

Try //Включаем обработку ошибок

InMass.Mass[K, I] := StrToInt(InMassForm.strGrid.Cells[I +1,K +1]); // Заносим элемент из сетки в массив

except //Если произошла ошибка, например с переводом строки в число

InMass.Mass[I, K] := 0; //Если ошибка - заносим в массив 0

end; {except}

VS_ShowMassToMemo('Успешно введена матрица ',InMass); //Выводим матрицу в Мемо

end;{If ShowModal = Mrok Then}

end;

end;

procedure TMainForm.N3Click(Sender: TObject);

//Выводим результат. Просто выводим массив

begin

VS_ShowMass('', MassC)

end;

procedure TMainForm.nDetAClick(Sender: TObject);

//Определяем определитель матрицы А

Var Det : Real;

begin

Det := VS_Det(MassA); //ВЫчисляем определитель

ResultMemo.Lines.Add('Определитель матрицы А равен ' + FloattoStr(Det)); //Выводим результат в Мемо

ShowMessage(FloatToStr(Det)); //Выводим результат в диалоговое окно

end;

procedure TMainForm.NDetBClick(Sender: TObject);

//Определяем определитель матрицы B

Var Det : Real;

begin

Det:= VS_Det(MassB); //Вычисляем определитель

ResultMemo.Lines.Add('Определитель матрицы B равен ' + FloattoStr(Det)); //Результат вычислений выводим в МЕмо

ShowMessage(FloatToStr(Det)); //Результат выводим в диалоговое окно

end;

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5209
Авторов
на СтудИзбе
430
Средний доход
с одного платного файла
Обучение Подробнее