85232 (612479), страница 5

Файл №612479 85232 (Определитель произведения прямоугольных матриц. Теорема Коши-Бине) 5 страница85232 (612479) страница 52016-07-30СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 5)

procedure TMainForm.VS_ShowMassToMemo(Caption : String; InMass: TVS_MassData; ShowRazm : Boolean = True);

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

Var S : String;

I, J : Integer;

begin

If ShowRazm Then ResultMemo.Lines.Add(Caption + InMass.Name + ' m = ' + IntToStr(InMass.M) + ' n = ' + IntToStr(InMass.n))

Else ResultMemo.Lines.Add(Caption );

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

Begin

S := ''; //Готовимся к формированию строки

For J := 0 To InMass.N -1 Do //Пробегаемся по столбцам

S := S + FloatToStr(InMass.Mass[i,j]) + ' '; //Формируем строку элементов

ResultMemo.Lines.Add(S); //Выводим строку в Мемо

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

end;

procedure TMainForm.N5Click(Sender: TObject);

Var DetA, DetB, Det : Real;

begin

ResultMemo.Clear;

//Решаем det C обычным способом

VS_VerMass(MAssA, MAssB); //Проверяем массивы. Если в первом массиве число столбцов меньше, чем во втором, меняем матрицы местами

ResultMemo.Lines.Add('1)');

VS_ShowMassToMemo('Пусть ', MassA); //Выводим матрицу А

VS_ShowMassToMemo('', MassB); //Выводим матрицу Б

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

VS_ShowMassToMemo('получаем матрицу ', MassC); //Выводим матрицу С

Det := VS_Det(MassC);

ResultMemo.Lines.Add('Итого: Det C = ' + FloatToStr(Det));

ResultMemo.Lines.Add('2)');

//Решаем по Бине-Коши

If (MassA.M > MassA.N) Then

Begin //попали под условие, когда М>n , значит определитель равен 0

ResultMemo.Lines.Add('m > n массива А , исходя из т. Бине - Коши, DetC = 0');

Exit //Завершаем процедуру

end;

//If (MassB.M > MassB.N) Then

// Begin //попали под условие, когда М>n , значит определитель равен 0

// ResultMemo.Lines.Add('m > n массива B , исходя из т. Бине - Коши, DetC = 0');

// Exit//Завершаем процедуру

// end;

If (MassA.M = MassA.N) And (MassA.M = MassA.N)

Then //попали под условие, когда обе матрицы кувадратные

Begin

ResultMemo.Lines.Add('m = n массивов B и А, исходя из т. Бине - Коши, ');

DetA := VS_Det(MassA);

DetB := VS_Det(MassB);

Det := DetA * DetB;

ResultMemo.Lines.Add('DetC = detA * Det B = ' + FloatToStr(DetA) + ' * ' + FloatToStr(DetB) + ' = ' + FloatToStr(Det));

end;

If (MassA.M MassB.N) Then

Begin

IF VS_IfMassEq(MAssA, MAssB)

Then

BEgin

VS_VerMass(MAssA, MAssB);

VS_InitMassPErebor;

VS_Init2xMassPerebot ;

VS_SortMassPerebor;

VS_GetMAssForDet;

ResultMemo.Lines.Add('Итого по формуле Коши - Бине: ' + FloattoStr(VS_GetKoshi_Bine))

end{IF VS_IfMassEq(MAssA, MAssB)}

Else ResultMemo.Lines.Add('Матрицы не равны')

end;{If (MassA.M MassB.N) Then}

end;

procedure TMainForm.DetCClick(Sender: TObject);

Var Det : Real;

begin

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

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

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

end;

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

//Вычислаем минор

Var

Col, //Текущий столбец новой матрицы

Row, //Текущая строка новой матрицы

I, J : Integer;

TempMass : TVS_MassData;

begin

If InMass.M <> InMass.N Then Exit; // Матрица не квадратная - убегаем

SetLength(TempMass.Mass, InMass.M -1, InMass.N -1);//Установили размер матрицы

Row := 0;

For I := 0 To InMass.M -1 Do

begin

Col := 0; //Начали новый массив с первого элемента

If I <> II -1 Then

Begin //Отбрасываем I строку

For J := 0 To InMass.N -1 do

If J <> JJ -1 Then

Begin //Перебираем все столюцы, кроме J

TempMass.Mass[Row,Col] := InMass.Mass[I,J];

Inc(Col);

end;{If J <> JJ Then}

Inc(Row); //Перешли на сл. строку для нового массива

end;{If I <> II Then}

end; {For I := 0 To InMass.M Do}

TempMass.M := InMass.M - 1;

TempMass.N := InMass.N - 1;

Result := VS_Det(TempMass);

end;

procedure TMainForm.AssignMass(InMAss: TVS_MassData;

var OutMass: TVS_MassData);

//Передаем данные из InMass в OutMass;

Var

I,

J : Integer;

begin

for i := 0 to InMAss.M - 1 do //Пробегаемся по строкам

for j := 0 to InMAss.N - 1 do //Пробегаемся по столбцам

OutMass.Mass[i, j] := InMass.Mass[i, j]; //Переносим значения из InMAss в OutMas

OutMass.M := InMAss.M; //Переносим число, определяющее количество строк

OutMass.N := InMAss.N; //Переносим число, определяющее количество столбцов

OutMass.Name := InMAss.Name; //Переносим название массива

end;

procedure TMainForm.VS_MinorMass(InMass : TVS_MassData; var OutMass: TVS_MassData);

//Находим все миноры входящей матрицы

//InMass - массив, в котором будем искать миноры

//OutMass - массив минор

Var

i,

j : Integer;

begin

If InMass.M <> InMass.N Then Exit; //Вышли, так как мартица не квадратная

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

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

OutMass.Mass[I,J] := VS_Minor(I +1, J +1 , InMass); //Получили I, J минор и занесли в массив OutMass

OutMass.M := InMass.M;

OutMass.N := InMass.N;

end;

procedure TMainForm.N6Click(Sender: TObject);

begin

VS_MinorMass(MassA, MassC);

VS_ShowMass('Минор', MassC);

VS_ShowMassToMemo('Минор', MassC);

end;

procedure TMainForm.N7Click(Sender: TObject);

begin

VS_MinorMass(MassB, MassC);

VS_ShowMass('Минор', MassC);

VS_ShowMassToMemo('Минор', MassC);

end;

procedure TMainForm.N8Click(Sender: TObject);

begin

VS_MinorMass(MassC, MassC);

VS_ShowMass('Минор', MassC);

VS_ShowMassToMemo('Минор', MassC);

end;

procedure TMainForm.lll1Click(Sender: TObject);

begin

IF VS_IfMassEq(MAssA, MAssB)

Then

BEgin

VS_VerMass(MAssA, MAssB);

VS_InitMassPErebor;

VS_Init2xMassPerebot ;

VS_SortMassPerebor;

VS_GetMAssForDet;

ResultMemo.Lines.Add('Итого по форуме Коши - Бине: ' + FloattoStr(VS_GetKoshi_Bine))

end

Else ResultMemo.Lines.Add('Матрицы не равны')

end;

procedure TMainForm.VS_InitMassPErebor;

//Создаем массив переборов для вычесления Детерминант формулы Коши-Бине

// Все действия делаются над массивом MAssP

Var

I, J, Curr : Integer;

begin

Curr := 0; //Текущий элемент массива

SetLength(MassP, MassA.N * MassA.M); //Установили размерность

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

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

Begin

MassP[Curr] := J +1; //Заполняем массив строками-перестановками/столбцами-перестановками

Inc(Curr); //Перешли к след. элеенту массива

end;

//VS_SortMassPerebor

end;

procedure TMainForm.VS_GetMAssForDet;

//Формуриуем массив для вычисления Дет.

//Данные перестановки уже должны хранится в массиве MassP

//т. е уже нужно иметь Массив А и уже должна быть выполнена VS_InitMassPErebor;

Var I, J : Integer;

Det : Real;

SA, SB : String;

TempB,

TempA : TVS_MassData; //Н*М мерный массив миноров

begin

ResultMemo.Lines.Add('Переборы: ');

SetLength(TempA.Mass, MAssA.M, MAssA.M);

SetLength(TempB.Mass, MAssB.N, MAssB.N);

SetLength(DetA, MassA.N);

SetLength(DetB, MassB.M);

TEmpA.M := MAssA.M;

TEmpA.N := MAssA.M;

TEmpB.M := MAssB.N;

TEmpB.N := MAssB.N;

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

Begin

SA:= IntToStr(I +1) + 'A) ';

SB:= IntToStr(I +1) + 'B) ';

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

begin

SA:= SA + FloatToStr(MassPer.Mass[I, J]) + ' ';

SB:= SB + FloatToStr(MassPer.Mass[I, J]) + ' ';

VS_GenerateColMinorData(J, Trunc(MassPer.Mass[I, J]), TempA);

VS_GenerateRowMinorData(J, Trunc(MassPer.Mass[I, J]), TempB);

end;{For J := 0 to MassPer.N - 1 do //Пробегаемся по всем столбцам -1}

ResultMemo.Lines.Add('');

ResultMemo.Lines.Add(SA);

VS_ShowMassToMemo('', TempA, False);

DetA[I] := VS_Det(TempA);

ResultMemo.Lines.Add('DetA = ' + FloatToStr(Deta[I]));

ResultMemo.Lines.Add('');

ResultMemo.Lines.Add(SB);

VS_ShowMassToMemo('', TempB, False);

DetB[I] := VS_Det(TempB);

ResultMemo.Lines.Add('DetB = ' + FloatToStr(DetB[I]));

end;{For I := 0 to MassPer.M - 1 do //пробегаемся по строкам}

end;

procedure TMainForm.VS_GenerateColMinorData(CurCol, Col: Integer;

var inMass: TVS_MassData);

//Формируем массив минор для КоШИ_БИНЕ

//На входе

//CurCol - номер столбюца в новом массиве

//COl - номер столбца для массива, с которого будем брать значения

//InMass - массив, в который будем заносить значения

Var I : Integer;

begin

For I := 0 To MassA.M -1 do

inMass.Mass[I, CurCol] := MassA.Mass[I, Col -1];

end;

procedure TMainForm.VS_SortMassPerebor;

//Сортируем элементы массива переборов для правильного вычисления миноров

Var

K, I, J, Curr : Integer;

Rez : Real;

begin

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

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

For K := J + 1 to MassPer.N - 1 do

If MassPer.Mass[I, j] > MassPer.Mass[I, K] Then //Текущий элемент больше следующего - меняем местами

Begin

REz := MassPer.Mass[I, j];

MassPer.Mass[I, j] := MassPer.Mass[I, K];

MassPer.Mass[I, K] := Rez;

end;

end;

procedure TMainForm.VS_Init2xMassPerebot;

//Формируем 2хмерный массив переборов

//На выходе будет M*N мерный массив переборов (не сортированый)

Var I, J, Curr, CurCol, CurRow : Integer;

Det : Real;

S : String;

begin

Curr := 0; //Текущий элемент в массиве MassP

SetLEngth(MassPer.Mass, MassA.N, MassA.M); //Установвили размерность массива перестановок

MassPer.M := MassA.N; //Задали размерность

MassPer.N := MassA.M; //Задали размерность

CurRow := 0; //Текущая строка нового массива

For I := 0 to MassA.N -1 Do //Запускаем по строкам

begin

CurCol := 0; // Текущий столбец/строка нового массива

For J := 0 to MassA.M - 1 do

Begin

MassPer.Mass[CurRow, CurCol] := MassP[Curr];

Inc(Curr); //Перешли к новому элементу массива MassP

Inc(CurCol); //Перешли к нововму столбцу нового массива

end; {For J := 0 to MassA.M - 1 do}

Inc(CurRow); //Перешли к новой строке нового массива

end;{For I := 0 to MassA.N -1 Do //Запускаем}

end;

procedure TMainForm.VS_GenerateRowMinorData(CurCol, Col: Integer;

var InMass: TVS_MassData);

//Формируем массив минор для КоШИ_БИНЕ

//На входе

//CurCol - номер столбюца в новом массиве

//COl - номер столбца для массива, с которого будем брать значения

//InMass - массив, в который будем заносить значения

Var I : Integer;

begin

For I := 0 To MassB.N -1 do

inMass.Mass[CurCol, I ] := MassB.Mass[Col -1,I];

end;

Function TMainForm.VS_GetKoshi_Bine: Real;

//Вычисляем формулу Коши-Бине

// ьПеред вызовом должны быть выполнены след. условия:

//1 - введен масив а и б

//выполнены след. процедуры

//VS_InitMassPErebor;

//VS_Init2xMassPerebot ;

//VS_SortMassPerebor;

//VS_GetMAssForDet

//

Var I : Integer;

S : String;

begin

Result := 0;

S := '';

For I := 0 to MassA.N - 1 do

Begin

REsult := REsult + DetA[I] * Detb[I];

S := S + ' (' + FloattoStr(DetA[I])+ ')*(' + FloattoStr(DetB[I] ) + ') + ';

end;

ResultMemo.Lines.Add('C = ' + (Copy(S, 1, Length(s) -2)));

end;

function TMainForm.VS_IfMassEq(Massin1, MAssIn2: TVS_MassData): Boolean;

//Сравниваем 2 мартицы

//Получаем True, если

//1. число строк матрицы 1 - числу столбцов матрицы 2

//2. число стоблцов матрицы 1 = числу строк матрицы 2

begin

Result := (Massin1.M = MAssIn2.N) And (Massin1.N = MAssIn2.M)

end;

procedure TMainForm.VS_VerMass(var Massin1, MAssIn2: TVS_MassData);

//Проверяем матрицы

//Если Столбцв матрицы А меньше, чем в Б, меняем матрицы местами

Var TempMass: TVS_MassData;

begin

If Massin1.N < MAssIn2.N Then

Begin

SetLength(TempMass.Mass, MassIn1.M, MassIn1.N);

TempMass := Massin1;

SetLength(Massin1.Mass, MassIn2.M, MassIn2.N);

Massin1 := MAssIn2;

SetLength(Massin2.Mass, TempMass.M, TempMass.N);

Характеристики

Тип файла
Документ
Размер
3,9 Mb
Тип материала
Предмет
Учебное заведение
Неизвестно

Список файлов курсовой работы

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