如何实现N 阶矩阵的逆矩阵求解,用代码实现算法
如果是测试通过在重新开帖奉上100分。
分不够可以在加
如果是测试通过在重新开帖奉上100分。
分不够可以在加
解决方案 »
- 大家说说,刚入职时的薪资是多少啊?做什么方面的开发
- 为什么我写程序,在DELPHI中DEBUG状态下是可以正常运行,可是独立运行就出错,为什么(程序中包含线程操作)
- 鉴于大家没事可干,所以也请大家帮忙起个名。我孩子。。。。。。
- 用treeview调用数据库并且将数据保存成一种专用数据格式
- 怎样通过程序实现下载另外一台机子的文件(通过映射盘)?
- 客户端频繁访问数据库的问题
- 请问怎样才能获得一个控件(如TTrackBar)上的消息.
- 打印报表出现的问题!up分!
- 奇怪的delphi6
- 我插入的记录为什么退出程序就没有了呢?我用的是query和UpdateSQL?????
- QePort打印问题
- 这样的更新查询怎样做?
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.