如何在Python中创建对称的三对角矩阵?

时间:2018-05-15 12:42:36

标签: python

主题末尾有一个新的编辑。 我是Python的新手,我想知道如何制作一个简单的三对角矩阵NxN。 我有三个矢量将通过循环更新。

我正在使用这样的东西: Example

注意:我只想知道零和我可以用什么Python参数来调整它。 好吧,我这里有两个代码,我在Fortran中编写的第一个代码,它运行正常。第二个是我用Python编写的内容。

的Fortran:

do i=2,n-1
  do j=2,n-1
    if (i.eq.j) then

      D(i,j+1)=-u_med(i+1)/(delta_r(i)*delta_r(i+1))

      t1 =u_med(i+1)/(delta_r(i)*delta_r(i))

      t2 = u_med(i)/(delta_r(i)*delta_r(i))

      D(i,j)= t1 + t2 + V(i)

      D(i+1,j)=-u_med(i+1)/(delta_r(i)*delta_r(i+1))

    end if

  end do
end do

的Python:

for i in range(2,n):
  for j in range(2,n):
    if i == j:
      D[i][j+1] = - u_med[i+1]/(delta_r[i]*delta_r[i+1])
      t1 = u_med[i+1]/(delta_r[i]*delta_r[i])
      t2 = u_med[i]/(delta_r[i]*delta_r[i])
      D[i][j]= t1 + t2 + V[i]
      D[i+1][j]= - u_med[i+1]/(delta_r[i]*delta_r[i+1])

t1 = u_med[2]/(delta_r[1]*delta_r[1])
t2 = 0
D[1][1]= t1 + t2 + V[1]
D[1][2]= - u_med[2]/(delta_r[1]*delta_r[2])
D[2,1]= - u_med[2]/(delta_r[2]*delta_r[1])
t1 = 0
t2 = u_med[n]/(delta_r[n]*delta_r[n])

D[n][n]= t1 + t2 + V[n]

出现错误:

  

D [i] [j + 1] = - u_med [i + 1] /(delta_r [i] * delta_r [i + 1])ValueError:设置   一个带序列的数组元素。

基于上图的示例: example

评论:

u_med

u_med = np.zeros((n,2))
for i in range(2,n):
  tta1 = r[i]*u[i]
  tta2 = r[i-1]*u[i-1]
  u_med[i] = 0.5*(tta1 + tta2)/(r[i] - r[i-1])

u_med[1] = u_med[2]

delta_r

delta_r = np.zeros((n-1,2))
for i in range(2,n-1):
  ft1 = r[i+1]*r[i+1]
  ft2 = r[i-1]*r[i-1]
  ft3 = 2*r[i]*(r[i+1] - r[i-1])
  delta_r[i] = math.sqrt(0.125*abs(ft1 - ft2 + ft3))

rn

ri=0
n1 = 51

r1 = ri
r2 = 250
hr1 = (r2-r1)/(n1-1)

r = np.zeros((n1,1))
for i in range(n1):
  r[i] = r1 + i*hr1

u = np.zeros((n+1,1))
for i in range(1,n+1):
  i = 1

对于D

D = npm.zeros((n,n))

修改:这似乎是因为u_meddelta_r是二维的,我正试图在D中将其分配为不兼容形状。它适用于Fortran,但我如何在Python中以不同方式处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

如果您将对角线创建为数组或列表,则可以使用Their wiki创建对角矩阵并将它们添加到一起。

D = np.diag(x) + np.diag(x1, 1) + np.diag(x1, -1)

创建矩阵。也许像是

A = mu[1:]/h[1:]**2 + mu[:1]/h[1:]**2 + U[1:]
B = mu[1:]/ (h[:-1]*h[1:])
D = np.diag(A) + np.diag(B, 1) + np.diag(B, -1)

离开您关联的图片。