matSweep_JPH {lazy.symbolic}R Documentation

記号行列のスイープ演算子

Description

英語のヘルプファイルは: matSweep

Arguments

A

正方行列

loc

ピボット位置のベクトル

simplify

= 0 の場合、Simplify や Expand を使用しない
= 1 の場合、終了前に一度 Simplify を使用
= 2 の場合、各ピボットループ終了時に Simplify を使用

all

Simplify のパラメータ

func_level

Simplify のパラメータ

debug

= 1 の場合、詳細を出力

Details

スイープの定義
C <- matSweep( A, p ) とは次の意味です:
c[i,j] <- c[i,j] - c[i,p]*c[p,j]/c[p,p]
c[p,] <- c[p,]/c[p,p]
c[,p] <- - c[,p]/c[p,p]

# 行列 A の逆行列
matSweep( A, 1:ncol(A) ) == solve(A)
Inv(A) と同等です。
# スイープは可逆です
matSweep( matSweep( A, loc ), loc ) == A

数値行列の場合は matSwp を使用してください。

Value

A と同じサイズの行列

Examples


# 2 x 2 行列の逆行列
A <- demomat(2,2,root="a")
Ainv <- matSweep(A)
AAinv <- matTimes(A,Ainv)
Print( Eval(AAinv, A=demomat(2,2)), fuzz=1e-9 )
AinvA <- matTimes(Ainv,A)
Print( Eval(AinvA, A=demomat(2,2)), fuzz=1e-9 )

# 3 x 3 行列の逆行列
A <- demomat(3,3,root="a")
An <- demomat(3,3); An[1,3] <- 11  # fullrank を確保
Ainv <- matSweep(A)
AAinv <- matTimes(A,Ainv)
AAinvn <- matReplace(AAinv,A=An)
Print( Eval(AAinvn), fuzz=1e-9 )
AinvA <- matTimes(Ainv,A)
AinvAn <- matReplace(AinvA,A=An)
Print( Eval(AinvAn), fuzz=1e-9 )

# 可逆性の確認
A <- demomat(2,2,root="a")
A1 <- matSweep(A,1)
A11 <- matSweep(A1,1)
Print( Eval(A11,A=demomat(2,2)) )

A <- demomat(3,3,root="a")
A1 <- matSweep(A,1:2)
A11 <- matSweep(A1,1:2)
Print( Eval(A11,A=demomat(3,3)) )

# 完全記号分割行列
Ap=demomat(2,2,root="A", fullsymb=1)
Print(Ap)
invAp=matSweep(Ap)
Print(invAp)

# 数値チェック
A11n=matrix(c(1,2,0,2),2,2); A12n=matrix(c(1,0,1,1),2,2)
A21n=matrix(c(2,0,1,1),2,2); A22n=matrix(c(1,1,0,2),2,2)
Apn=rbind(cbind(A11n,A12n),cbind(A21n,A22n))
invApn=solve(Apn)
invAps=gsub("inv","solve", invAp, fixed=1)
invApn2=matReplace( invAps, A11=A11n, A12=A12n, A21=A21n, A22=A22n )
Print(invApn-invApn2, fmt="9.6")



[Package lazy.symbolic version 1.0.0.20250830 ]