如何实现N 阶矩阵的逆矩阵求解,用代码实现算法
如果是测试通过在重新开帖奉上100分。
分不够可以在加

解决方案 »

  1.   

    http://www.programfan.com/CLUB/old_showbbs.asp?id=36683
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    function gauss(n:Integer;a:array of Double;var an:array of Double):Boolean;
    var
      l,k,i,j,i2,p,q:Integer;
      d,t:Double;
      js:array of Integer;
    begin
      Result:=False;
    //  if High(a)<>n-1 then Exit;
    //  if High(an)<>n-1 then Exit;
      SetLength(js,n);
      l:=1;
      i2:=0;
      for k:=0 to n-2 do
      begin
        d:=0.0;
        for i:=k to n-1 do
          for j:=k to n-1 do
          begin
            t:=abs(a[i*n+j]);
            if (t>d) then
            begin
              d:=t;
              js[k]:=j;
              i2:=i;
            end;
          end;
        if (d+1.0=1.0)then
          l:=0
        else
        begin
          if (js[k]<>k) then
             for i:=0 to n-1 do
             begin
               p:=i*n+k;
               q:=i*n+js[k];
               t:=a[p];
               a[p]:=a[q];
               a[q]:=t;
             end;
          if (i2<>k) then
          begin
            for j:=k to n-1 do
            begin
              p:=k*n+j;
              q:=i2*n+j;
              t:=a[p];
              a[p]:=a[q];
              a[q]:=t;
            end;
            t:=an[k];
            an[k]:=an[i2];
            an[i2]:=t;
          end;
        end;
        if (l=0) then Exit;
        d:=a[k*n+k];
        for j:=k+1 to n-1 do
        begin
          p:=k*n+j;
          a[p]:=a[p]/d;
        end;
        an[k]:=an[k]/d;
        for i:=k+1 to n-1 do
        begin
          for j:=k+1 to n-1 do
          begin
            p:=i*n+j;
            a[p]:=a[p]-a[i*n+k]*a[k*n+j];
          end;
          an[i]:=an[i]-a[i*n+k]*an[k];
        end;
      end;
      d:=a[(n-1)*n+n-1];
      if d=0 then Exit;
      an[n-1]:=an[n-1]/d;
      for i:=n-2 downto 0 do
      begin
        t:=0.0;
        for j:=i+1 to n-1 do t:=t+a[i*n+j]*an[j];
        an[i]:=an[i]-t;
      end;
      js[n-1]:=n-1;
      for k:=n-1 downto 0 do
        if (js[k]<>k) then
        begin
          t:=an[k];
          an[k]:=an[js[k]];
          an[js[k]]:=t;
        end;
      Result:=True;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    const
      a:array[0..8] of double=(1,2,1,
                              4,5,6,
                              7,8,9);
    var
      an:array[0..8] of double;
      ans:String;
      i,j:Integer;
    begin
      ans:='';
      if not gauss(3,a,an) then
        ans:='no 1/A!'
      else
      begin
        for i:=0 to 2 do
        begin
          ans:=ans+FormatFloat('0.00000',an[i*3]);
          for j:=1 to 2 do
            ans:=ans+','+FormatFloat('0.00000',an[i*3+j]);
          ans:=ans+#13;
        end;
      end;
      ShowMessage(ans);
    end;end.