0

我是 python 的初学者,正在尝试编写代码来确定导纳矩阵。我的准入名单被定义为 Y_ges

Y_ges = [ 9.89583333-40.47448077j  27.9209622 -10.73883162j
         27.9209622 -10.73883162j  27.9209622 -10.73883162j
         27.9209622 -10.73883162j]

一开始我创建了一个零矩阵并确定了它的大小。

a=np.zeros((len(net.bus),len(net.bus)),dtype=complex)

然后我创建了一个函数来逐行填充矩阵

def fillmatrix(n):
    for i in range(len(n)):
        #print(i)
        if i == 0 :
            zerolist=[0]*len(net.bus)
            print("we are in if loop",i)
            zerolist[i]=Y_ges[i]
            zerolist[i+1]=-Y_ges[i]
            a[i]=zerolist
            #print(zerolist)
            #print(a)
        else:
            print("we are in else loop",i)
            zerolist=[0]*len(net.bus)
            zerolist[i-1]=-Y_ges[i-1]
            zerolist[i]=Y_ges[i-1]+Y_ges[i+1]
            zerolist[i+1]=-Y_ges[i+1]
            a[i]=zerolist
            i+=1
            print(a)
            print("i =",i)
            #print(zerolist)
     
            

fillmatrix(Y_ges)  

我希望这个矩阵

[[  9.89583333-40.47448077j  -9.89583333+40.47448077j
    0.         +0.j           0.         +0.j
    0.         +0.j           0.         +0.j        ]
 [ -9.89583333+40.47448077j  37.81679553-51.21331239j
  -27.9209622 +10.73883162j   0.         +0.j
    0.         +0.j           0.         +0.j        ]
 [  0.         +0.j         -27.9209622 +10.73883162j
   55.8419244 -21.47766323j -27.9209622 +10.73883162j
    0.         +0.j           0.         +0.j        ]
 [  0.         +0.j           0.         +0.j
  -27.9209622 +10.73883162j  55.8419244 -21.47766323j
  -27.9209622 +10.73883162j   0.         +0.j        ]
 [  0.         +0.j           0.         +0.j
    0.         +0.j         -27.9209622 +10.73883162j
  55.8419244 -21.47766323j  -27.9209622 +10.73883162j]
 [  0.         +0.j           0.         +0.j
    0.         +0.j           0.         +0.j
 -27.9209622 +10.73883162j  27.9209622 +10.73883162j]]

但我得到了这个矩阵


[[  9.89583333-40.47448077j  -9.89583333+40.47448077j
    0.         +0.j           0.         +0.j
    0.         +0.j           0.         +0.j        ]
 [ -9.89583333+40.47448077j  37.81679553-51.21331239j
  -27.9209622 +10.73883162j   0.         +0.j
    0.         +0.j           0.         +0.j        ]
 [  0.         +0.j         -27.9209622 +10.73883162j
   55.8419244 -21.47766323j -27.9209622 +10.73883162j
    0.         +0.j           0.         +0.j        ]
 [  0.         +0.j           0.         +0.j
  -27.9209622 +10.73883162j  55.8419244 -21.47766323j
  -27.9209622 +10.73883162j   0.         +0.j        ]
 [  0.         +0.j           0.         +0.j
    0.         +0.j           0.         +0.j
    0.         +0.j           0.         +0.j        ]
 [  0.         +0.j           0.         +0.j
    0.         +0.j           0.         +0.j
    0.         +0.j           0.         +0.j        ]]


和这个错误信息:


 File "/Users/pythonuser/Desktop/Probe code ", line 230, in <module>
   fillmatrix(Y_ges)

 File "/Users/pythonuser/Desktop/Probe code ", line 220, in fillmatrix
   zerolist[i]=Y_ges[i-1]+Y_ges[i+1]

IndexError: index 5 is out of bounds for axis 0 with size 5 

任何想法 ?

4

1 回答 1

0

Numpy 数组是零索引的。它从索引 0 开始,到索引 len-1 处的最后一个元素结束。您不应该在循环中修改 i 。

我已阅读您的代码并了解您想要一个对角矩阵,所以这里是代码:

def fillmatrix(n):
    zeros = np.zeros((len(n)+1, len(n)+3), dtype=n.dtype)
    p = np.pad(n, 1) # padding simplifies the logic, no ifs
    for i in range(len(n)+1):
       zeros[i, i:i+3] = [-p[i], p[i]+p[i+1], -p[i+1]]
    return zeros[:, 1:-1]
于 2021-04-11T18:41:20.543 回答