-2

下面的代码实际上在做什么?..特别是索引一......

据我了解,对于“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_matrixzeros. 循环之前的语句for只说当值作为元组传递给它时,它A等于函数返回的值。另一方面等于函数返回的值,当你传递给它时。lil_matrix(n*m, n*m)bzerosn*m

然后是循环部分。基本上有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=0j=m-1,已经循环通过,我们增加i,然后我们再次遍历 的所有值j

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

3) 然后我们对 等重复相同的循环i=2i=3直到i=n-1

现在我们进入ifandelse块。对于上面描述的每个循环,如果我们有一个边界值,即在循环的第一次或最后一次迭代中要么 要么 要么 要么 要么 要么 要么,i那么和的值不再是在这个答案的开头,但是根据以开头的行之后的两行进行更改。相反,如果or的值不是边界值,而是内部节点,则 和 的值根据语句后面的行进行更改。jij= 0i=n-1j=m-1AbifijAbelse

if和 部分中的语句else都只改变了 和 的一些元素Ab它们是数组。查看代码,A必须是二维数组(矩阵),正如您在问题中正确指出的那样,并且b是一维数组(向量)。(顺便说一下,在 Python 中,数组实际上是列表,但我将在这里使用通用术语数组)。在ifandelse块中我们都有index关键字:egb[index]表示b我们正在修改的值是 的第 N 个值b,其中index= N。因为A我们在方括号中有两个值,因为A是一个矩阵。顺便说一句,我认为语法有一个错误,因为当您在矩阵中选择单个值时,您不使用逗号,例如您不写A[x, y]但是A[x][y](逗号只能在定义矩阵时使用,而不是当您选择其值之一时)。但是,两者Ab都是首先使用此代码中未包含的函数创建的,因此我们不知道更多。

除了lil_matrixand之外zeros,您需要研究的另一个函数是linspace: this 在开始时用于创建变量xy然后在if块中使用,因为它的定义未包含在此代码中。

于 2013-04-27T07:18:08.773 回答