Смекни!
smekni.com

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

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;

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 < MassA.N) And (MassB.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 < MassA.N) And (MassB.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;