急:求计算 行列式的值 的算法!(50分)

  • 主题发起人 主题发起人 microwave
  • 开始时间 开始时间
M

microwave

Unregistered / Unconfirmed
GUEST, unregistred user!
不要控件,不要函数,要算法,希望有公式描述,谢谢!
 
用定义计算感觉很麻烦,可以用递归的方法降低行列式的阶数得到最后的值。
 
参照线性代数的书上关于降阶的公式
可以选择数最小的某行(或某列),按该行展开
a11 a12 ...a1n
a21........ a2n
...
an1... ann
[第一行的所有元素*一个系数+第二行,使a11=0,依次进行,直到若干项为0,]
然后|A|=a11*A11+a12*A12+...+a1n*A1n A11表示a11的代数余子式,由于a11到a1n中
已经有很多为0,因此就简化了。然后递归下去
|A11|=...类似[中的操作]一直进行下去,直到
最后化为2阶的(如下)就可以了
b11 b21
b12 b22

 
运用行列式的初等变换,变成上3角或下3角形式,对角线元素的乘积就是,你可以搜索一下矩阵的算法
 
维数不定,好象写不出来。
 
哪位高人能写个例子吗?如果N维的搞不定,那就写个维数确定的吧!
其实小弟已经写出了一个算法,确实能算出来,但是算法浪费太大了,我想找到标准的算法,
不知 MatLab里的函数是如何写的?
 
算法是非常简单的,数据类型声明为 double ,不能用整数

a11 是否为0
if yes 和其它行交换,使 a11<>0 .若交换不能成功,结果值为 0, ok
对下面的(2 - n)行,减去这一行的倍数,并使 a1i 为0

接着对 a22.........ann 进行同样的处理

值=A11 X A22 X......X Ann
 
请问:对下面的(2 - n)行,减去这一行的倍数,并使 a1i 为0
这句是什么意思?
 
就是将左下角全部转化为 0 的意思。
 
计算行列式值:


type
TArray=array[0..10,0..10] of double;
function Matrix(n:integer;a:TArray):double;
const e=0.0000001;
var
i,j,k:integer;
d2,d3:double;
exch:boolean;
begin
result:=0;
for i:=0 to n-1 do
begin
exch:=true;
if abs(a[i,i])<e then
begin
exch:=false;
for j:=i+1 to n-1 do
if abs(a[j,i])>e then
begin
exch:=true;
for k:=i to n-1 do
begin
d2:=a[i,k];
a[i,k]:=a[j,k];
a[j,k]:=d2;
end;
break;
end;
if exch then break;
end;
if not(exch) then exit;
d2:=a[i,i];
for j:=i+1 to n-1 do
begin
d3:=a[j,i];
for k:=i to n-1 do
begin
a[j,k]:=a[j,k]-a[i,k]/d2*d3;
end;
end;
end;
result:=1;
for i:=0 to n-1 do Result:=Result*a[i,i];
end;

procedure TForm1.Button2Click(Sender: TObject);
var
a:Tarray ;
d:double;
begin
a[0,0]:=0;
a[0,1]:=0;
a[1,0]:=0;
a[1,1]:=0;
showmessage(floattostr(Matrix(2,a)));
a[0,0]:=2;
a[0,1]:=3;
a[1,0]:=4;
a[1,1]:=5
// -2
showmessage(floattostr(Matrix(2,a)));
end;
 
后退
顶部