✅ 操作成功!

矩阵的计算方法

发布时间:2023-06-07 作者:admin 来源:文学

矩阵的计算方法

矩阵的计算方法

孙悟空故事睡前故事-移印

2023年2月21日发(作者:绝对值教学设计)

对称矩阵的计算方法

1、通过传统方法,把矩阵[AI]通过行变换得到[IA-1],具体方法其实就是高斯消元法。

2、对矩阵进行LDL'分解,于是A-1=L'-1D-1L-1

其中L-1就是把L的对角线下元素取负即可,D-1就是对角线元素取倒数,L'-1=(L-1)'

第2种方法对对称阵的效果会更好一些。

下面给一段程序(还没有优化):

type

TMatrix=arrayofarrayofExtended;

ENotSquare=class(Exception);

EDimNotMatch=class(Exception);

...

procedureLDLT(m:TMatrix;varl,d:TMatrix);//LDL'分解

var

n,i,j,k:Integer;

s:Extended;

begin

n:=High(m);

ifHigh(m[0])nthen

('LDL''分解需要方阵!');

SetLength(l,n+1,n+1);

SetLength(d,n+1,n+1);

fori:=0tondo

forj:=0tondobegin

l[i,j]:=Ord(i=j);

d[i,j]:=0;

end;

fori:=0tondobegin

s:=m[i,i];

forj:=0toi-1do

s:=s-Sqr(l[i,j])*d[j,j];

d[i,i]:=s;

fork:=i+1tondobegin

s:=m[k,i];

forj:=0toi-1do

s:=s-l[k,j]*l[i,j]*d[j,j];

l[k,i]:=s/d[i,i];

end;

end;

end;

procedureTranspose(m:TMatrix;varTrans:TMatrix);//矩阵转置

var

i,j,n0,n1:Integer;

begin

n0:=High(m);

n1:=High(m[0]);

SetLength(Trans,n1+1,n0+1);

fori:=0ton0do

forj:=0ton1do

Trans[j,i]:=m[i,j];

end;

procedureMultiply(m1,m2:TMatrix;varRes:TMatrix);//矩阵乘法

var

i,j,k,n0,n1,n2:Integer;

s:Extended;

begin

n0:=High(m1);

n1:=High(m1[0]);

ifn1High(m2)then

('矩阵维数不匹配!');

n2:=High(m2[0]);

SetLength(Res,n0+1,n2+1);

fori:=0ton0do

forj:=0ton2dobegin

s:=0;

fork:=0ton1do

s:=s+m1[i,k]*m2[k,j];

Res[i,j]:=s;

end;

end;

procedureInverseSymmetry(m:TMatrix;varInv:TMatrix);//对称阵求逆

var

l,d,lt,temp:TMatrix;

i,j,k,n:Integer;

s:Extended;

begin

n:=High(m);

LDLT(m,l,d);

SetLength(lt,n+1,n+1);

fori:=0tondo

forj:=0tondo

lt[i,j]:=Ord(i=j);

fori:=0tondobegin

d[i,i]:=1/d[i,i];

forj:=i+1tondobegin

s:=0;

fork:=0toj-1do

s:=s+l[j,k]*lt[k,i];

lt[j,i]:=-s;

end;

end;

Transpose(lt,l);

Multiply(l,d,temp);

Multiply(temp,lt,Inv);

end;

👁️ 阅读量:0