Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2012, 17:25   #1
HollyWar
 
Регистрация: 28.04.2012
Сообщений: 9
По умолчанию Обратная матрица

У меня есть готовая процедура по нахождению обратной матрицы.
Но в ней не учтено то, что определитель может равняться нулю.
Подскажите пожалуйста, куда воткнуть ошибку

Код:
procedure Obratis;
var k, i, j: integer;
     b: array[0..300, 0..300] of real;
begin
 for k:=0 to kol - 1 do
 begin
      for i:=0 to kol - 1 do
       for j:=0 to kol - 1 do
       begin
            if (i=k) and (j=k) then
               b[i,j] := 1/obr[i,j];
               if (i=k) and (j<>k) then
                  b[i,j] := -obr[i,j]/obr[k,k];
               if (i<>k) and (j=k) then
                  b[i,j] := obr[i,k]/obr[k,k];

               if (i<>k) and (j<>k) then
                  b[i,j] := obr[i,j] - obr[k,j] * obr[i,k]/obr[k,k];

       end;
      for i:= 0 to kol - 1 do
       for j:= 0 to kol - 1 do obr[i, j]:= b[i, j];
 end;
end;

Последний раз редактировалось Stilet; 04.05.2012 в 19:08.
HollyWar вне форума Ответить с цитированием
Старый 04.05.2012, 18:27   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Похоже вы привели не полный код.
Вот, гляньте, как работает сообщение о невозможности нахождения.
http://programmersforum.ru/showpost....19&postcount=2
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.05.2012, 18:59   #3
HollyWar
 
Регистрация: 28.04.2012
Сообщений: 9
По умолчанию

Вот полный код, если нужно, то и сам проект скинуть могу


Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Spin, Grids;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    StringGrid1: TStringGrid;
    Label1: TLabel;
    SpinEdit1: TSpinEdit;
    Button1: TButton;
    Button2: TButton;
    StringGrid2: TStringGrid;
    Splitter1: TSplitter;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure SpinEdit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  kol: integer;
  obr: array[0..300, 0..300] of real;

implementation

{$R *.dfm}

procedure Obratis;
var k, i, j: integer;
    b: array[0..300, 0..300] of real;
begin
 for k:=0 to kol - 1 do
 begin
      for i:=0 to kol - 1 do
       for j:=0 to kol - 1 do
       begin
            if (i=k) and (j=k) then
               b[i,j] := 1/obr[i,j];
               if (i=k) and (j<>k) then
                  b[i,j] := -obr[i,j]/obr[k,k];
               if (i<>k) and (j=k) then
                  b[i,j] := obr[i,k]/obr[k,k];

               if (i<>k) and (j<>k) then
                  b[i,j] := obr[i,j] - obr[k,j] * obr[i,k]/obr[k,k];
       end;
      for i:= 0 to kol - 1 do
       for j:= 0 to kol - 1 do obr[i, j]:= b[i, j];
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 form1.Close;
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
 kol:= SpinEdit1.Value;
 StringGrid1.ColCount:= kol;
 StringGrid1.RowCount:= kol;
 StringGrid2.ColCount:= kol;
 StringGrid2.RowCount:= kol;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i, j: integer;
begin
 randomize;
 for i:= 0 to kol - 1 do
  for j:= 0 to kol - 1 do
    StringGrid1.Cells[i, j]:= IntToStr(random(200) - 100);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 kol:= 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i, j: integer;
    i1, j1: integer;
begin
 i1:= 1;
 j1:= 1;
 try
  for i:= 0 to kol - 1 do
    for j:= 0 to kol - 1 do
    begin
      i1:= i;
      j1:= j;
      obr[i, j]:= StrToFloat(StringGrid1.Cells[j, i]);
    end;
 except
  ShowMessage('Ошибка при вводе числа в столбце ' + IntToStr(j1 + 1) + ' строке ' + IntToStr(i1 + 1) + '!');
  exit;
 end;

 Obratis;
 for i:= 0 to kol - 1 do
  for j:= 0 to kol - 1 do
    StringGrid2.Cells[i, j]:= FloatToStr(Round(1000*obr[j, i])/1000);
end;

end.

Последний раз редактировалось Stilet; 04.05.2012 в 19:08.
HollyWar вне форума Ответить с цитированием
Старый 04.05.2012, 19:15   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Да, лучше бы проект целиком, а то так не скомпилируешь)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.05.2012, 19:30   #5
HollyWar
 
Регистрация: 28.04.2012
Сообщений: 9
По умолчанию

Вот сам проект
Вложения
Тип файла: rar ObrMatrix.rar (207.7 Кб, 306 просмотров)
HollyWar вне форума Ответить с цитированием
Старый 05.05.2012, 00:24   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не уверен, что учел все случаи, так что потестите.
Вложения
Тип файла: zip Main.zip (274.4 Кб, 180 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.05.2012, 01:14   #7
HollyWar
 
Регистрация: 28.04.2012
Сообщений: 9
Хорошо

Мне кажется, что все работает, огромное спасибо)
HollyWar вне форума Ответить с цитированием
Старый 05.05.2012, 12:56   #8
HollyWar
 
Регистрация: 28.04.2012
Сообщений: 9
По умолчанию

Еще есть вопросик: Как матрицу из файла взять? .txt допустим
HollyWar вне форума Ответить с цитированием
Старый 06.05.2012, 01:42   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var 
f: textfile;
n, i, j, a: integer;
begin
 assignfile(f, '1.txt');
 reset(f);
 readln(kol);
 StringGrid1.ColCount := kol;
 StringGrid1.RowCount := kol;
 StringGrid2.ColCount := kol;
 StringGrid2.RowCount := kol;
 for i := 0 to kol - 1 do  
    for j := 0 to kol - 1 do 
    begin
       read(f, a);
       StringGrid1.Cells[i, j] := IntToStr(a);
    end;
  closefile(f);
end;
1.txt
Цитата:
3
1 2 3
4 0 1
2 3 4
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.05.2012, 11:53   #10
HollyWar
 
Регистрация: 28.04.2012
Сообщений: 9
По умолчанию

Код:
readln(kol);
В этой строке ошибку выдает(
I/O error 6
HollyWar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная матрица Azat_MAI Паскаль, Turbo Pascal, PascalABC.NET 1 21.04.2012 20:28
обратная матрица nat@ Помощь студентам 11 17.04.2012 21:08
Обратная матрица ivan.tiran Паскаль, Turbo Pascal, PascalABC.NET 1 04.10.2011 13:43
обратная матрица LastBreath Помощь студентам 1 04.06.2010 20:30
Обратная матрица Шахрия Помощь студентам 1 26.10.2009 17:28