目录
概述
Gauss-Seidel(G-S)法是一种常用的潮流计算方法,用于解决电力系统中的潮流问题。其基本思想是通过迭代计算,不断更新节点电压和功率,直到满足收敛条件为止。
其优点是简单易实现,收敛速度较快。然而,由于G-S法是一种迭代计算方法,也可能会出现不收敛的情况,具体问题具体分析。
代码实现
0.导入所需库
import time
import numpy as np
import tkinter as tk
1.形成节点导纳矩阵
n = input("请输入节点个数:")
'''
mat = []
sap = []
'''
theta = float(input("请输入功率因数角:"))
m = np.zeros((int(n), int(n)))
for t in range(int(n)):
m[t][t] = float(input(f"请输入第{t + 1}节点的自导纳:"))
if t > 0:
for c in range(t):
m[c][t] = m[t][c] = float(input(f"请输入第{t + 1}-{c + 1}节点互导纳:"))
time.sleep(0.1)
#print(f"{m}\nx\n{m}\n=\n{m * m}")
print(f"节点导纳矩阵为\n{m}")
2.预设电压初值和无功值
U = []
U_1 = []
Q = []
P = []
for a in range(int(n)):
U_0 = float(input(f"请输入{a + 1}节点的电压初值:"))
Q_0 = float(input(f"请输入注入{a + 1}节点的无功:"))
P_0 = float(input(f"请输入注入{a + 1}节点的有功:"))
U.append(U_0), Q.append(Q_0), P.append(P_0), U_1.append(U_0)
- 对于发电机节点:根据功率注入和节点电压得到电流注入,然后通过导纳得到其他节点的电流注入,并更新节点电压。
- 对于负荷节点:根据功率消耗和节点电压得到电流注入,并更新节点电压。
- 对于支路:根据节点电压差和导纳得到支路电流,更新节点电压。
3.设置迭代次数
k = int(input("请输入迭代次数:"))
def diedai(i, U):
i = i
# i为节点编号,Yii = m[i][i]
# Yij = m[i][for j in range(i)]
U_ = (complex(float(P[i]), - float(Q[i])) / U[i])
for b in range(int(n) - 1):
if b + 2 != i and b + 2 < int(n):
U_ = U_ - m[i][b + 2] * U[b + 2]
return U_
#迭代式
4.计算精度
for k_ in range(k):
for i in range(int(n)):
U[i] = diedai(i, U)
5.通过前后精度判断收敛
if k - 1 != 0:
for k_1 in range(k - 1):
for i in range(int(n)):
U_1[i] = diedai(i, U)
#print(f"精度差:{U[0] - U_1[0]}")
print(U)
S = []
for t in range(int(n)):
s = complex(U[t] * np.cos(theta), U[t] * np.sin(theta))
S.append(s)
6.简易人机交互界面(tk)
def root_tk():
root = tk.Tk()
root.geometry("800x840")
root.title("G-S法潮流计算")
photo = tk.PhotoImage(file="back_0.gif")
theLabel = tk.Label(root,
text="", # 内容
justify=tk.LEFT, # 对齐方式
image=photo, # 加入图片
compound=tk.CENTER, # 关键:设置为背景图片
font=("华文行楷", 20), # 字体和字号
fg="black") # 前景色
theLabel.pack()
lb1 = tk.Label(text="请输入节点个数:", fg="blue", bg="lightblue")
en1 = tk.Entry(fg="blue", bg="lightblue")
en1.place(relx=0.33, rely=0.12, relheight=0.06, relwidth=0.3)
lb1.place(relx=0.11, rely=0.13)
lb2 = tk.Label(text="请依次输入节点自导纳(用逗号隔开)):", fg="blue", bg="lightblue")
en2 = tk.Entry(fg="blue", bg="lightblue")
en2.place(relx=0.2, rely=0.26, relheight=0.06, relwidth=0.45)
lb2.place(relx=0.11, rely=0.21)
lb3 = tk.Label(text="请依次输入节点互导纳(用逗号隔开)):", fg="blue", bg="lightblue")
en3 = tk.Entry(fg="blue", bg="lightblue")
en3.place(relx=0.2, rely=0.4, relheight=0.06, relwidth=0.45)
lb3.place(relx=0.11, rely=0.35)
lb4 = tk.Label(text="请依次节点电压(初值,有功,无功;初值……)):", fg="blue", bg="lightblue")
en4 = tk.Entry(fg="blue", bg="lightblue")
en4.place(relx=0.2, rely=0.54, relheight=0.06, relwidth=0.45)
lb4.place(relx=0.11, rely=0.49)
lb3 = tk.Label(text="请输入迭代次数:", fg="blue", bg="lightblue")
en3 = tk.Entry(fg="blue", bg="lightblue")
en3.place(relx=0.33, rely=0.62, relheight=0.06, relwidth=0.1)
lb3.place(relx=0.11, rely=0.63)
lb4 = tk.Label(text="确定", relief="raised", fg="blue", bg="lightblue")
lb4.place(relx=0.11, rely=0.73)
txt = en1.get()
print(txt)
root.mainloop()
root_tk()
觉得有帮助的小伙伴还请点个关注
后续会持续分享 免费、高质量 的高校相关以及Python学习文章