matlab配电网分区牛顿拉夫逊法

将最基本牛顿拉夫逊发潮流计算的33节点配电网matlab程序分成三个区域进行分区调度

牛顿-拉夫逊方法是解非线性代数方程组的一种基本方法,在潮流计算中应用很广,33节点也不多,分成三个区域进行分区调度是个好办法

牛顿法

// 牛顿法潮流计算matlab程序
clc;
Y=[1.042093-8.242876i   -0.588235+2.352941i   3.666667i   -0.453858+1.891074i;
-0.588235+2.352941i     1.069005-4.727377i       0        -0.480769+2.403846i;
3.666667i                   0                   -3.333333i            0;
-0.453858+1.891074i      -0.480769+2.403846i       0        0.934627-4.261590i];
%导纳矩阵
e=[1  1  1.1  1.05];%初始电压
f=zeros(4,1);
V=zeros(4,1);%节点电压
Ws=[-0.3 ; -0.18 ; -0.55 ; -0.13 ; 0.5 ; 1.1];%初始功率
W=zeros(6,1);
n=length(Y);%节点数
J=zeros(2*(n-1));%雅可比矩阵
delta_v=zeros(1,6);
delta_w=Ws;
G=real(Y);
B=imag(Y);
S=zeros(4,2);
c=0;%循环次数
m=input('请输入PQ节点数:');
 while max(abs(delta_w))>10^-5
for i=1:(n-1)%以下为求取雅可比矩阵
    for j=1:(n-1)
       if (i~=j)
           J(2*i-1,2*j-1)=-(G(i,j)*e(i)+B(i,j)*f(i));
           J(2*i,2*j)=-J(2*i-1,2*j-1);
           J(2*i-1,2*j)=B(i,j)*e(i)-G(i,j)*f(i);
           J(2*i,2*j-1)=J(2*i-1,2*j);
       end        
    end    
end
for j=1:(n-2)  
      J(6,2*j-1)=0;
      J(6,2*j)=0;   
end%以上为非对角线元素
s1=0;
s2=0;
for i=1:(n-1) 
    for j=1:n
   s1=s1+(G(i,j).*e(j)-B(i,j).*f(j));
   s2=s2+(G(i,j).*f(j)+B(i,j).*e(j));
    end
    J(2*i-1,2*i-1)=-s1-G(i,i) *e(i)-B(i,i)*f(i);
    J(2*i-1,2*i)=-s2+B(i,i) *e(i)-G(i,i)*f(i);
    s1=0;
    s2=0;
end
for i=1:m
    for j=1:n
   s1=s1+G(i,j).*f(j)+B(i,j).*e(j);
   s2=s2+(G(i,j).*e(j)-B(i,j).*f(j));
    end
     J(2*i,2*i-1)=s1+B(i,i) *e(i)-G(i,i)*f(i);
    J(2*i,2*i)=-s2+G(i,i) *e(i)+B(i,i)*f(i);
    s1=0;
    s2=0;
end
J(6,5)=-2*e(3);
J(6,6)=-2*f(3);%对角线元素求解
for i=1:m
    for j=1:n
   s1=s1+e(i)*(G(i,j).*e(j)-B(i,j).*f(j))+f(i)*(G(i,j).*f(j)+B(i,j).*e(j));
   s2=s2+f(i)*(G(i,j).*e(j)-B(i,j).*f(j))-e(i)*(G(i,j).*f(j)+B(i,j).*e(j));   
    end   
      delta_w(2*i-1)=Ws(2*i-1)-s1;
      delta_w(2*i)=Ws(2*i)-s2;   
      W(2*i-1)=s1;
      W(2*i)=s2;
      s1=0;
      s2=0;
end
for j=1:n
    s1=s1+e(3)*(G(3,j).*e(j)-B(3,j).*f(j))+f(3)*(G(3,j).*f(j)+B(3,j).*e(j));
end
delta_w(5)=Ws(5)-s1;
delta_w(6)=(Ws(6)^2-(e(3)^2+f(3)^2));
W(5)=s1;
W(6)=sqrt(e(3)^2+f(3)^2);%以上求功率差值
delta_v=-inv(J)*delta_w;
for i=1:(n-1)
   e(i)=e(i)+delta_v(2*i-1);
   f(i)=f(i)+delta_v(2*i);
end%求电压差值
c=c+1;
 end
 for x=1:4
     V(x)=e(x)+f(x)*1i;     
 end%节点电压
 s1=0;
 for x=3:4
    for j=1:4
       s1=s1+conj(Y(x,j))*conj(V(j));
    end
   S(x,1)=real(V(x)*s1);
   S(x,2)=imag(V(x)*s1);
   s1=0;
 end%PV与平衡节点功率
 for x=1:2
     S(x,1)=W(2*x-1);
     S(x,2)=W(2*x);
 end%节点功率
c  
J
V
S


系统(Distributed Generation,简称DG)成为必然趋势。而选址定容问题是DG建设中必须面临的问题之一。本文提出了一种基于遗传算法求解分布式电源的选址定容问题的方法,并提供了Matlab代码实现。主要包括遗传算法的数学模型、适应度函数、交叉和变异算子以及具体的问题求解流程。

clear all;
clc;
%% 输入数据
% 节点数据
node = xlsread('node_data.xlsx'); % 读取节点数据表
slack = find(node(:,5)==1); % slack节点编号
% 支路数据
line = xlsread('line_data.xlsx'); % 读取支路数据表
num_branch = size(line,1); % 支路数
line_data = [line(:,1:2), line(:,4), line(:,5), line(:,6), line(:,7)]; % 整理支路数据格式
% 返回数据
return_data = xlsread('return_data.xlsx'); % 读取回路数据表
num_return = size(return_data,1); % 回路数
return = zeros(num_return,num_branch); % 初始化回路矩阵
for i = 1:num_return
    index = (return_data(i,1) == line(:,1) & return_data(i,2) == line(:,2))...
        | (return_data(i,2) == line(:,1) & return_data(i,1) == line(:,2)); % 确定支路编号
    return(i,index) = return_data(i,3); % 给回路矩阵相应位置赋值
end
% 潮流计算参数
alpha = 1.2; % 非线性系数
tol = 1e-6; % 允许误差
max_iter = 20; % 最大迭代次数
% 初始值
V0 = node(:,3)+j*node(:,4); % 电压幅值及相角
% 牛顿拉夫逊法计算
V = V0;
iter = 0;
deltaPQ0 = [0;0]; % PQ节点注入有功无功功率初始增量
deltaPV0 = [0]; % PV节点注入有功功率初始增量
delta0 = [deltaPQ0;deltaPV0];
while max(abs(delta0)) > tol && iter < max_iter % 判断误差是否小于允许误差和迭代次数是否超过最大值
    iter = iter + 1; % 迭代次数增加1
    % 计算雅可比矩阵和等效注入复功率向量
    J = zeros(2*sum(node(:,5)==0)-1);
    P = zeros(2*sum(node(:,5)==0)-1,1);
    k = 0;
    for i = 1:size(node,1) % 构造雅可比矩阵和等效注入复功率向量的四个分块
        if node(i,5) ~= 1 % 非slack节点
            % 分别计算四个分块
            J11 = real(sum(V(i)*conj(V(line(:,1)))+(node(i,2)+j*node(i,3))*conj(V(i)))...
                -real(V(i)*conj(V(line(:,2))))...
                +imag(sum(V(i)*conj(V(line(:,1)))+(node(i,2)+j*node(i,3))*conj(V(i))))-imag(V(i)*conj(V(line(:,2))))...
                +alpha*(2*abs(real(V(i)))*abs(real(V(line(:,2))))+2*abs(imag(V(i)))*abs(imag(V(line(:,2)))))/abs(V(line(:,2)))^2)...
                -real(sum(conj(V(i))*(V(line(:,1))+j*line_data(:,4))))...
                +real(V(i)*conj(V(i)))*(node(i,2)+j*node(i,3))...
                +imag(sum(conj(V(i))*(V(line(:,1))+j*line_data(:,4))))...
                -imag(V(i)*conj(V(i)))*(node(i,3)-j*node(i,2));
            J12 = real(sum(conj(V(i)).*V(line(:,2)))...
                +imag(sum(conj(V(i)).*V(line(:,2)))))...
                -real(V(i)*conj(V(line(:,1))))...
                -alpha*(2*abs(real(V(i)))*abs(real(V(line(:,2))))+2*abs(imag(V(i)))*abs(imag(V(line(:,2)))))/abs(V(line(:,2)))^2;
            J13 = -imag(sum(conj(V(i)).*V(line(:,1)))+(node(i,2)-j*node(i,3))*conj(V(i))...
                -(node(i,3)-j*node(i,2))*conj(V(i))*conj(V(i));
            J21 = imag(sum(V(i)*conj(V(line(:,1)))+(node(i,2)-j*node(i,3))*conj(V(i)))...
                -imag(V(i)*conj(V(line(:,2))))...
                -real(sum(V(i)*conj(V(line(:,1)))+(node(i,2)-j*node(i,3))*conj(V(i))))+real(V(i)*conj(V(line(:,2))))...
                +alpha*(2*abs(real(V(i)))*abs(imag(V(line(:,2))))-2*abs(imag(V(i)))*abs(real(V(line(:,2)))))/abs(V(line(:,2)))^2)...
                -imag(sum(conj(V(i))*(V(line(:,1))+j*line_data(:,4))))...
                -imag(V(i)*conj(V(i)))*(node(i,2)+j*node(i,3))...
                -real(sum(conj(V(i))*(V(line(:,1))+j*line_data(:,4))))...
                +real(V(i)*conj(V(i)))*(node(i,3)-j*node(i,2));
            J22 = -imag(sum(conj(V(i)).*V(line(:,2)))...
                +real(sum(conj(V(i)).*V(line(:,2)))))...
                -imag(V(i)*conj(V(line(:,1))))...
                +alpha*(2*abs(real(V(i)))*abs(imag(V(line(:,2))))-2*abs(imag(V(i)))*abs(real(V(line(:,2)))))/abs(V(line(:,2)))^2;
            J23 = real(sum(conj(V(i)).*V(line(:,1)))+(node(i,2)-j*node(i,3))*conj(V(i)))...
                +imag(sum(conj(V(i)).*V(line(:,1)))-(node(i,3)-j*node(i,2))*conj(V(i)))...
                +2*real(V(i)*conj(V(line(:,1))))...
                +alpha*(2*abs(real(V(i)))*abs(imag(V(line(:,2))))-2*abs(imag(V(i)))*abs(real(V(line(:,2)))))/abs(V(line(:,2)))^2;
            J31 = real(conj(V(i))*conj(V(line(:,1))))...
                +real(sum(V(i).*conj(V(line(:,1))))...
                +(node(i,2)-j*node(i,3))*conj(V(i)))...
                -node(i,4);
            J32 = imag(conj(V(i))*conj(V(line(:,1))))...
                +imag(sum(V(i).*conj(V(line(:,1))))...
                +(node(i,3)+j*node(i,2))*conj(V(i)));
            J33 = 2*real(conj(V(i)).*V(i))...
                -sum(return(:,i).*(alpha*2*abs(real(V(i)))*abs(real(V(line(:,2))))...
                +alpha*2*abs(imag(V(i)))*abs(imag(V(line(:,2)))))/abs(V(line(:,2)))^2);
            if node(i,5) == 2 % PQ节点
                k = k + 1;
                J(k,1:end) = [J11,J12,J13];
                P(k,1) = node(i,2) - sum(line_data(:,4).*abs(V).^2.*return(:,i))...
                    - real(sum(conj(V(i)).*(V(line(:,1))+j*line_data(:,4))));
                k = k + 1;
                J(k,1:end) = [J21,J22,J23];
                P(k,1) = node(i,3) - sum(line_data(:,5).*abs(V).^2.*return(:,i))...
                    - imag(sum(conj(V(i)).*(V(line(:,1))+j*line_data(:,4))));
            elseif node(i,5) == 3 % PV节点
                k = k + 1;
                J(k,1:end) = [J31,J32,J33];
                P(k,1) = node(i,2) - sum(line_data(:,4).*abs(V).^2.*return(:,i))...
                    - real(sum(conj(V(i)).*(V(line(:,1))+j*line_data(:,4))));
            end
        end
    end
    % 将雅可比矩阵从三块合成一块
    J11 = J(1:end/2,1:end/2);
    J12 = J(1:end/2,end/2+1:end);
    J21 = J(end/2+1:end,1:end/2);
    J22 = J(end/2+1:end,end/2+1:end);
    % 计算增量
    delta0 = -J\P;
    % 将增量分解成增量有功无功功率和增量有功功率
    deltaPQ = delta0(1:end-1);
    deltaPV = delta0(end);
    deltaV = j*[deltaPQ;deltaPV]./conj(V(~(node(:,5)==1)));
    % 更新电压幅值及相角
    V(~(node(:,5)==1)) = V(~(node(:,5)==1)) + deltaV;
end
% 输出结果
V_abs = abs(V);
V_ang = angle(V);
P = node(:,2) - sum(line_data(:,4).*V_abs.^2.*return,2) - real(sum(conj(V).*(V(line(:,1))+j*line_data(:,4)),2));
Q = node(:,3) - sum(line_data(:,5).*V_abs.^2.*return,2) - imag(sum(conj(V).*(V(line(:,1))+j*line_data(:,4)),2));
P_slack = sum(real(V(slack)*conj(sum(conj(V).*(V(line(:,1))+j*line_data(:,4)),2))));
Q_slack = sum(imag(V(slack)*conj(sum(conj(V).*(V(line(:,1))+j*line_data(:,4)),2))));
fprintf('牛顿拉夫逊法潮流计算结果:\n');
fprintf('    节点  电压幅值(V)  电压相角(deg)  有功功率(P)  无功功率(Q)\n');
for i = 1:size(node,1)
    fprintf('    %3d   %8.4f     %8.4f    %8.4f    %8.4f\n',i,V_abs(i),V_ang(i)*180/pi,P(i),Q(i));
end
fprintf('潮流平衡误差:\n');
fprintf('    有功功率平衡误差 = %.6f kW\n',sum(P));
fprintf('    无功功率平衡误差 = %.6f kVar\n',sum(Q));
fprintf('    感性负载的无功功率消耗 = %.6f kVar\n',sum(Q(Q>0)));
fprintf('    容性负载的无功功率产生 = %.6f kVar\n',sum(Q(Q<0)));
fprintf('电网损耗:\n');
fprintf('    有功损耗 = %.6f kW\n',sum(line_data(:,4).*(abs(V(line(:,1)))-abs(V(line(:,2)))).^2));
fprintf('    无功损耗 = %.6f kVar\n',sum(line_data(:,5).*(abs(V(line(:,1)))-abs(V(line(:,2)))).^2));
fprintf('母线有功功率:\n');
fprintf('    Slack节点有功功率 = %.6f kW\n',P_slack);
fprintf('母线无功功率:\n');
fprintf('    Slack节点无功功率 = %.6f kVar\n',Q_slack);

根据33节点配电网的拓扑结构设计三个区域,使得每个区域之间不存在耦合关系,即每个区域内的节点之间可以相互耦合,但不同区域之间节点之间不能相互耦合。例如,可以将节点分为三组,使得每组之间不存在连接。
在程序中添加相应的区域选项,以标识每个节点所属的区域。需要在读取节点、导纳矩阵等基础数据时,同时读取节点所属区域的信息,并将其保存在相应的数组或矩阵中。可以将节点按照区域进行编号,例如,第一区域的节点按照1-10编号,第二区域的节点按照11-20编号,第三区域的节点按照21-33编号。

参考这个方案试试:https://zhuanlan.zhihu.com/p/635086581

首先,需要注意的是,电力系统中的分区定义了将网络划分为更小且可管理的子网络。在这种情况下,33个节点的配电网可以根据地理接近度或负载分布划分为三个子网。
假设配电网可以分为三个区域,如下所示:
区域1:节点1-11
区域2:节点12-22
区域3:节点23-33
为了将Newton-Raphson潮流计算程序划分为三个区域,可以使用MATLAB索引根据其区域对节点进行分组。你可以从创建三个单独的阵列开始,每个阵列包含每个分区中的节点。例如:
区域1=[1 2 3 4 5 6 7 8 9 10 11];
区域2=[12 13 14 15 16 17 19 20 21 22];
区域3=[23 24 25 26 27 28 29 30 31 32 33];
然后,可以使用这些阵列从主电路矩阵中提取相关的电压和功率值,并为每个区域独立执行Newton-Raphson功率流计算。这样你能够独立地为每个分区安排计算,从而节省时间和计算资源。

不知道题主为啥要研究牛顿法,这个我记得应该是属于一阶的,本质是求根算法, 以下为运行示例及公式推导过程, 如有帮助,给个采纳谢谢,
matlab 运行效果如图所示, 题主需要代码的叫我,

img

img


以上为PQ 节点为 2 和3 的运行结果

公式

牛顿-拉夫逊法(牛顿法),它是一种迭代数值方法,常用于求解非线性方程组。在电力系统中,该方法可以用于计算电力系统的潮流分布。
部分公式说明如下:
假设电力系统中有 $$n$$ 个节点,其中第 $$i$$ 个节点的电压为 $$V_i$$ ,注入到该节点的有功负荷为 $$P_i$$ ,注入到该节点的无功负荷为 $$Q_i$$ ,该节点的电流注入量为 $$I_i$$ 。
节点的潮流平衡条件方程式为:

$$P_i = V_i \sum_{j=1}^{n}V_j (G_{ij}\cos{\theta_{ij}}+B_{ij}\sin{\theta_{ij}})$$

$$Q_i = V_i \sum_{j=1}^{n}V_j (G_{ij}\sin{\theta_{ij}}-B_{ij}\cos{\theta_{ij}})$$

其中,$$G_{ij}$$ 和 $$B_{ij}$$ 分别表示导纳矩阵的实部和虚部,$$\theta_{ij}$$ 表示节点 $$i$$ 和节点 $$j$$ 之间的相角差。
这两个方程组成了电力系统的潮流平衡方程组。

紧接着使用牛顿法来求解上述方程组。
该方法的一般形式为:

$$x_{n+1}=x_n-J^{-1}(x_n)f(x_n)$$

其中,$$x_n$$ 表示第 $$n$$ 次迭代的解向量,$$f(x_n)$$ 是非线性方程组的残差向量, $$J(x_n)$$ 是雅可比矩阵。
对于电力系统的潮流计算问题,上面的方程可以表示为:

$$\begin{bmatrix}\Delta P \\Delta Q\end{bmatrix}=\begin{bmatrix}J_{pp} & J_{pq} \J_{qp} & J_{qq}\end{bmatrix}\begin{bmatrix}\Delta \theta \\Delta V\end{bmatrix}$$

其中,$$\Delta P$$和 $$\Delta Q$$ 分别表示有功和无功负荷注入的平衡误差,$$\Delta \theta$$ 和 $$\Delta V$$ 分别表示相角和电压的调节量。 $$J_{pp}$$ 、 $$J_{pq}$$ 、 $$J_{qp}$$ 和 $$J_{qq}$$ 分别是雅可比矩阵的四个分块,它们的表达式如下所示:

$$
J_{pp}=\frac{\partial f_p}{\partial \theta} \quad J_{pq}=\frac{\partial f_p}{\partial V} \
J_{qp}=\frac{\partial f_q}{\partial \theta} \quad J_{qq}=\frac{\partial f_q}{\partial V}
$$

这里面,$$f_p$$ 和 $$f_q$$ 分别表示有功和无功负荷注入的潮流平衡方程
回归题干将33节点配电网matlab程序分成三个区域进行分区调度,
这里其实是需要根据具体实现情况编写相应的代码。
一般来说,需要使用电力系统分布式优化算法来实现分区调度。
编写不易,如有帮助给个采纳谢谢

根据您的要求,将最基本的牛顿拉夫逊发潮流计算的33节点配电网的MATLAB程序分成三个区域进行分区调度,您可以按照以下步骤进行操作:

  1. 区域划分:首先,根据配电网的特点和实际情况,将33节点配电网划分为三个区域。可以考虑将节点按照地理位置、电力负荷、设备类型等因素进行合理的划分。
  2. 数据分配:针对每个区域,将相关的节点数据分配给相应的区域。这些数据包括节点的电压、负荷、发电机设置等。确保每个区域都有所需的数据来进行独立的潮流计算。
  3. 独立计算:针对每个区域,使用牛顿拉夫逊发潮流计算方法进行独立的计算。将区域内的节点和相关参数作为输入,并根据节点之间的拓扑关系和电力方程进行计算。确保每个区域的计算是相互独立的。
  4. 结果合并:在每个区域完成潮流计算后,将各个区域的计算结果进行合并。根据需要,可以计算整个配电网的功率流、电压、功率损耗等指标。

通过将33节点配电网分成三个区域进行分区调度,可以有效减少计算的复杂性和计算量,提高计算效率,并更好地模拟和分析配电网的运行情况。

请注意,具体的分区划分和数据分配策略需要根据您的具体情况进行调整。同时,确保每个区域之间的边界条件和接口处的数据传输正确和准确是非常重要的。

希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。