-2

次のコードは実際に何をしていますか?..特に、インデックス 1...

私の理解では、「A,b = create_matrix_1(4,4)」の場合、行列 A は 16*16 です。bは16*1

この問題を理解するのに苦労しています。どんな洞察でもいただければ幸いです

def create_matrix_1(n,m,force=0.0): 
    """ 
      Create a matrix associated with a tension force to a membrane. 
      The domain is represented by a 2D grid of size n*m 
    """ 

    hx = 1.0/(n-1) 
    hy = 1.0/(m-1) 

    hx2 = 1.0/hx**2 
    hy2 = 1.0/hy**2 

    x = linspace(0,1,n) 
    y = linspace(0,1,m) 

    A = lil_matrix((n*m, n*m)) 
    b = zeros(n*m) 
    for i in range(n): 
            for j in range(m): 
                    index = i + j*n 
                    if( i==0 or i==n-1 or j==0 or j==m-1): # Boundary nodes 
                            b[index] = saddle_function(x[i],y[j]) 
                            A[index,index] = 1.0 
                    else: # Interior Nodes 
                            b[index] = force 
                            A[index,index] = -2.0*(hx2 + hy2) 
                            A[index,index+1] = hx2 
                            A[index,index-1] = hx2 
                            A[index,index+n] = hy2 
                            A[index,index-n] = hy2 
    return A,b
4

1 に答える 1

2

私の理解では、「A,b = create_matrix_1(4,4)」の場合、行列 A は 16*16 です。bは16*1

必ずしもそうとは限りません: 上記のコードには、関数lil_matrixおよびの定義がありませんzerosforループの前のステートメントは、値がタプルとして関数に渡されたときにA関数によって返される値と等しいことを示しているだけです。一方、関数に渡すと、関数によって返される値と等しくなります。lil_matrix(n*m, n*m)bzerosn*m

続いてループセクション。基本的に、2 つのネストされたループがあります。つまり、2 つのイテレータ i と j があり、それぞれ 0 から n-1 と 0 から m-1 にインクリメントされます。したがって、n = 4 および m = 4 と仮定すると、次のようになります。

1) のすべての値を反復処理することから始めjますi=0

Iteration    Value of index

1            0+0*4
2            0+1*4
3            0+2*4
4            0+3*4

2)jからj=0までのすべての値が繰り返されたj=m-1ので、 をインクリメントiし、再び のすべての値を反復処理しますj

5            1+0*4
6            1+1*4
7            1+2*4
8            1+3*4

i=23) 次に、i=3まで同じサイクルを繰り返しi=n-1ます。

if次にandelseブロックに行きます。上記のサイクルのそれぞれについて、境界値がある場合、つまり または のいずれijがサイクルの最初または最後の反復にある場合 (たとえば、iまたはj= 0、 または のいずれi=n-1か)、およびj=m-1の値は、 で説明されているものではなくなります。この回答の冒頭ですが、で始まる行の後の2行に従って変更されます。またはの値が境界値ではなく、内部ノードである場合、およびの値はステートメントの後の行に従って変更されます。AbifijAbelse

ifセクションのとの両方のステートメントは、配列であるとelseの要素の一部のみを変更します。コードを見ると、質問で正しく指摘したように、2 次元配列 (行列) である必要があり、1 次元配列 (ベクトル) です。(ちなみに、Python では、配列は実際にはリストですが、ここでは配列という一般的な用語を使用します)。とブロックの両方にキーワードがあります: egは、変更する の値が の N 番目の値であることを意味します。ここで、= Nです。角括弧内に 2 つの値があるため、AbAbifelseindexb[index]bbindexAA行列です。A[x, y]ちなみに、私の意見では、マトリックスで単一の値を選択するときにコンマを使用しないため、構文にエラーがありますA[x][y]。 、その値の 1 つを選択したときではありません)。ただし、両方ともAbこのコードに含まれていない関数を使用して最初に作成されるため、それ以上のことはわかりません。

と以外lil_matrixzeros、その定義がこのコードに含まれていないため、調査する必要がある他の関数は ですlinspace。これは変数を作成するために最初にx使用yされ、その後ifブロックで使用されます。

于 2013-04-27T07:18:08.773 に答える