1. ホーム
  2. python

[解決済み] 下三角行列の前進代入。どのように?

2022-02-24 02:20:29

質問

ここで質問していいのかどうかわかりませんが、ここで質問します。

次のコードがどのようにxを解くことができるのか、誰か知っていますか? Lx=y ここで、Lとyはそれぞれ与えられた行列とベクトルである?

もし知っていたら、それを分解して、各ステップを紙とペンを使って解く方法と比較してみてください。

def forward(L, y):
    x = []
    for i in range(len(y)):
        x.append(y[i])
        for j in range(i):
            x[i]=x[i]-(L[i, j]*x[j])
        x[i] = x[i]/L[i, i]
    return x

解決方法は?

もしそうでなければ、行列に zip 関数を使用し、y をタプルとして使用します。また、別の形式の三角行列を持つことはあまり意味をなさないので、行列は正方形であると仮定しています。

上三角形から始める以外は、上三角形の場合とよく似ています。

  • 生成されるベクトルの長さに応じた空のリストを作成し、それをゼロで埋めます。
  • リストの最初の行と内積し、その結果をyの最初の要素から引き、最初の項の係数で割ります。
  • 元々空のリストの最初の要素を最終結果で置き換える
  • これを終了するまで続けます。

基本的に、内積を取ることで行っていることは、行列の非ゼロ項をそれぞれ正しい値(すでに見つけた値)で代入し、それらをすべて足し合わせることです。もう一方の端から引き、n行目のn番目の項の係数で割ると、ちょうど解が得られます。

(今、実装例を入力中)。(内積を受け取るクラスや関数があることが前提ですが、ない場合でも実装は難しくないはずです). (パイソン2.7)

def solve(m, y):
    v = [0 for i in xrange(len(m))]
    for i in xrange(len(m)):
        v[i] = (y[i] - v.dotProduct(m[i]))/float(m[i][i])

    return v