1

これが質問するのに適切な場所かどうかはわかりませんが、ここに行きます。

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

わかっている場合は、それを分解して、各ステップをペンと紙で解決する方法と比較していただけますか?

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
4

1 に答える 1

5

マトリックスを行のリスト (リスト) として表していると仮定しています。そうでない場合は、マトリックスで 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
于 2013-04-22T21:54:30.177 に答える