用MATLAB编写牛拉法潮流计算(电力系统稳态分析)

系列文章目录

用MATLAB形成节点导纳矩阵



前言

本文通过编写m语言实现牛拉法求潮流计算,所用电力网络图是《用MATLAB形成节点导纳矩阵》中的第一张图。
在这里不讲解牛拉法原理,只贴出代码和相关步骤。


一、程序

n=input('n=');
nl=input('nl=');
isb=input('isb=');
pr=input('pr=');
B1=input('B1=');
B2=input('B2=');
X=input('X=');
Y=zeros(n);e=zeros(1,n);f=zeros(1,n);V=zeros(1,n);O=zeros(1,n);S1=zeros(nl);
for i=1:n
    if X(i,2)~=0;
        p=X(i,1);
        Y(p,p)=1./X(i,2);
    end
end
for i=1:nl
    if B1(i,6)==0
        p=B1(i,1);q=B1(i,2);
    else p=B1(i,2);q=B1(i,1);
    end
    Y(p,q)=Y(p,q)-1./(B1(i,3)*B1(i,5));
    Y(q,p)=Y(p,q);
    Y(q,q)=Y(q,q)+1./(B1(i,3)*B1(i,5)^2)+B1(i,4)./2;
    Y(p,p)=Y(p,p)+1./B1(i,3)+B1(i,4)./2;
end 
G=real(Y);B=imag(Y);
for i=1:n
    e(i)=real(B2(i,3));
    f(i)=imag(B2(i,3));
    V(i)=B2(i,4);
end
for i=1:n
    S(i)=B2(i,1)-B2(i,2);
    B(i,i)=B(i,i)+B2(i,5);
end
P=real(S);Q=imag(S);
ICT1=0;IT2=1;N0=2*n;N=N0+1;a=0;
while IT2~=0
    IT2=0;a=a+1;
    for i=1:n
        if i~=isb
            C(i)=0;
            D(i)=0;
            for j1=1:n
                C(i)=C(i)+G(i,j1)*e(j1)-B(i,j1)*f(j1);
                D(i)=D(i)+G(i,j1)*f(j1)+B(i,j1)*e(j1);
            end
            P1=C(i)*e(i)+f(i)*D(i);
            Q1=f(i)*C(i)-D(i)*e(i);
            V2=e(i)^2+f(i)^2;
            if B2(i,6)~=3
                DP=P(i)-P1;
                DQ=Q(i)-Q1;
                for j1=1:n
                    if j1~=isb&j1~=i
                        X1=-G(i,j1)*e(i)-B(i,j1)*f(i);
                        X2=B(i,j1)*e(i)-G(i,j1)*f(i);
                        X3=X2;
                        X4=-X1;
                        p=2*i-1;q=2*j1-1;J(p,q)=X3;J(p,N)=DQ;m=p+1;
                        J(m,q)=X1;J(m,N)=DP;q=q+1;J(p,q)=X4;J(m,q)=X2;
                    elseif j1==i&j1~=isb
                        X1=-C(i)-G(i,i)*e(i)-B(i,i)*f(i);
                        X2=-D(i)+B(i,i)*e(i)-G(i,i)*f(i);
                        X3=D(i)+B(i,i)*e(i)-G(i,i)*f(i);
                        X4=-C(i)+G(i,i)*e(i)+B(i,i)*f(i);
                        p=2*i-1;q=2*j1-1;J(p,q)=X3;J(p,N)=DQ;m=p+1;
                        J(m,q)=X1;J(m,N)=DP;q=q+1;J(p,q)=X4;J(m,q)=X2;
                    end
                end
            else
            DP=P(i)-P1;
            DV=V(i)^2-V2;
            for j1=1:n
                if j1~=isb&j1~=i
                    X1=-G(i,j1)*e(i)-B(i,j1)*f(i);
                    X2=B(i,j1)*e(i)-G(i,j1)*f(i);
                    X5=0;
                    X6=0;
                    p=2*i-1;q=2*j1-1;J(p,q)=X5;J(p,N)=DV;m=p+1;
                    J(m,q)=X1;J(m,N)=DP;q=q+1;J(p,q)=X6;J(m,q)=X2;
                    elseif j1==i&j1~=isb
                       X1=-C(i)-G(i,i)*e(i)-B(i,i)*f(i);
                       X2=-D(i)+B(i,i)*e(i)-G(i,i)*f(i);
                       X5=-2*e(i);
                       X6=-2*f(i);
                       p=2*i-1;q=2*j1-1;J(p,q)=X5;J(p,N)=DV;m=p+1;
                       J(m,q)=X1;J(m,N)=DP;q=q+1;J(p,q)=X6;J(m,q)=X2;
                end
            end
        end
    end
end
for k=3:N0
    k1=k+1;N1=N;
    for k2=k1:N1
        J(k,k2)=J(k,k2)./J(k,k);
    end
    J(k,k)=1;
    if k~=3
        k4=k-1;
        for k3=3:k4
            for k2=k1:N1
                J(k3,k2)=J(k3,k2)-J(k3,k)*J(k,k2);
            end
            J(k3,k)=0;
        end
        if k==N0,break;end
        for k3=k1:N0
            for k2=k1:N1
                J(k3,k2)=J(k3,k2)-J(k3,k)*J(k,k2);
            end
            J(k3,k)=0;
        end
    else
        for k3=k1:N0
            for k2=k1:N1
                J(k3,k2)=J(k3,k2)-J(k3,k)*J(k,k2);
            end
            J(k3,k)=0;
        end
    end
end
for k=3:2:N0-1
    L=(k+1)./2;
    e(L)=e(L)-J(k,N);
    k1=k+1;
    f(L)=f(L)-J(k1,N);
end
for k=3:N0
    DET=abs(J(k,N));
    if DET>=pr
        IT2=IT2+1;
    end
end
ICT2(a)=IT2;
ICT1=ICT1+1;
for k=1:n
    dy(k)=sqrt(e(k)^2+f(k)^2);
end
for i=1:n
    Dy(ICT1,i)=dy(i);
end
end
disp('迭代次数');
disp(ICT1);
disp('没有达到精度要求的个数');
disp(ICT2);
for k=1:n
    V(k)=sqrt(e(k)^2+f(k)^2);
    O(k)=atan(f(k)./e(k))*180./pi;
end
E=e+f*j;
disp('各节点的实际电压标幺值E为(节点号从小到大排列):');
disp(E);
disp('各节点的电压大小V为(节点后从小到大排列):');
disp(V);
disp('各节点的电压相角O为(节点号从小到大排列):');
disp(O);
for p=1:n
    C(p)=0;
    for q=1:n
        C(p)=C(p)+conj(Y(p,q))*conj(E(q));
    end
    S(p)=E(p)*C(p);
end
disp('各节点的功率S为(节点号从小到大排列):');
disp(S);
disp('各条支路的首端功率Si为(顺序同您输入B1时一样):');
for i=1:nl
    if B1(i,6)==0
        p=B1(i,1);q=B1(i,2);
    else p=B1(i,2);q=B1(i,1);
    end
    Si(p,q)=E(p)*(conj(E(p))*conj(B1(i,4)./2)+(conj(E(p)*B1(i,5))-conj(E(q)))*conj(1./(B1(i,3)*B1(i,5))));
    disp(Si(p,q));
end
disp('各条支路的末端功率Sj为(顺序同您输入B1时一样):');
for i=1:nl
    if B1(i,6)==0
        p=B1(i,1);q=B1(i,2);
    else p=B1(i,2);q=B1(i,1);
    end
    Sj(q,p)=E(q)*(conj(E(q))*conj(B1(i,4)./2)+(conj(E(q)./B1(i,5))-conj(E(p)))*conj(1./(B1(i,3)*B1(i,5))));
    disp(Sj(q,p));
end
disp('各条支路的功率损耗DS为(顺序同您输入B1时一样):');
for i=1:nl
    if B1(i,6)==0
        p=B1(i,1);q=B1(i,2);
    else p=B1(i,2);q=B1(i,1);
    end
    DS(i)=Si(p,q)+Sj(q,p);
    disp(DS(i));
end
for i=1:ICT1
    Cs(i)=i;
end
disp('这是每次迭代后各节点的电压值(如图所示)');
plot(Cs,Dy),xlabel('迭代次数'),ylabel('电压'),title('电压迭代次数曲线');

二、输入原始数据

1)节点数n=5
2)支路数nl=5
3)支路参数矩阵B1=[1,2,0.03i,0,1.05,0;2,3,0.08i+0.3i,0.5i,1,1;2,5,0.1+0.35i,0,1,1;3,5,0.04+0.25i,0.5i,1,1;3,4,0.015i,0,1.05,0]
它包括六个数据[i,j,z,b,t,it],i,j为支路两端节点号,z为支路的阻抗,b为线路电纳,t为变比,it为高低压侧标志(高为1,低为0)。
4)初始给定值矩阵B2=[0,0,1.05,1.05,0,1;0,3.7+1.3i,1,1.05,0,2;0,2+1i,1,1.05,0,2;0,1.6+0.8i,1,1.05,0,2;5,0,1.05,1.05,0,3]
①节点所接发电机功率SG
②节点负荷功率SL
③节点电压的初始值
④PV节点电压的给定值
⑤节点所接无功补偿设备的容量
⑥节点编号igl
平衡节点为1,PQ节点为2,PV节点为3
5)节点对地阻抗矩阵X=[1,0;2,0;3,0;4,0;5,0](由节点号与接地阻抗构成)。
6)收敛精度 pr=1e-6(一般来说工程上是1e-6到1e-7)

在这里插入图片描述

三、所求潮流计算

在这里插入图片描述
每次迭代后各节点电压值


总结

通过不断迭代,牛拉法可以得到电力系统潮流的准确解。它是一种常用且有效的方法,可用于计算电力系统的稳态运行状态。

  • 46
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 牛拉法(Gauss-Seidel method)是一种常用于电力系统潮流计算的数值迭代方法,也是matlab电力系统潮流计算中常使用的一种方法。 牛拉法的基本原理是通过电力系统节点的功率平衡方程,通过迭代计算节点电压和相应的无功变量,直至收敛得到电力系统的潮流分布。 在matlab中进行牛拉法电力系统潮流计算,需要首先给定电网的节点数、发电机和负荷的功率信息,以及输电线路的导纳和导纳矩阵等。然后,通过编写代码实现牛拉法迭代的过程,直至满足收敛条件为止。 在每一次迭代中,首先假设节点电压和无功变量的初值,然后利用节点功率平衡方程和节点支路导纳的等式,计算各节点的注入功率和无功变量。接着,根据节点注入功率和无功变量以及节点电压模、相角的关系式,求解节点的电压。最后,检查迭代误差是否满足收敛条件,若满足则结束迭代,否则继续迭代直到满足收敛条件。 通过matlab实现牛拉法电力系统潮流计算,可以方便地处理大规模的电网,提高计算的效率和准确性。同时,matlab提供了丰富的数值计算和图形绘制函数,可以对计算结果进行可视化,便于分析和优化电力系统的潮流分布。 ### 回答2: 牛拉法是一种常用的电力系统潮流计算方法,也是MATLAB中常用的算法之一。其基本原理是通过迭代计算节点电压和无穷大元法进行潮流计算。 在进行潮流计算时,首先需要输入电力系统的拓扑结构和负荷信息,包括节点间的支路导纳矩阵和节点的功率载荷信息。然后,根据提供的初始猜测电压值,通过牛拉法进行迭代计算,直到收敛或达到最大迭代次数为止。 具体而言,牛拉法的计算过程如下: 1. 初始化节点电压矩阵,即将初始猜测电压值赋给节点电压矩阵。 2. 计算节点注入功率矩阵,即将节点电压矩阵和负荷信息代入电流平衡方程中计算节点注入功率。 3. 计算雅可比矩阵,为了加速迭代过程,需要计算雅可比矩阵,即节点注入功率对节点电压的一阶偏导数。 4. 解算更新后的节点电压,即通过求解矩阵方程式,将节点注入功率和雅可比矩阵代入,求解更新后的节点电压矩阵。 5. 判断收敛条件,如果迭代次数达到最大值或节点电压变化小于规定的容许误差,则认为潮流计算已经收敛。 6. 输出计算结果,包括节点电压和潮流数据。 MATLAB提供了丰富的数值计算工具和优化算法,可以方便地实现牛拉法潮流计算。同时,通过MATLAB编程的灵活性,可以根据具体需求进行算法优化和计算结果的可视化展示。 ### 回答3: 牛拉法是一种常用的电力系统潮流计算方法,也是一种迭代算法。其基本原理是根据功率平衡方程和节点电压方程,通过迭代计算得到系统各节点的电压、相角和有功、无功功率等参数。 牛拉法的计算步骤如下: 1. 假设各节点的电压幅值和相角。 2. 利用功率平衡方程和节点电压方程,计算每个节点的功率注入和注出。 3. 根据节点的功率注入和注出计算每个节点的电压修正值,即校正节点电压幅值和相角。 4. 重复步骤2和步骤3直到收敛为止,即直到节点电压修正值满足收敛条件。 牛拉法的优势有: 1. 所需计算量相对较小,计算速度较快。 2. 经过多次迭代可得到较精确的结果。 3. 能够处理复杂电力系统,包括非线性和不平衡的情况。 然而,牛拉法也有其局限性: 1. 收敛性不易保证,可能会出现发散现象。 2. 对于大规模系统,计算时间较长。 3. 不适用于高度不平衡或非线性的系统。 总之,牛拉法是一种较为常用和有效的电力系统潮流计算方法,可以用于电力系统稳态分析和运行计算,但在实际应用中可能需要结合其他算法进行优化和完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

le26

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值