用Python编写潮流程序(牛拉直角坐标法)

我的2021年的开篇作~~,无非是把自己之前用到的写进博客里面。~~
今天写的是牛顿-拉夫逊法的直角坐标方式求解潮流程序,这类代码在m文件里面已经出现很多,但是Python中比较少,所以今天我先占个位置。

首先理解一下牛顿-拉夫逊法,它其实是一种以逼近的思想去求解最终解,最简单的公式是:

牛顿拉夫逊法公式
在求解潮流计算时,比较好用的是直角坐标系的方法,一般网络可以求解的话,15次内就可以迭代出最终解,其方程是这样子的(这里偷一下懒,直接照搬文库里的书本内容):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
公式就以上几个,用起来的话其实还是容易的,不要把逻辑混乱就可以了,那么接下来讲一下代码部分。

num_Y = size(Y,1)
#Y为网络的节点矩阵
    n=size(Y,1)-1
    if n == 5:
        PVlist = [4]
    else:
        PVlist = [29,30,31,32,33,34,35,36,37]
    #有一个是平衡节点,故减去1,n=5,num_Y=6,这里用PVlist是保存平衡节点的序号,在下面会用别的公式计算
    J=mat(zeros((2*n,2*n)))
    #J矩阵为雅克比矩阵,大小为2*n
    for i in range(n):
        #i为行数
        for j in range(n):
            #j为列数
            if i in PVlist:
                if i==j:
                    J[2*i,j*2] = sum([-(Y[i,k].real*U[k].real-Y[i,k].imag*U[k].imag) for k in range(num_Y)]) - Y[i,i].real*U[i].real-Y[i,i].imag*U[i].imag
                    J[i*2,j*2+1] = sum([-(Y[i,k].real*U[k].imag + Y[i,k].imag*U[k].real) for k in range(num_Y)]) + Y[i,i].imag*U[i].real-Y[i,i].real*U[i].imag
                    J[i*2+1,j*2]=-2*U[i].real
                    J[i*2+1,j*2+1] = -2*U[i].imag
                else:
                    J[i * 2, j * 2] = -(Y[i, j].real * U[i].real + Y[i, j].imag * U[i].imag)
                    J[i * 2, j * 2 + 1] = Y[i, j].imag * U[i].real - Y[i, j].real * U[i].imag
                    J[i*2+1,j*2] = 0
                    J[i*2+1,j*2+1] = 0
            elif i == j:
                J[i*2,j*2] = sum([-(Y[i,k].real*U[k].real-Y[i,k].imag*U[k].imag) for k in range(num_Y)]) - Y[i,i].real*U[i].real-Y[i,i].imag*U[i].imag
                J[i*2,j*2+1] = sum([-(Y[i,k].real*U[k].imag + Y[i,k].imag*U[k].real) for k in range(num_Y)]) + Y[i,i].imag*U[i].real-Y[i,i].real*U[i].imag
                J[i*2+1,j*2] = sum([Y[i,k].real*U[k].imag+Y[i,k].imag*U[k].real for k in range(num_Y)]) + Y[i,i].imag*U[i].real - Y[i,i].real*U[i].imag
                J[i*2+1,j*2+1] = sum([-(Y[i,k].real *U[k].real - Y[i,k].imag*U[k].imag) for k in range(num_Y)]) + Y[i,i].real*U[i].real+Y[i,i].imag*U[i].imag
            else:
                J[i*2,j*2] = -(Y[i,j].real*U[i].real+Y[i,j].imag*U[i].imag)
                J[i*2+1,j*2+1] = -J[i*2,j*2]
                J[i*2,j*2+1] = Y[i,j].imag*U[i].real - Y[i,j].real*U[i].imag
                J[i*2+1,j*2] = J[i*2,j*2+1]
    J_inv = J.I
    # print(J_inv)
    delta_U = -J_inv*delta_w
    #delta_U为节点电压修正量
# print(delta_U)


在求得最后的电压修正量后,得到迭代的电压,又把P,Q向量求出来,如下:

   n=size(mat(P))
    num_Y = size(Y, 1)
    U=fix_U
    if n == 5:
        PVlist = [4]
    else:
        PVlist = [29,30,31,32,33,34,35,36,37]
    delta_w = mat(ones((n*2,1)))
    for i in range(n):
        if i in PVlist:
            delta_w[i*2,0] = P[i] - U[i].real*sum([Y[i,k].real*U[k].real -Y[i,k].imag*U[k].imag for k in range(num_Y)])-U[i].imag*sum([Y[i,k].real*U[k].imag + Y[i,k].imag*U[k].real for k in range(num_Y)])
            delta_w[i*2+1,0] = statU[i]**2 -  abs((U[i])**2)
            #奇数是PU节点的幅值
        else:
            delta_w[i*2,0] = P[i] - U[i].real*sum([Y[i,k].real*U[k].real -Y[i,k].imag*U[k].imag for k in range(num_Y)])-U[i].imag*sum([Y[i,k].real*U[k].imag + Y[i,k].imag*U[k].real for k in range(num_Y)])
            delta_w[i*2+1,0] = Q[i] - U[i].imag*sum([Y[i,k].real*U[k].real - Y[i,k].imag*U[k].imag for k in range(num_Y)]) + U[i].real * sum([Y[i,k].real*U[k].imag+Y[i,k].imag*U[k].real for k in range(num_Y)])
        #delta_w为8*1向量```

在新的一年,希望大家牛气冲天。
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用Python编写潮流计算的极坐标,我们可以首先通过输入平面直角坐标系中的实部和虚部获取复数形式的坐标。然后,我们可以使用Python中的cmath模块将复数形式的坐标转换为极坐标。 以下是一个实现示例: ```python import cmath def convert_to_polar(x, y): # 将实部和虚部转换为复数形式的坐标 z = complex(x, y) # 使用cmath模块的polar函数将复数形式的坐标转换为极坐标 r, theta = cmath.polar(z) # 将弧度转换为角度 theta_degrees = cmath.degrees(theta) # 返回极坐标的模长和相位角(以度为单位) return r, theta_degrees # 输入平面直角坐标系中的实部和虚部 x = float(input("请输入实部:")) y = float(input("请输入虚部:")) # 转换为极坐标 r, theta = convert_to_polar(x, y) # 输出极坐标结果 print("极坐标形式:", r, "∠", theta, "度") ``` 使用这个脚本,您可以输入平面直角坐标系中的实部和虚部,然后得到极坐标形式的结果。示例输出可能如下所示: ``` 请输入实部:3 请输入虚部:4 极坐标形式: 5.0 ∠ 53.13010235415599 度 ``` 这表示复数3 + 4i可以用极坐标的方式表示为5.0 ∠ 53.13度。 ### 回答2: 要用Python编写潮流计算的极坐标,首先需要准备好需要计算的数据。一般来说,潮流计算需要的数据包括节点信息、支路信息、发电机信息和负载信息。 在Python中,可以使用字典(dictionary)的数据结构来存储各个节点的信息,每个节点的信息包括节点名称、电压幅值、电压相角和注入功率。字典中的每一个键值对代表一个节点。 支路的信息可以使用列表(list)的数据结构来存储,每个支路的信息包括起始节点、终止节点、支路阻抗、支路导纳和支路功率。 发电机信息和负载信息可以使用类(class)的概念来实现。通过定义发电机类和负载类,可以构建出发电机对象和负载对象。每个发电机对象和负载对象的属性包括节点名称、电压幅值、电压相角和注入功率。 一旦准备好了各个节点的信息,就可以进行潮流计算的极坐标。这里的潮流计算一般包括以下几个步骤: 1. 初始化节点的电压幅值和相角,一般可以设定一个初始值。 2. 根据节点的负载信息,计算负载节点的注入功率。 3. 根据节点的发电机信息,计算发电机节点的注入功率。 4. 根据节点的支路信息,计算各个支路的功率传输情况。 5. 根据功率传输情况,更新节点的电压幅值和相角。 6. 重复以上步骤,直到计算得到收敛的结果。 以上是简单的潮流计算的极坐标的实现思路,通过Python的数据结构和面向对象的编程方,可以比较方便地完成这些计算。当然,具体的实现还需要根据实际情况来进行调整和细化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值