2017-04-05 59 views
2

均等系を解くにはAm * nの行列(必ずしも正方形ではない)Rの任意のm * n行列Aについて均等系Ax = 0を解く(Aのヌル空間の基底を見つける)

# A=[-0.1 0.1]= 1x2 matrix; x=2x1 to be found; 0: 1x1 zero matrix 
A <- t(matrix(c(-0.1,0.1))) 

この質問はRn -> Rmのカーネル(ゼロ空間)を求めるのと同等であると思われる(上付きで行うことはできません。申し訳ありません)線形変換。

+0

mおよびnは任意である。制限はありません。とにかく、上記の特定の行列Aの解は私には十分です。 –

+0

'A < - 行列(c(-0.1,0.1)、1,2)'または 'A < - 行列(c(-0.1,0.1)、1)'( 't()'は必要ありません) – jogo

答えて

2

とにかく、上記の特定のマトリックスAの解決策で十分です。

x = (a, a)a)は任意の値です。


一般的な解決策のための一般的な治療

は、An * pであると仮定する。 (申し訳ありませんが、これは我々が多くの場合、統計に使用記法である。)あなたが最初QR分解によってAのランクを決定する必要があり

QR <- qr.default(A) 
r <- QR$rank 
R <- QR$qr 

QR因数分解は、Rx = 0に長方形のシステムAx = 0に変換(直交下変換)。

    n >= p
  • 場合、Rp * p上三角行列です。
  • n < pの場合、Rp * nの台形行列であり、左辺は上三角形である。p * pブロックは上三角形である。

今行列ランクrがでてくる

n >= p

  • r = p場合は、フルランクシステムを持っているので、xを解決するには、一意である場合:。ちょうどベクトル0の
  • r < pの場合、NULLスペースには(p - r)自由変数があります(ker(A))。 xの最後の(p - r)の値を任意の値に設定し、次にRHS b <- -(R[1:r, -(1:r)] %*% x[-(1:r)])を更新して、最初のrの値をxの値で一意に解決する必要があります。x[1:r] <- backsolve(R, b, r)

このシステムは関係なく、常にrが何であるか、xで自由変数を持つn < p

場合。上記のr < pと同じ計算を適用します。あなたがゼロのベクトルを取得しない限り、解決策はランダムなものであると

f <- function (A) { 
    n <- dim(A)[1] 
    p <- dim(A)[2] 
    QR <- qr.default(A) 
    R <- QR$qr 
    r <- QR$rank 
    x <- numeric(p) 
    if ((r < min(n, p)) || (n < p)) { 
    x[-(1:r)] <- runif(p - r) 
    b <- -(R[1:r, -(1:r), drop = FALSE] %*% x[-(1:r)]) 
    x[1:r] <- backsolve(R, b, r) 
    } 
    x 
    } 

注:ここでは

は実装です。 A %*% f(A)で正確性を確認できますが、丸め誤差の影響を受けます。


エンハンスメント

上記f機能が一つだけ解を与えます。しかし、線形代数に精通している人のために、Aの空白はベクトル空間であり、私たちは本当にそのような空間の基礎を欲しがっています。それでは、ここで強化があります。

f <- function (A) { 
    n <- dim(A)[1] 
    p <- dim(A)[2] 
    QR <- qr.default(A) 
    R <- QR$qr 
    r <- QR$rank 
    x <- numeric(p) 
    if ((r < min(n, p)) || (n < p)) { 
    x <- matrix(0, p, p - r) 
    x[-(1:r), ] <- diag(p - r) 
    b <- -(R[1:r, -(1:r), drop = FALSE]) 
    x[1:r, ] <- backsolve(R, b, r) 
    } 
    x 
    } 

ここで、ゼロのベクトルが得られない限り、解は一意ではなく、解空間があります。その場合、xの列は、そのような空間の基礎を提供します。それらの列の任意の線形結合は解決策です。また、前の関数のランダムな性質が削除されていることにも注意してください。


なぜQR分解?

線形代数コースでは、(縮小された)行エシェロン形式を使用して、ヌルスペースをAとしています。 Aのランクはピボットの数です。しかしながら、ガウス消去を実行してエシェロン形式に到達することは、Rで符号化することは容易ではないので、QR分解による直交方法が使用される。私はこれがより数値的に安定しているとも信じています。あなたは直交基底

をしたい場合は、上記の方法は、非直交基底を与えるもの


。代わりに、QR分解をt(A)はい、それは転置されたA)に適用し、ランクを決定し、直交行列の最後の空き列を保持する。これは、解空間についてを直交基底とします。

これは簡単にコード化できますが、nullspace機能からpracmaパッケージがこれを行います。

pracma::nullspace(A) 

それはNULLを返した場合、それは解決策は、ゼロの単なるベクトルユニークであることを意味します。行列を返すと、その列は直交基底を与えます。

関連する問題