Maple,写一个Proc来计算矩阵的逆



所以我正在处理一个由两部分组成的问题。我确实在这个有用的论坛的帮助下完成了第一部分。一些机构已经尝试做问题的第一部分,我接受了他们的代码。

解决问题:

  1. 在Maple中编写一个proc(这里我将其命名为"reduced">(,用于计算矩阵的reduced Echelon形式
  2. 编写一个使用";减少的";以计算矩阵的倒数

第一部分的代码(代码经过测试,我声称它运行正确(

multiplikation:= proc(
m::posint,
a::depends(And(posint, satisfies(a-> a <= m))),
b::And({float, rational}, Not(identical(0,0.)))
)
Matrix((m,m), (i,j)-> `if`(i=j, `if`(i=a, b, 1), 0))
end proc:
addition:= proc(
m::posint,
a::depends(And(posint, satisfies(a-> a <= m))),
b::depends(And(posint, satisfies(b-> b <= m))),
c::And({float, rational}, Not(identical(0,0.)))
)
Matrix((m,m), (i,j)-> `if`(i=a and j=b, c, `if`(i=j, 1, 0)))
end proc:
perm:= proc(
m::posint,
a::depends(And(posint, satisfies(a-> a <= m))),
b::depends(And(posint, satisfies(b-> b <= m and a<>b)))
)
Matrix((m,m), (i,j)-> `if`({i,j}={a,b} or i=j and not i in {a,b}, 1, 0))
end proc:

主程序:

reduced:= proc(B::Matrix)
uses LA= LinearAlgebra;
local
M:= B, l:= 1, #l is current column.
m:= LA:-RowDimension(M), n:= LA:-ColumnDimension(M), i, j
;
for i to m do   #going through every row item
#l needs to be less than column number n.
if n < l then return M end if;
j:= i;   #Initialize current row number.
while M[j,l]=0 do   #Search for 1st row item <> 0.
j:= j+1;
if m < j then   #End of row: Go to next column.
j:= i;
l:= l+1;
if n < l then return M fi   #end of column and row
end if
end do;
if j<>i then M:= perm(m,j,i).M end if;   #Permute rows j and i
#Multiply row i with 1/M[i,l], if it's not 0.
if M[i,l] <> 0 then M:= multiplikation(m,i,1/M[i,l]).M fi;
#Subtract each row j with row i for M[j,l]-times.
for j to m do if j<>i then M:= addition(m,j,i,-M[j,l]).M fi od;
l:= l+1   #Increase l by 1; next iteration i increase either.
end do;
return M
end proc:

如果您需要任何关于上述代码的额外信息,我会解释更多。

对于第二部分,我想使用高斯-乔丹算法,但我有一个问题:i不能使用单位矩阵作为"1"中的参数;减少";。因为它在行和列中都有0。

你知道我如何在我的proc:reduced的帮助下实现高斯-乔丹算法吗?

既定目标是利用reduced程序。

一种方法是用单位矩阵来扩充输入矩阵,减少单位矩阵,然后返回扩充矩阵的右半部分。

将输入矩阵转换为单位矩阵的步骤还将单位矩阵转换为(输入矩阵的(逆矩阵。

例如,使用您的程序,

inv := proc(B::Matrix(square))
local augmented,m;
uses LinearAlgebra;
m := RowDimension(B);
augmented := <<B|IdentityMatrix(m)>>;
return reduced(augmented)[..,m+1..-1];
end proc:
MM := LinearAlgebra:-RandomMatrix(3,generator=1..5);
[1  4  2]
[       ]
MM := [1  5  3]
[       ]
[2  3  5]
ans := inv(MM);
[ 8  -7   1]
[ -  --   -]
[ 3  3    3]
[          ]
[ 1   1  -1]
ans := [ -   -  --]
[ 6   6  6 ]
[          ]
[-7   5   1]
[--   -   -]
[6    6   6]
ans.MM, MM.ans;
[1  0  0]  [1  0  0]
[       ]  [       ]
[0  1  0], [0  1  0]
[       ]  [       ]
[0  0  1]  [0  0  1]

ps。您可能还需要考虑当矩阵不可逆时,reduce产品的作用。

相关内容

  • 没有找到相关文章

最新更新