2012-09-28 5 views
6

スカラーブリーズの行列の線形システムを解く方法はありますか?すなわち、私はAx = bを持ちます。ここで、Aは行列(通常は正定値)であり、xとbはベクトルです。スカラーブリーズの行列の線形システムを解くにはどうすればいいですか?

コレスキー分解があることがわかりますが、ソルバーを見つけることができませんでしたか? (私がx = b \ Aを行うことができるmatlabだったらx = A.solve(b)を行うことができた)scipyだった場合

答えて

6

どうやら、それは実際には非常に簡単で、オペレータとしてのScala - そよ風に組み込ま:

x = A \ b 

それはコレを使っdoesntのは、それがLU分解を使用して、私は半分を考えるです高速ですが、どちらもO(n^3)なので、匹敵します。

4

まあ、私は最後に自分のソルバを書いた。私はこれが最適な方法であるかどうかはわかりませんが、それは不合理なようには見えませんか? :

// Copyright Hugh Perkins 2012 
// You can use this under the terms of the Apache Public License 2.0 
// http://www.apache.org/licenses/LICENSE-2.0 

package root 

import breeze.linalg._ 

object Solver { 
    // solve Ax = b, for x, where A = choleskyMatrix * choleskyMatrix.t 
    // choleskyMatrix should be lower triangular 
    def solve(choleskyMatrix: DenseMatrix[Double], b: DenseVector[Double]) : DenseVector[Double] = { 
     val C = choleskyMatrix 
     val size = C.rows 
     if(C.rows != C.cols) { 
      // throw exception or something 
     } 
     if(b.length != size) { 
      // throw exception or something 
     } 
     // first we solve C * y = b 
     // (then we will solve C.t * x = y) 
     val y = DenseVector.zeros[Double](size) 
     // now we just work our way down from the top of the lower triangular matrix 
     for(i <- 0 until size) { 
     var sum = 0. 
     for(j <- 0 until i) { 
      sum += C(i,j) * y(j) 
     } 
     y(i) = (b(i) - sum)/C(i,i) 
     } 
     // now calculate x 
     val x = DenseVector.zeros[Double](size) 
     val Ct = C.t 
     // work up from bottom this time 
     for(i <- size -1 to 0 by -1) { 
     var sum = 0. 
     for(j <- i + 1 until size) { 
      sum += Ct(i,j) * x(j) 
     } 
     x(i) = (y(i) - sum)/Ct(i,i) 
     } 
     x 
    } 
} 
関連する問題