实际上下面的代码是做什么的? 特别是指数一......
据我了解, 对于“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
答案 0 :(得分:2)
根据我的理解,对于“A,b = create_matrix_1(4,4)”矩阵A. 是16 * 16; b是16 * 1
不一定:在上面的代码中,我们没有函数lil_matrix
和zeros
的定义。 for
循环之前的语句只表示当A
作为元组传递给它时,lil_matrix
等于函数(n*m, n*m)
返回的值。另一方面,b
等于函数zeros
返回的值,当您传递给它n*m
时。
然后是循环部分。 基本上,有两个嵌套循环,即有两个迭代器,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
,然后我们再次遍历{的所有值{1}}:
j
3)然后我们为5 1+0*4
6 1+1*4
7 1+2*4
8 1+3*4
,i=2
等重复相同的周期,直至i=3
。
现在我们转到i=n-1
和if
块。对于上述每个周期,如果我们有一个边界值,即else
或i
处于周期的第一次或最后一次迭代(例如j
或{{1 } i
,或j
或= 0
),i=n-1
和j=m-1
的值不再是此答案开头所描述的值,但是根据以A
开头的行之后的两行进行更改。相反,b
或if
的值不是边界值,而是内部节点,i
和j
的值会根据{{之后的行更改1}}陈述。
A
和b
部分中的语句只会更改else
和if
的一些元素,这些元素是数组。查看代码,else
必须是二维数组(矩阵),正如您在问题中正确指出的那样,A
是一维数组(向量)。 (在Python中,顺便说一下,数组实际上是列表,但我将在这里使用通用术语数组)。在b
和A
块中,我们都有b
个关键字:例如if
表示我们要修改的else
的值是index
的第N个值,其中b[index]
= N.对于b
,我们有两个值方括号,因为b
是一个矩阵。顺便说一下,在我看来语法中有一个错误,因为当您在矩阵中选择单个值时,您不使用逗号,例如你不是写index
而是A
(逗号只能在定义矩阵时使用,而不能在选择其中一个值时使用)。但是,A
和A[x, y]
首先使用此代码中未包含的函数创建,因此我们不仅仅了解更多信息。
除了A[x][y]
和A
之外,您需要调查的另一个函数是b
,因为它的定义未包含在此代码中:这在开始时使用创建变量lil_matrix
和zeros
,然后在linspace
块中使用。