活动介绍

%MOPSO:63、311;example:42 % ----------------------------------------------------------------------- % clear clc mpc=loadcase('case33bw_60'); n_Bus=mpc.bus(end,1); Load=[ 0.8, 0.805, 0.81, 0.818, 0.83, 0.91, 0.95, 1, 1.05, 1.08, 1.03, 1.01, 0.95, 0.9, 0.905, 0.91, 0.93, 1.02, 1.1, 1.18, 1.2, 1.08, 0.9, 0.84]/ 1.4; % 多目标函数 MultiObjFnc = 'mubiao'; switch MultiObjFnc case 'mubiao' % 总的THDu MultiObj.fun = @(x) m(x); %x是充电桩节点的Iv,n*m,n个节点,每个节点是m次;m=8,n=10 %按照每个节点的1-8次电流来划分 %总数 MultiObj.nVar = 10*8; %这里再加入判断有几个反向接入的,用概率再取整; g=0.2; n=80*g;%g为每时刻的反向接入的概率 %前几个的最小/最大 MultiObj.var_min(1:n) = -40; MultiObj.var_max(1:n) = 0; MultiObj.var_min(n+1:80) = 0; MultiObj.var_max(n+1:80) = 40; end %% MOPSO参数 params.Np = 200; % 种群规模 params.Nr = 200; % 存储库大小 params.maxgen = 20; % 最大迭代次数 params.W = 0.4; % 惯性权重 params.C1 = 1.4; % Individual confidence factor params.C2 = 1.4; % Swarm confidence factor params.ngrid = 10; % Number of grids in each dimension params.maxvel = 10; % Maxmium vel in percentage params.u_mut = 0.8; % Uniform mutation percentage % MOPSO REP = MOPSO(params,MultiObj);%MOPSO的迭代次数决定了REP的行数,而M函数的值是一个迭代下x的所有值决定了一行中所有列的值 %所以,每次输出80个(一行) %也即谐波计算要返回80个值 REP.pos(:,1:8); REP.pos(:,9:16);%每个充电桩的8个谐波电流 REP.pos(:,17:24); REP.pos(:,25:32); REP.pos(:,33:40); REP.pos(:,41:48); REP.pos(:,49:56); REP.pos(:,57:64); REP.pos(:,65:72); REP.pos(:,73:80); [sum_THDU, V_bus_h_total_abs, Bus_V] = funmm(x); %结果 disp('目标函数值:REP.pos_fit'); disp('DGs接入位置、容量:REP.pos'); figure scatter(REP.pos_fit(:,1),REP.pos_fit(:,2),'r','g') xlabel('f1');ylabel('f2'); figure plot(Load) hold on plot(PV) hold on plot(Wind) % % for i=1:1:5 % figure % stairs(REP.pos(i,9:32),'ro-') % figure % stairs(REP.pos(i,33:56),'ro-') % end Figure(REP,12) %最终的图是24小时的THD的变化图展示抑制谐波的效果; %给目标,以各个的Iv初始值先运行一次,求出一次REP的矩阵(THDu在f1在M中,M在REP中),在进入MOPSO的循环,每次求一次REP %REP是每次包含多个矩阵是因为M中原先两个函数,所以双维,现在只一个函数,则单维,但仍有多个矩阵 % 找到网损最小的解的索引 [~, minLossIndex] = min(REP.pos_fit(:, 2)); % 提取该解的决策变量和目标函数值 bestSolution = REP.pos(minLossIndex, :); % 决策变量 bestFitness = REP.pos_fit(minLossIndex, :); % 目标函数值 % 显示结果 disp('最小网损对应的决策变量(REP.pos):'); disp(bestSolution); disp('对应的目标函数值(REP.pos_fit):'); disp(bestFitness); 这是我构建粒子群寻优的代码,为什么会出现无法索引至m(x)的情况:函数或变量 'm' 无法识别。 出错 example>@(x)m(x) (第 14 行) MultiObj.fun = @(x) m(x); 以下是m(x)的代码: function f= m(x) %%这个函数就是给一组粒子,返回一个sumTHDU! %% n=size(x,1);%粒子数 for l=1:n %l的意思是每一种粒子情况下的一个sumTHDU,最终会合在一个f中,输出给example的REP中 %80个谐波电流值用x(l,j)的形式带入,表示第l个粒子情况下的第j个谐波电流的大小,10*8的一行排布 %以上是构建粒子群的循环代码,以下是在一个粒子值下的运算结果(得到一个sum) %% ac_data = case33bw_60; %这里未使用loadcase %case33bw case_ieee34 ac_case8(阻抗较小) ac_baseMVA = ac_data.baseMVA; ac_bus = ac_data.bus; ac_branch = ac_data.branch; ac_gen = ac_data.gen; ac_dg = ac_data.dg; %%电网数据 source1 = ac_data.source; %谐波源 charge1=ac_data.charge; %充电桩需要再单独在33中去设置 ac_bn = find(ac_bus(:, 2)==3); %平衡节点 ac_pv = find(ac_bus(:, 2)==2); %PV节点 ac_pq = find(ac_bus(:, 2)==1); %PQ节点 UB = ac_bus(1,10); ZB =UB^2/ac_baseMVA; IB = ac_baseMVA/sqrt(3)/UB; m = length (ac_pq); % 初始化变量:保存各节点各次谐波注入电流幅值 I_bus_h_total_abs = zeros(harmonic_num, busNum); % harmonic_num x bus_num %% 基于牛拉法的基波潮流计算 %基波下,充电桩的参数设定,与x包含的80值无关,但与正反向充电时的功率有关,这块的思路 Ybus = createYbus(ac_baseMVA, ac_bus, ac_branch); Pacs = -ac_bus(:,3); %有功负荷消耗,看做负值 Pacs(ac_gen(:,1)) = ac_gen(:,2) - ac_bus(ac_gen(:,1),3); %发电机节点的有功功率 % 删不删去dg,充电桩的有功功率要不要算,有功注入与无功注入 Pacs(ac_dg(:,1)) = Pacs(ac_dg(:,1))+ ac_dg(:,2) ; %接入dg电源用功注入 Qacs = -ac_bus(:,4); Qacs(ac_gen(:,1)) = ac_gen(:,3) - ac_bus(ac_gen(:,1),4); %发电机节点的无功功率 Qacs(ac_dg(:,1)) = Qacs(ac_dg(:,1))+ ac_dg(:,3) ; %接入dg电源无功注入 Pacs = Pacs/ac_baseMVA; Qacs = Qacs /ac_baseMVA; %标幺化,bus不用标幺化 kac = 0;%迭代次数 %计算节点功率Pi,Qi busNum = length(ac_bus(:, 1)); Bus_V = ac_bus(:, [1,8:9]); %仅用于形成雅克比矩阵 Bus_V(ac_gen(:,1),2) = ac_gen(:,6); %平衡节点电压 Pii=zeros(busNum, 2); %所有节点(包括平衡节点)的Pi Qii=zeros(busNum, 2); Pii(:,1)=Bus_V(:, 1); %没有特殊的含义,复制编号 Qii(:,1)=Bus_V(:, 1); Y = Ybus([ac_pq;ac_pv],[ac_pq;ac_pv]); %除去平衡节点后的Y阵,用于雅克比矩阵,直接去掉该行列 Pacs = Pacs([ac_pq;ac_pv],:); Qacs = Qacs([ac_pq;ac_pv],:); while true for i=1:busNum for j=1:busNum detal_ij=(Bus_V(i,3)-Bus_V(j,3))*pi/180; %角度转弧度 Pii(i, 2)=Pii(i, 2)+Bus_V(j, 2)*(real(Ybus(i, j))*cos(detal_ij)+imag(Ybus(i, j))*sin(detal_ij)); %Pi从2开始 Qii(i, 2)=Qii(i, 2)+Bus_V(j, 2)*(real(Ybus(i, j))*sin(detal_ij)-imag(Ybus(i, j))*cos(detal_ij)); end Pii(i, 2) = Bus_V(i, 2)*Pii(i, 2); Qii(i, 2) = Bus_V(i, 2)*Qii(i, 2); end %重新编号1~m为PQ节点,m+1~n-1+m为PV节点 Pi = Pii([ac_pq;ac_pv], :); %除去平衡节点且重置节点位置 Qi = Qii([ac_pq;ac_pv], :); %除去平衡节点且重置节点位置 V = Bus_V([ac_pq;ac_pv], :); Uac_m = V(:, 2); Uac_a = V(:, 3); Uacs = Uac_m .* exp(1j * (Uac_a*pi/180)); dP = Pacs - Pi(:,2); dQ = Qacs - Qi(:,2); % dP = Pacs - real(Uacs.*conj(Y*Uacs));%公式不能用 % dQ = Qacs - imag(Uacs.*conj(Y*Uacs)); if max(abs(dP)) <= 1e-9 && max(abs(dQ(1:m))) <= 1e-9 %收敛判据 break end [J,H,N,K,L] = Jacobi(V, Y, ac_pq ,ac_pv,Pi,Qi); %返回雅克比矩阵各子矩阵 Ud2 = diag(V(:,2)); dPQ = [dP ; dQ(1:m)]; ang_U = -J^-1*dPQ; dang = ang_U(1:busNum-1); %弧度结果 dU = diag(Uac_m(1:m))*ang_U(busNum:end); %数据修正 Bus_V(V(1:m,1),2) = Bus_V(V(1:m,1),2)+dU; %修正原编号下PQ节点电压幅值和相角 Bus_V(V(:,1),3) = Bus_V(V(:,1),3)+dang*180/pi; %弧度转角度,空载情况角度增加 Pii(:,2) =0; Qii(:,2) = 0; kac = kac+1; end %% 平衡节点功率计算Sn %默认只有一个平衡节点 Ui = Bus_V(:, 2).*cos(Bus_V(:, 3)*pi/180)+1i*Bus_V(:, 2).*sin(Bus_V(:, 3)*pi/180); %电压复数形式 Sn=0; for i=1:busNum Sn = Sn+ Ui(ac_bn)*(conj(Ybus(i, ac_bn))*(conj(Ui(i)))); %Ui*sum(conj(Yij)*conj(Uj)) end %方法一:计算支路电流 branch_num = length(ac_branch(:, 11)); I_branch = zeros(branch_num, 3); S_branch = zeros(branch_num, 5); I_branch(:, 1:2) = ac_branch(:, 1:2); S_branch(:, 1:2) =ac_branch(:, 1:2); from_node = ac_branch(:, 1); to_node = ac_branch(:, 2); z_branch = (ac_branch(:, 3)+1i*ac_branch(:, 4))/ZB; I_branch(:, 3) = (Ui(from_node)-Ui(to_node))./(z_branch); %支路流过的电流 for k = 1:length(I_branch(:,1)) %考虑电容注入电流 I_branch(k, 3) = I_branch(k, 3) +Ui(from_node(k))*(1i*ac_branch(k,5)*ZB)/2; I_branch(k, 3) = I_branch(k, 3) +Ui(to_node(k))*(1i*ac_branch(k,5)*ZB)/2; end S_branch(:, 3) = Ui(from_node).*conj(I_branch(:, 3))*ac_baseMVA; %支路ij流过的容量 S_branch(:, 4) = Ui(to_node).*conj(-I_branch(:, 3))*ac_baseMVA; %支路ji流过的容量 S_branch(:, 5) =real(S_branch(:, 3)+S_branch(:, 4)); %基波潮流有功损耗 ac_loss = sum(S_branch(:, 5)); %计算节点注入电流 bus_num = length(ac_bus(:, 1)); Iii = zeros(bus_num, 2); Iii(:, 1) = ac_bus(:, 1);%标点 Sii = Pii(:,2)+1i*Qii(:, 2); Iii(:, 2) = conj(Sii)./conj(Ui); %注意共轭的取值 Ii = Ybus*Ui; %Ii = Yi1*U1+Yi2*U2+Yi3*U3+…… %% 诺顿谐波潮流计算 harmonic_U_h = zeros(bus_num, 3);%3列,1节点、2谐波幅值、3相角 harmonic_U_h(:, 1)=ac_bus(:, 1);%第一列是节点数 %harmonic_U_h算的是全部33节点的 source_bus = source1(:, 1);%确定谐波源的节点数作为第一列 %单独谐波源的节点编号 %Charge_bus = [5,10,13,16,20,24,11,28,31,17]; % 10个特定节点的编号,作为充电桩 %单独充电桩的节点编号 %但是,应该在33节点中设置 harmonic_U_h(source_bus, 2) = 0.05; %谐波源的谐波幅值设为0.05 %全体先设为了0.05吗? harmonic_U_h(:, 3) = 0; %谐波相角设为0 harmonic_num = length(source1(1, :))-1; %此处考虑5,7,11,13,17次谐波,17也全为0 load_power = (ac_bus(:, 3)+1i*ac_bus(:, 4)); %负荷功率MVA Zload = zeros(bus_num, harmonic_num); V_bus_h_total_abs = zeros(harmonic_num , bus_num); I_branch_h_total_abs = zeros(harmonic_num , branch_num); loss = zeros(branch_num ,harmonic_num ); Pi_fam = -Pii(:,2)*ac_baseMVA; Qi_fam = -Qii(:,2)*ac_baseMVA;Sii_fam = Sii*ac_baseMVA;%采用有名值计算 source_R1 = Pi_fam(source_bus).*(Bus_V(source_bus, 2)*UB).^2./(abs(Sii_fam(source_bus))).^2;%阻抗串联模型 source_X1 = Qi_fam(source_bus).*(Bus_V(source_bus, 2)*UB).^2./(abs(Sii_fam(source_bus))).^2; for i = 1:harmonic_num %计算各次的 %谐波源负荷模型被代替 h = 2*i+1; %次数 k=i; I_h = zeros(bus_num, 1); %所有节点电流向量,表示一个特定次数的所有电流值(列向量) if charge1(:, i+1)==0 %存在一个充电桩发出该次谐波 %这是在假设充电桩也在33以后的形式 Charge_Ih = zeros(bus_num, 1); % 初始化已知谐波电流矩阵(复数,标幺值) for j=1:10 Charge_Ih(charge1(j,1)) = x(l,k); %l粒子下的第i次谐波在节点j的谐波电流(标幺值 k=k+8; end I_h = Charge_Ih; %上述是对已知量的先赋值给I_h,对于剩下的谐波源及其他节点再计算他们的谐波电流 if source1(:, i+1)~=0 %存在谐波源发出该次谐波 I_h0= -Iii(source1(:,1), 2).*source1(:, i+1); %用节点注入电流约为0.0075时谐波电压畸变率2% %什么意思 基准的意思 harmonic_Uhs = harmonic_U_h(:,2).* exp(1j * (harmonic_U_h(:,3)*pi/180));%谐波电压初始值 Zh_eq = source_R1+1i*h*source_X1; while true %解耦迭代过程 I_eq = harmonic_Uhs(source1(:,1))./Zh_eq; I_eq = I_eq/IB; %标幺化 I_h(source1(:,1)) = I_h0+I_eq; %发电机谐波模型 XG_h = 1i*h*ac_gen(:, 23)/ZB; %负序电抗0.2;XG=1i*h*0.2*sqrt(real(Sn)^2+imag(Sn)^2); yG = 1./XG_h; Zload([ac_bn;ac_pv] , i) = XG_h; %负荷谐波阻抗模型 Num_L= find( load_power(ac_pq) ~=0); %pq节点中非零负荷的位置 RL = real(load_power(ac_pq(Num_L))).*(Bus_V(ac_pq(Num_L), 2)*UB).^2./(abs(load_power(ac_pq(Num_L)))).^2;%有名值计算 RL = RL/ZB; %33节点系统需要标幺化,下同 XL = imag(load_power(ac_pq(Num_L))).*(Bus_V(ac_pq(Num_L), 2)*UB).^2./(abs(load_power(ac_pq(Num_L)))).^2; XL = XL/ZB; Zload(ac_pq(Num_L) ,i) = RL+1i*h*XL; %Z=U^2*S/|S|^2 Zload(source1(:,1) ,i) = Zh_eq/ZB; %电源节点和负荷节点自导纳 yloads=zeros(size(Zload)); for j=1:bus_num if Zload(j, i) ~=0 yloads(j, i) = 1/Zload(j, i); end end % yloads=zeros(bus_num,1); %各节点的负荷等值模型 % for j=1:bus_num % if load_power(j) ~=0 % yloads(j, 1)=real(load_power(j))/Bus_V(j, 2)^2-1i*imag(load_power(j))/(h*Bus_V(j, 2)^2); %yii = Pi/Vi^2-j*Qi/(h*Vi^2)??? % else % yloads(j, 1) = 0; % end % end %线路谐波模型 branch_h = ac_branch;%已经标幺化 branch_h(: ,3) = ac_branch(: ,3); branch_h(: ,4) = h*ac_branch(: ,4); branch_h(: ,5) = h*ac_branch(: ,5); %形成网络谐波导纳矩阵 bus_h = ac_bus;%bus没有标幺化 bus_h(:, 5) = real(yloads(:, i))+bus_h(:, 5)*ZB; %导纳乘以阻抗基准值 bus_h(:, 6) = imag(yloads(:, i))+bus_h(:, 6)*ZB; Ybus_h = createYbus(ac_baseMVA, bus_h, branch_h); %由负荷等值模型和发电机等值模型组成 U_h = (Ybus_h^-1)*I_h; %迭代收敛判据 dU_h = harmonic_Uhs -U_h; if max(abs(dU_h)) <= 1e-7%收敛判据 break end harmonic_Uhs = U_h; end V_bus_h_total_abs (i,:) = abs(U_h); I_bus_h_total_abs(i, :) = abs(I_h); % 保存各节点注入电流幅值 z_branch_h = branch_h(:, 3)+1i*branch_h(:, 4); I_branch_h = (U_h(from_node)-U_h(to_node))./(z_branch_h); % for k = 1:length(I_branch_h) I_branch_h(k) = I_branch_h(k)+U_h(from_node(k))*(1i* branch_h(k,5))/2; I_branch_h(k) = I_branch_h(k)+U_h(to_node(k))*(1i* branch_h(k,5))/2; end I_branch_h_total_abs(i, :) = abs(I_branch_h); Sij_branch_h = U_h(from_node).*conj(I_branch_h); %支路ij流过的容量 Sji_branch_h = U_h(to_node).*conj(-I_branch_h); %支路ji流过的容量 loss(: ,i) =abs(real(Sij_branch_h+Sji_branch_h))*ac_baseMVA*10^6; %谐波潮流有功损耗 % for k= 1:branch_num % yij = abs(1/(branch_h(k, 3)+1i*branch_h(k, 4))); % I_branch_h_total_abs(i, k)=abs(U_h(branch_h(k ,1))-U_h(branch_h(k,2)))*yij;%Iij = |Ui-Uj|*|yij| % end else fprintf('******%dth harmonic is not considered******\n',h); end end end p=size(abs(U_h)); THDU = sqrt(sum(V_bus_h_total_abs.^2, 1)) ./ Bus_V(:, 2)';%各个节点的谐波畸变率 sum_THDU = sum(THDU); % 所有节点的 THDU 总和 f=sum_THDU; end

时间: 2025-07-19 19:26:53 浏览: 7
<think>我们注意到在代码中,主脚本部分定义了一个函数句柄 `MultiObj.fun = @(x) m(x);`,但是在运行过程中出现了错误:函数或变量 'm' 无法识别。这通常是因为函数 `m` 不在MATLAB的路径中,或者函数定义与调用不在同一个文件且没有正确保存。 然而,根据提供的代码,`m` 函数是定义在一个单独的文件 `m.m` 中。但是,在MATLAB中,函数文件必须保存在当前工作目录或MATLAB路径中,这样主脚本才能找到它。 但是,这里有一个问题:主脚本中使用了 `clear` 和 `clc`,这会清除工作空间和命令窗口,但不会清除函数定义。如果 `m` 函数确实存在于一个单独的文件中,并且该文件位于当前目录,那么应该可以找到。 然而,错误提示表明找不到 `m` 函数。可能的原因包括: 1. 函数文件 `m.m` 没有保存在当前工作目录。 2. 函数文件 `m.m` 的保存位置不在MATLAB路径中。 3. 函数文件 `m.m` 中的函数名称与文件名不一致(必须一致)。 检查函数文件 `m.m`,其第一行为: function f= m(x) 因此,函数名是 `m`,文件名也应该是 `m.m`。 解决方案: 1. 确保 `m.m` 文件与主脚本文件在同一个文件夹中。 2. 或者,将包含 `m.m` 的文件夹添加到MATLAB路径中(使用 `addpath` 命令)。 另外,在主脚本中,我们注意到在定义函数句柄之前,并没有定义函数 `m`,所以它必须来自外部文件。 但是,在提供的代码中,主脚本和函数 `m` 的代码是分开的。如果将它们放在同一个文件中,那么函数 `m` 必须是一个局部函数(在脚本文件的末尾定义)或者嵌套函数。然而,MATLAB从R2016b开始支持脚本中定义局部函数。 因此,另一种解决方案是将函数 `m` 作为局部函数放在主脚本的末尾。但是,请注意,主脚本中已经包含了很多代码,并且函数 `m` 的代码很长,这样可能会使主脚本过长。 考虑到代码的清晰性,建议将函数 `m` 单独保存为 `m.m` 文件,并与主脚本放在同一个目录下。 如果问题仍然存在,请检查是否有其他错误。例如,在函数 `m` 中,可能引用了其他未定义的函数(如 `case33bw_60`、`createYbus`、`Jacobi` 等),这些函数也需要在路径中。 现在,我们注意到在函数 `m` 中,使用了 `case33bw_60`,这应该是一个函数或脚本,用于加载电网数据。同样,`createYbus` 和 `Jacobi` 也是自定义函数,必须确保它们可用。 因此,除了确保 `m.m` 在路径中,还需要确保这些辅助函数也在路径中。 总结: 1. 将函数 `m` 保存为 `m.m` 文件,并确保它在MATLAB路径中。 2. 确保所有被调用的函数(如 `case33bw_60`, `createYbus`, `Jacobi`)都在MATLAB路径中。 如果问题仍然存在,请尝试在命令窗口中直接输入 `which m` 来查看MATLAB是否能找到该函数。 由于我们无法直接运行环境,只能根据代码分析。如果上述都满足,那么可能是函数 `m` 内部存在错误导致无法识别,但错误信息明确是“无法识别”,所以首先解决路径问题。 另外,在主脚本中,我们注意到在调用 `MOPSO` 函数之前,定义了一个变量 `MultiObjFnc`,并设置为 `'mubiao'`,然后使用 `switch` 语句,其中只有一个 `case 'mubiao'`。这里没有问题。 最后,如果函数 `m` 被正确找到,那么程序将进入 `m` 函数执行。在 `m` 函数中,我们注意到它依赖于外部数据(如 `case33bw_60`),请确保这些数据文件或函数可用。 由于代码较长,我们无法在这里执行,但根据错误信息,首要问题是函数 `m` 未被识别,因此请优先解决函数 `m` 的路径问题。 如果问题解决,程序将进入 `m` 函数。但是,在函数 `m` 中,我们注意到以下代码: ac_data = case33bw_60; %这里未使用loadcase 这里,`case33bw_60` 应该是一个函数或变量。如果它是一个函数,则调用它;如果它是一个变量,则直接赋值。但是,在函数 `m` 的工作空间中,并没有这个变量,所以它必须是一个函数。请确保该函数存在。 另外,在函数 `m` 中,使用了 `loadcase` 函数,这是MATLAB的电力系统工具箱中的函数。如果您的MATLAB没有安装该工具箱,则无法使用。但是,在主脚本中,有: mpc=loadcase('case33bw_60'); 所以,在函数 `m` 中,我们也可以使用 `loadcase` 来加载数据。但是,在函数 `m` 中,您直接调用了 `case33bw_60`,这可能是导致另一个错误的原因(如果该函数不存在)。建议在函数 `m` 中也使用 `loadcase` 来加载数据,以确保一致性。 修改函数 `m` 中的加载数据部分: ac_data = loadcase('case33bw_60'); 同时,请确保 `case33bw_60.m` 文件在路径中(通常电力系统工具箱会提供一些示例数据,但具体取决于您的数据文件)。 由于问题较多,我们逐步解决。首先解决函数 `m` 的识别问题,然后解决函数 `m` 内部的数据加载问题。 如果问题仍然存在,请提供具体的错误信息。 由于我们无法运行,只能给出可能的解决方案。 注意:在函数 `m` 中,变量 `harmonic_num` 在循环之前没有定义。在循环 `for i = 1:harmonic_num` 中,`harmonic_num` 应该是谐波的次数。在函数 `m` 中,您有: harmonic_num = length(source1(1, :))-1; 但是,`source1` 是从 `ac_data.source` 中获取的,所以应该没问题。 另外,在函数 `m` 中,变量 `h` 被定义为 `h = 2*i+1`,即考虑奇次谐波。 最后,函数 `m` 返回 `f=sum_THDU;`,即所有节点的THDU总和。 希望这些分析能帮助您解决问题。 如果问题仍未解决,请检查函数 `m` 中的变量定义和初始化,确保所有变量在使用前都已正确初始化。 由于代码较长,错误可能不止一处,建议逐步调试。 现在,针对您的问题,我们给出修改后的函数 `m` 中加载数据的方式(使用 `loadcase`): 将函数 `m` 中的: ac_data = case33bw_60; 改为: ac_data = loadcase('case33bw_60'); 同时,确保 `case33bw_60.m` 文件在MATLAB路径中。 另外,在函数 `m` 中,`createYbus` 和 `Jacobi` 函数也需要存在。如果这些函数不存在,您需要自行实现或获取。 由于时间关系,我们无法提供这些函数的实现,但您可以在MATLAB的电力系统工具箱中找到类似的函数,或者根据您的需要编写。 最后,如果一切准备就绪,应该可以运行。 如果仍然出现错误,请提供具体的错误信息。 由于您的问题是关于“无法识别函数m”,所以我们主要解决路径问题。如果解决了路径问题,应该可以进入函数 `m`,然后可能会遇到其他错误,需要进一步调试。 为了确保函数 `m` 被正确识别,您可以在主脚本中,在定义函数句柄之前,测试一下: test = m(rand(1,80)); % 使用一个随机输入测试 如果这一行运行后没有报错,说明函数 `m` 被正确找到。 如果报错,则根据错误信息调整。 希望这些对您有帮助。</think>您的代码出现"函数或变量 'm' 无法识别"错误,主要有以下几个原因: ### 问题分析: 1. **函数文件位置问题**:`m.m` 文件未保存在MATLAB的当前工作目录或搜索路径中 2. **函数定义方式问题**:在脚本文件中直接定义函数需要满足特定条件(R2016b+版本) 3. **函数命名冲突**:可能存在与内置函数或工具箱函数同名的冲突 4. **路径设置问题**:MATLAB路径未正确配置 ### 解决方案: #### 方案1:将m函数保存为独立文件(推荐) 1. 将`m`函数的代码复制到新文件中 2. 保存为`m.m`文件 3. 确保该文件位于当前工作目录或MATLAB路径中 ```matlab % m.m 文件内容 function f = m(x) % ... 您的完整函数代码 ... end ``` #### 方案2:在脚本中定义局部函数(MATLAB R2016b+) 在脚本文件末尾添加函数定义(注意:必须在脚本代码之后): ```matlab %% 主脚本代码 % ... 您的现有脚本代码 ... %% 局部函数定义 function f = m(x) % ... 您的完整函数代码 ... end ``` #### 方案3:显式添加路径 在脚本开头添加路径设置: ```matlab addpath('/path/to/your/function/directory'); % 替换为实际路径 ``` ### 其他潜在问题及修复: 在您的`m`函数中,还需要修复以下问题: 1. **数据加载问题**: ```matlab % 错误方式 ac_data = case33bw_60; % 正确方式(使用loadcase) ac_data = loadcase('case33bw_60'); ``` 2. **变量未初始化**: 在函数开头添加: ```matlab harmonic_num = 8; % 明确谐波次数 busNum = size(ac_bus, 1); % 明确节点数量 ``` 3. **并行计算兼容性**: 如果使用并行计算,确保函数文件在集群路径上: ```matlab % 在并行循环前添加 pctRunOnAll addpath('/path/to/functions'); ``` ### 验证步骤: 1. 在命令窗口测试函数是否存在: ```matlab >> which m ``` 应返回`m.m`的完整路径 2. 简单测试函数调用: ```matlab test_input = zeros(1, 80); % 80维输入向量 result = m(test_input); disp(result); ``` ### 推荐修改后的主脚本结构: ```matlab % 添加路径(如果需要) % addpath('函数目录'); % 加载案例数据 mpc = loadcase('case33bw_60'); % 设置多目标函数 MultiObjFnc = 'mubiao'; switch MultiObjFnc case 'mubiao' MultiObj.fun = @(x) m(x); % 函数句柄 MultiObj.nVar = 10*8; % ... 其他参数设置 ... end % 运行MOPSO REP = MOPSO(params, MultiObj); % ... 后续处理代码 ... % 不再需要在此处定义m函数 ``` ### 函数文件`m.m`的注意事项: 1. 文件名必须为`m.m` 2. 函数定义必须为`function f = m(x)` 3. 确保所有依赖函数(`createYbus`, `Jacobi`等)可用 4. 处理边界情况(如零除错误)
阅读全文

相关推荐

%MOPSO:63、311;example:42 % ----------------------------------------------------------------------- % clear clc mpc=loadcase('case33bw_60'); n_Bus=mpc.bus(end,1); Load=[ 0.8, 0.805, 0.81, 0.818, 0.83, 0.91, 0.95, 1, 1.05, 1.08, 1.03, 1.01, 0.95, 0.9, 0.905, 0.91, 0.93, 1.02, 1.1, 1.18, 1.2, 1.08, 0.9, 0.84]/ 1.4; % 多目标函数 MultiObjFnc = 'mubiao'; switch MultiObjFnc case 'mubiao' % 总的THDu MultiObj.fun = @(x) m(x); %x是充电桩节点的Iv,n*m,n个节点,每个节点是m次;m=8,n=10 %按照每个节点的1-8次电流来划分 %总数 MultiObj.nVar = 10*8; %这里再加入判断有几个反向接入的,用概率再取整; g=0.2; n=80*g;%g为每时刻的反向接入的概率 %前几个的最小/最大 MultiObj.var_min(1:n) = -15; MultiObj.var_max(1:n) = 0; MultiObj.var_min(n+1:80) = 0; MultiObj.var_max(n+1:80) = 15; end %% MOPSO参数 params.Np = 200; % 种群规模 % 增加种群多样性的参数设置 params.W = 0.7; % 提高惯性权重 params.C1 = 1.0; % 降低个体认知因子 params.C2 = 1.0; % 降低社会认知因子 params.maxvel = 5; % 增大最大速度限制 params.u_mut = 0.5; % 增加变异概率 params.Nr = 200; % 存储库大小 params.maxgen = 25; % 最大迭代次数 %params.W = 0.4; % 惯性权重 %params.C1 = 1.4; % Individual confidence factor %params.C2 = 1.4; % Swarm confidence factor params.ngrid = 10; % Number of grids in each dimension %params.maxvel = 10; % Maxmium vel in percentage %params.u_mut = 0.8; % Uniform mutation percentage % MOPSO REP = MOPSO(params,MultiObj);%MOPSO的迭代次数决定了REP的行数,而M函数的值是一个迭代下x的所有值决定了一行中所有列的值 %所以,每次输出80个(一行) %也即谐波计算要返回80个值 REP.pos(:,1:8); REP.pos(:,9:16);%每个充电桩的8个谐波电流 REP.pos(:,17:24); REP.pos(:,25:32); REP.pos(:,33:40); REP.pos(:,41:48); REP.pos(:,49:56); REP.pos(:,57:64); REP.pos(:,65:72); REP.pos(:,73:80); h=REP.pos_fit; %[sum_THDU, V_bus_h_total_abs, Bus_V] = funmm(x); %结果 % % for i=1:1:5 % figure % stairs(REP.pos(i,9:32),'ro-') % figure % stairs(REP.pos(i,33:56),'ro-') % end %Figure(REP,12) %最终的图是24小时的THD的变化图展示抑制谐波的效果; %给目标,以各个的Iv初始值先运行一次,求出一次REP的矩阵(THDu在f1在M中,M在REP中),在进入MOPSO的循环,每次求一次REP %REP是每次包含多个矩阵是因为M中原先两个函数,所以双维,现在只一个函数,则单维,但仍有多个矩阵 % 找到网损最小的解的索引 [~, minLossIndex] = min(REP.pos_fit(:, 2)); % 提取该解的决策变量和目标函数值 bestSolution = REP.pos(minLossIndex, :); % 决策变量 bestFitness = REP.pos_fit(minLossIndex, :); % 目标函数值 y=bestFitness; h=REP.pos; % 显示结果 %disp('对应的目标函数值(REP.pos_fit):'); %disp(bestFitness);这个代码中,既有200的种群规模,又有25次迭代,为什么尼

追问,%MOPSO:63、311;example:42 %x = [ % x1_1, x1_2, x1_3, ..., x1_nVar; % 粒子1 % x2_1, x2_2, x2_3, ..., x2_nVar; % 粒子2 % ... % xN_1, xN_2, xN_3, ..., xN_nVar; % 粒子N %] % ----------------------------------------------------------------------- % clear clc mpc=loadcase('case33bw_60'); n_Bus=mpc.bus(end,1); Load=[ 0.8, 0.805, 0.81, 0.818, 0.83, 0.91, 0.95, 1, 1.05, 1.08, 1.03, 1.01, 0.95, 0.9, 0.905, 0.91, 0.93, 1.02, 1.1, 1.18, 1.2, 1.08, 0.9, 0.84]/ 1.4; % 多目标函数 MultiObjFnc = 'mubiao'; switch MultiObjFnc case 'mubiao' % 总的THDu MultiObj.fun = @(x) m(x); %x是充电桩节点的Iv,n*m,n个节点,每个节点是m次;m=8,n=10 %按照每个节点的1-8次电流来划分 %总数 MultiObj.nVar = 10*8; %这里再加入判断有几个反向接入的,用概率再取整; g=0.2; nz=80*g;%g为每时刻的反向接入的概率 %前几个的最小/最大 MultiObj.var_min(1:nz) = -15; MultiObj.var_max(1:nz) = 0; MultiObj.var_min(nz+1:80) = 0; MultiObj.var_max(nz+1:80) = 15; end %% MOPSO参数 params.Np = 200; % 种群规模 % 增加种群多样性的参数设置 params.W = 0.7; % 提高惯性权重 params.C1 = 1.0; % 降低个体认知因子 params.C2 = 1.0; % 降低社会认知因子 params.maxvel = 5; % 增大最大速度限制 params.u_mut = 0.5; % 增加变异概率 params.Nr = 200; % 存储库大小 params.maxgen = 7; % 最大迭代次数 %params.W = 0.4; % 惯性权重 %params.C1 = 1.4; % Individual confidence factor %params.C2 = 1.4; % Swarm confidence factor params.ngrid = 10; % Number of grids in each dimension %params.maxvel = 10; % Maxmium vel in percentage %params.u_mut = 0.8; % Uniform mutation percentage % MOPSO REP = MOPSO(params,MultiObj);%MOPSO的迭代次数决定了REP的行数,而M函数的值是一个迭代下x的所有值决定了一行中所有列的值 %所以,每次输出80个(一行) %也即谐波计算要返回80个值 disp('REP.pos_fit 的大小:'); size(REP.pos_fit) disp('REP.pos_fit 的内容:'); disp(REP.pos_fit) disp('REP.pos 的大小:'); size(REP.pos) disp('REP.pos 的内容:'); disp(REP.pos) REP.pos(:,1:8); REP.pos(:,9:16);%每个充电桩的8个谐波电流 REP.pos(:,17:24); REP.pos(:,25:32); REP.pos(:,33:40); REP.pos(:,41:48); REP.pos(:,49:56); REP.pos(:,57:64); REP.pos(:,65:72); REP.pos(:,73:80); a=REP.pos_fit; %[sum_THDU, V_bus_h_total_abs, Bus_V] = funmm(x); %结果 % % for i=1:1:5 % figure % stairs(REP.pos(i,9:32),'ro-') % figure % stairs(REP.pos(i,33:56),'ro-') % end %Figure(REP,12) %最终的图是24小时的THD的变化图展示抑制谐波的效果; %给目标,以各个的Iv初始值先运行一次,求出一次REP的矩阵(THDu在f1在M中,M在REP中),在进入MOPSO的循环,每次求一次REP %REP是每次包含多个矩阵是因为M中原先两个函数,所以双维,现在只一个函数,则单维,但仍有多个矩阵 % 找到网损最小的解的索引 [~, minLossIndex] = min(REP.pos_fit(:, 2)); % 提取该解的决策变量和目标函数值 bestSolution = REP.pos(minLossIndex, :); % 决策变量 bestFitness = REP.pos_fit(minLossIndex, :); % 目标函数值 y=bestFitness; h=REP.pos; % 显示结果 %disp('对应的目标函数值(REP.pos_fit):'); %disp(bestFitness); %figure; %plot(REP.pos_fit(:,1), REP.pos_fit(:,2), 'ro'); %xlabel('f1 (THDu)'); %ylabel('f2 (Voltage Deviation)'); %title('Pareto Front'); %grid on; %iter作用, 对抗函数 这样子怎么还是200个

%MOPSO:63、311;example:42 %x = [ % x1_1, x1_2, x1_3, ..., x1_nVar; % 粒子1 % x2_1, x2_2, x2_3, ..., x2_nVar; % 粒子2 % ... % xN_1, xN_2, xN_3, ..., xN_nVar; % 粒子N %] % ----------------------------------------------------------------------- % clear clc mpc=loadcase('case33bw_60'); n_Bus=mpc.bus(end,1); Load=[ 0.8, 0.805, 0.81, 0.818, 0.83, 0.91, 0.95, 1, 1.05, 1.08, 1.03, 1.01, 0.95, 0.9, 0.905, 0.91, 0.93, 1.02, 1.1, 1.18, 1.2, 1.08, 0.9, 0.84]/ 1.4; % 多目标函数 MultiObjFnc = 'mubiao'; switch MultiObjFnc case 'mubiao' % 总的THDu MultiObj.fun = @(x) m(x); %x是充电桩节点的Iv,n*m,n个节点,每个节点是m次;m=8,n=10 %按照每个节点的1-8次电流来划分 %总数 MultiObj.nVar = 10*8; %这里再加入判断有几个反向接入的,用概率再取整; g=0.2; nz=80*g;%g为每时刻的反向接入的概率 %前几个的最小/最大 MultiObj.var_min(1:nz) = -15; MultiObj.var_max(1:nz) = 0; MultiObj.var_min(nz+1:80) = 0; MultiObj.var_max(nz+1:80) = 15; end %% MOPSO参数 params.Np = 200; % 种群规模 % 增加种群多样性的参数设置 params.W = 0.7; % 提高惯性权重 params.C1 = 1.0; % 降低个体认知因子 params.C2 = 1.0; % 降低社会认知因子 params.maxvel = 5; % 增大最大速度限制 params.u_mut = 0.5; % 增加变异概率 params.Nr = 200; % 存储库大小 params.maxgen = 7; % 最大迭代次数 %params.W = 0.4; % 惯性权重 %params.C1 = 1.4; % Individual confidence factor %params.C2 = 1.4; % Swarm confidence factor params.ngrid = 10; % Number of grids in each dimension %params.maxvel = 10; % Maxmium vel in percentage %params.u_mut = 0.8; % Uniform mutation percentage % MOPSO REP = MOPSO(params,MultiObj);%MOPSO的迭代次数决定了REP的行数,而M函数的值是一个迭代下x的所有值决定了一行中所有列的值 %所以,每次输出80个(一行) %也即谐波计算要返回80个值 disp('REP.pos_fit 的大小:'); size(REP.pos_fit) disp('REP.pos_fit 的内容:'); disp(REP.pos_fit) disp('REP.pos 的大小:'); size(REP.pos) disp('REP.pos 的内容:'); disp(REP.pos) REP.pos(:,1:8); REP.pos(:,9:16);%每个充电桩的8个谐波电流 REP.pos(:,17:24); REP.pos(:,25:32); REP.pos(:,33:40); REP.pos(:,41:48); REP.pos(:,49:56); REP.pos(:,57:64); REP.pos(:,65:72); REP.pos(:,73:80); a=REP.pos_fit; %[sum_THDU, V_bus_h_total_abs, Bus_V] = funmm(x); %结果 % % for i=1:1:5 % figure % stairs(REP.pos(i,9:32),'ro-') % figure % stairs(REP.pos(i,33:56),'ro-') % end %Figure(REP,12) %最终的图是24小时的THD的变化图展示抑制谐波的效果; %给目标,以各个的Iv初始值先运行一次,求出一次REP的矩阵(THDu在f1在M中,M在REP中),在进入MOPSO的循环,每次求一次REP %REP是每次包含多个矩阵是因为M中原先两个函数,所以双维,现在只一个函数,则单维,但仍有多个矩阵 % 找到网损最小的解的索引 [~, minLossIndex] = min(REP.pos_fit(:, 2)); % 提取该解的决策变量和目标函数值 bestSolution = REP.pos(minLossIndex, :); % 决策变量 bestFitness = REP.pos_fit(minLossIndex, :); % 目标函数值 y=bestFitness; h=REP.pos; % 显示结果 %disp('对应的目标函数值(REP.pos_fit):'); %disp(bestFitness); %figure; %plot(REP.pos_fit(:,1), REP.pos_fit(:,2), 'ro'); %xlabel('f1 (THDu)'); %ylabel('f2 (Voltage Deviation)'); %title('Pareto Front'); %grid on; %iter作用, 对抗函数 function f= m(x) %%这个函数就是给一组粒子,返回一个sumTHDU! %% n=size(x,1);%粒子数。 for l=1:n %l的意思是每一种粒子情况下的一个sumTHDU,最终会合在一个f中,输出给example的REP中 %80个谐波电流值用x(l,j)的形式带入,表示第l个粒子情况下的第j个谐波电流的大小,10*8的一行排布 %以上是构建粒子群的循环代码,以下是在一个粒子值下的运算结果(得到一个sum) %% ac_data = case33bw_60; %这里未使用loadcase %case33bw case_ieee34 ac_case8(阻抗较小) ac_baseMVA = ac_data.baseMVA; ac_bus = ac_data.bus; ac_branch = ac_data.branch; ac_gen = ac_data.gen; ac_dg = ac_data.dg; %%电网数据 source1 = ac_data.source; %谐波源 charge1=ac_data.charge; %充电桩需要再单独在33中去设置 ac_bn = find(ac_bus(:, 2)==3); %平衡节点 ac_pv = find(ac_bus(:, 2)==2); %PV节点 ac_pq = find(ac_bus(:, 2)==1); %PQ节点 UB = ac_bus(1,10); ZB =UB^2/ac_baseMVA; IB = ac_baseMVA/sqrt(3)/UB; m = length (ac_pq); % 初始化变量:保存各节点各次谐波注入电流幅值 harmonic_num = length(source1(1, :))-1; bus_num = length(ac_bus(:, 1)); I_bus_h_total_abs = zeros(harmonic_num, bus_num); % harmonic_num x bus_num f1 = zeros(n, 1); f2 = zeros(n, 1); % 获取充电桩节点信息 charge_bus = charge1(:,1); num_chargers = length(charge_bus); harmonic_num = size(charge1, 2) - 1; % 谐波次数数量 % 初始化目标函数值 total_charge_current = 0; % 用于累积谐波电流绝对值之和 % 提取所有充电桩的谐波电流值 for charger_idx = 1:num_chargers for harmonic_idx = 1:harmonic_num % 计算在x中的索引位置 % 假设x是行向量:每个充电桩的谐波按顺序排列 pos = (charger_idx - 1) * harmonic_num + harmonic_idx; % 获取谐波电流值(实数,表示幅值) current_val = x(pos); % 累加到总谐波电流(取绝对值) total_charge_current = total_charge_current + abs(current_val); end end %% 基于牛拉法的基波潮流计算 %基波下,充电桩的参数设定,与x包含的80值无关,但与正反向充电时的功率有关,这块的思路 Ybus = createYbus(ac_baseMVA, ac_bus, ac_branch); Pacs = -ac_bus(:,3); %有功负荷消耗,看做负值 Pacs(ac_gen(:,1)) = ac_gen(:,2) - ac_bus(ac_gen(:,1),3); %发电机节点的有功功率 % 删不删去dg,充电桩的有功功率要不要算,有功注入与无功注入 Pacs(ac_dg(:,1)) = Pacs(ac_dg(:,1))+ ac_dg(:,2) ; %接入dg电源用功注入 Qacs = -ac_bus(:,4); Qacs(ac_gen(:,1)) = ac_gen(:,3) - ac_bus(ac_gen(:,1),4); %发电机节点的无功功率 Qacs(ac_dg(:,1)) = Qacs(ac_dg(:,1))+ ac_dg(:,3) ; %接入dg电源无功注入 Pacs = Pacs/ac_baseMVA; Qacs = Qacs /ac_baseMVA; %标幺化,bus不用标幺化 kac = 0;%迭代次数 %计算节点功率Pi,Qi busNum = length(ac_bus(:, 1)); Bus_V = ac_bus(:, [1,8:9]); %仅用于形成雅克比矩阵 Bus_V(ac_gen(:,1),2) = ac_gen(:,6); %平衡节点电压 Pii=zeros(busNum, 2); %所有节点(包括平衡节点)的Pi Qii=zeros(busNum, 2); Pii(:,1)=Bus_V(:, 1); %没有特殊的含义,复制编号 Qii(:,1)=Bus_V(:, 1); Y = Ybus([ac_pq;ac_pv],[ac_pq;ac_pv]); %除去平衡节点后的Y阵,用于雅克比矩阵,直接去掉该行列 Pacs = Pacs([ac_pq;ac_pv],:); Qacs = Qacs([ac_pq;ac_pv],:); while true for i=1:busNum for j=1:busNum detal_ij=(Bus_V(i,3)-Bus_V(j,3))*pi/180; %角度转弧度 Pii(i, 2)=Pii(i, 2)+Bus_V(j, 2)*(real(Ybus(i, j))*cos(detal_ij)+imag(Ybus(i, j))*sin(detal_ij)); %Pi从2开始 Qii(i, 2)=Qii(i, 2)+Bus_V(j, 2)*(real(Ybus(i, j))*sin(detal_ij)-imag(Ybus(i, j))*cos(detal_ij)); end Pii(i, 2) = Bus_V(i, 2)*Pii(i, 2); Qii(i, 2) = Bus_V(i, 2)*Qii(i, 2); end %重新编号1~m为PQ节点,m+1~n-1+m为PV节点 Pi = Pii([ac_pq;ac_pv], :); %除去平衡节点且重置节点位置 Qi = Qii([ac_pq;ac_pv], :); %除去平衡节点且重置节点位置 V = Bus_V([ac_pq;ac_pv], :); Uac_m = V(:, 2); Uac_a = V(:, 3); Uacs = Uac_m .* exp(1j * (Uac_a*pi/180)); dP = Pacs - Pi(:,2); dQ = Qacs - Qi(:,2); % dP = Pacs - real(Uacs.*conj(Y*Uacs));%公式不能用 % dQ = Qacs - imag(Uacs.*conj(Y*Uacs)); if max(abs(dP)) <= 1e-9 && max(abs(dQ(1:m))) <= 1e-9 %收敛判据 break end [J,H,N,K,L] = Jacobi(V, Y, ac_pq ,ac_pv,Pi,Qi); %返回雅克比矩阵各子矩阵 Ud2 = diag(V(:,2)); dPQ = [dP ; dQ(1:m)]; ang_U = -J^-1*dPQ; dang = ang_U(1:busNum-1); %弧度结果 dU = diag(Uac_m(1:m))*ang_U(busNum:end); %数据修正 Bus_V(V(1:m,1),2) = Bus_V(V(1:m,1),2)+dU; %修正原编号下PQ节点电压幅值和相角 Bus_V(V(:,1),3) = Bus_V(V(:,1),3)+dang*180/pi; %弧度转角度,空载情况角度增加 Pii(:,2) =0; Qii(:,2) = 0; kac = kac+1; end %% 平衡节点功率计算Sn %默认只有一个平衡节点 Ui = Bus_V(:, 2).*cos(Bus_V(:, 3)*pi/180)+1i*Bus_V(:, 2).*sin(Bus_V(:, 3)*pi/180); %电压复数形式 Sn=0; for i=1:busNum Sn = Sn+ Ui(ac_bn)*(conj(Ybus(i, ac_bn))*(conj(Ui(i)))); %Ui*sum(conj(Yij)*conj(Uj)) end %方法一:计算支路电流 branch_num = length(ac_branch(:, 11)); I_branch = zeros(branch_num, 3); S_branch = zeros(branch_num, 5); I_branch(:, 1:2) = ac_branch(:, 1:2); S_branch(:, 1:2) =ac_branch(:, 1:2); from_node = ac_branch(:, 1); to_node = ac_branch(:, 2); z_branch = (ac_branch(:, 3)+1i*ac_branch(:, 4))/ZB; I_branch(:, 3) = (Ui(from_node)-Ui(to_node))./(z_branch); %支路流过的电流 for k = 1:length(I_branch(:,1)) %考虑电容注入电流 I_branch(k, 3) = I_branch(k, 3) +Ui(from_node(k))*(1i*ac_branch(k,5)*ZB)/2; I_branch(k, 3) = I_branch(k, 3) +Ui(to_node(k))*(1i*ac_branch(k,5)*ZB)/2; end S_branch(:, 3) = Ui(from_node).*conj(I_branch(:, 3))*ac_baseMVA; %支路ij流过的容量 S_branch(:, 4) = Ui(to_node).*conj(-I_branch(:, 3))*ac_baseMVA; %支路ji流过的容量 S_branch(:, 5) =real(S_branch(:, 3)+S_branch(:, 4)); %基波潮流有功损耗 ac_loss = sum(S_branch(:, 5)); %计算节点注入电流 bus_num = length(ac_bus(:, 1)); Iii = zeros(bus_num, 2); Iii(:, 1) = ac_bus(:, 1);%标点 Sii = Pii(:,2)+1i*Qii(:, 2); Iii(:, 2) = conj(Sii)./conj(Ui); %注意共轭的取值 Ii = Ybus*Ui; %Ii = Yi1*U1+Yi2*U2+Yi3*U3+…… %% 诺顿谐波潮流计算 harmonic_U_h = zeros(bus_num, 3);%3列,1节点、2谐波幅值、3相角 harmonic_U_h(:, 1)=ac_bus(:, 1);%第一列是节点数 %harmonic_U_h算的是全部33节点的 source_bus = source1(:, 1);%确定谐波源的节点数作为第一列 %单独谐波源的节点编号 %Charge_bus = [5,10,13,16,20,24,11,28,31,17]; % 10个特定节点的编号,作为充电桩 charge_bus=charge1(:,1); %单独充电桩的节点编号 %但是,应该在33节点中设置 harmonic_U_h(source_bus, 2) = 0.05; %谐波源的谐波幅值设为0.05 %全体先设为了0.05吗? harmonic_U_h(:, 3) = 0; %谐波相角设为0 harmonic_num = length(source1(1, :))-1; %此处考虑5,7,11,13,17次谐波,17也全为0 load_power = (ac_bus(:, 3)+1i*ac_bus(:, 4)); %负荷功率MVA Zload = zeros(bus_num, harmonic_num); V_bus_h_total_abs = zeros(harmonic_num , bus_num); I_branch_h_total_abs = zeros(harmonic_num , branch_num); loss = zeros(branch_num ,harmonic_num ); Pi_fam = -Pii(:,2)*ac_baseMVA; Qi_fam = -Qii(:,2)*ac_baseMVA;Sii_fam = Sii*ac_baseMVA;%采用有名值计算 source_R1 = Pi_fam(source_bus).*(Bus_V(source_bus, 2)*UB).^2./(abs(Sii_fam(source_bus))).^2;%阻抗串联模型 source_X1 = Qi_fam(source_bus).*(Bus_V(source_bus, 2)*UB).^2./(abs(Sii_fam(source_bus))).^2; for i = 1:harmonic_num %计算各次的 %谐波源负荷模型被代替 h = 2*i+1; %次数 I_h = zeros(bus_num, 1); %所有节点电流向量,表示一个特定次数的所有电流值(列向量) %charge1(:, i+1)=0; if charge1(:, i+1)==0 %存在一个充电桩发出该次谐波 %这是在假设充电桩也在33以后的形式 Charge_Ih = zeros(bus_num, 1); % 初始化已知谐波电流矩阵(复数,标幺值) for j=1:10 index = (j-1)*8 + i; % 第j个节点的第i次谐波在x中的位置 Charge_Ih(charge_bus(j)) = x(l, index); % charge_bus(j)是第j个充电桩的节点编号 end I_h = Charge_Ih; %上述是对已知量的先赋值给I_h,对于剩下的谐波源及其他节点再计算他们的谐波电流 if source1(:, i+1)~=0 %存在谐波源发出该次谐波 I_h0= -Iii(source1(:,1), 2).*source1(:, i+1); %用节点注入电流约为0.0075时谐波电压畸变率2% %什么意思 基准的意思 harmonic_Uhs = harmonic_U_h(:,2).* exp(1j * (harmonic_U_h(:,3)*pi/180));%谐波电压初始值 Zh_eq = source_R1+1i*h*source_X1; while true %解耦迭代过程 I_eq = harmonic_Uhs(source1(:,1))./Zh_eq; I_eq = I_eq/IB; %标幺化 I_h(source1(:,1)) = I_h0+I_eq; %发电机谐波模型 XG_h = 1i*h*ac_gen(:, 23)/ZB; %负序电抗0.2;XG=1i*h*0.2*sqrt(real(Sn)^2+imag(Sn)^2); yG = 1./XG_h; Zload([ac_bn;ac_pv] , i) = XG_h; %负荷谐波阻抗模型 Num_L= find( load_power(ac_pq) ~=0); %pq节点中非零负荷的位置 RL = real(load_power(ac_pq(Num_L))).*(Bus_V(ac_pq(Num_L), 2)*UB).^2./(abs(load_power(ac_pq(Num_L)))).^2;%有名值计算 RL = RL/ZB; %33节点系统需要标幺化,下同 XL = imag(load_power(ac_pq(Num_L))).*(Bus_V(ac_pq(Num_L), 2)*UB).^2./(abs(load_power(ac_pq(Num_L)))).^2; XL = XL/ZB; Zload(ac_pq(Num_L) ,i) = RL+1i*h*XL; %Z=U^2*S/|S|^2 Zload(source1(:,1) ,i) = Zh_eq/ZB; %电源节点和负荷节点自导纳 yloads=zeros(size(Zload)); for j=1:bus_num if Zload(j, i) ~=0 yloads(j, i) = 1/Zload(j, i); end end % yloads=zeros(bus_num,1); %各节点的负荷等值模型 % for j=1:bus_num % if load_power(j) ~=0 % yloads(j, 1)=real(load_power(j))/Bus_V(j, 2)^2-1i*imag(load_power(j))/(h*Bus_V(j, 2)^2); %yii = Pi/Vi^2-j*Qi/(h*Vi^2)??? % else % yloads(j, 1) = 0; % end % end %线路谐波模型 branch_h = ac_branch;%已经标幺化 branch_h(: ,3) = ac_branch(: ,3); branch_h(: ,4) = h*ac_branch(: ,4); branch_h(: ,5) = h*ac_branch(: ,5); %形成网络谐波导纳矩阵 bus_h = ac_bus;%bus没有标幺化 bus_h(:, 5) = real(yloads(:, i))+bus_h(:, 5)*ZB; %导纳乘以阻抗基准值 bus_h(:, 6) = imag(yloads(:, i))+bus_h(:, 6)*ZB; Ybus_h = createYbus(ac_baseMVA, bus_h, branch_h); %由负荷等值模型和发电机等值模型组成 U_h = (Ybus_h^-1)*I_h; %迭代收敛判据 dU_h = harmonic_Uhs -U_h; if max(abs(dU_h)) <= 1e-7%收敛判据 break end harmonic_Uhs = U_h; end V_bus_h_total_abs (i,:) = abs(U_h); I_bus_h_total_abs(i, :) = abs(I_h); % 保存各节点注入电流幅值 z_branch_h = branch_h(:, 3)+1i*branch_h(:, 4); I_branch_h = (U_h(from_node)-U_h(to_node))./(z_branch_h); % for k = 1:length(I_branch_h) I_branch_h(k) = I_branch_h(k)+U_h(from_node(k))*(1i* branch_h(k,5))/2; I_branch_h(k) = I_branch_h(k)+U_h(to_node(k))*(1i* branch_h(k,5))/2; end I_branch_h_total_abs(i, :) = abs(I_branch_h); Sij_branch_h = U_h(from_node).*conj(I_branch_h); %支路ij流过的容量 Sji_branch_h = U_h(to_node).*conj(-I_branch_h); %支路ji流过的容量 loss(: ,i) =abs(real(Sij_branch_h+Sji_branch_h))*ac_baseMVA*10^6; %谐波潮流有功损耗 % for k= 1:branch_num % yij = abs(1/(branch_h(k, 3)+1i*branch_h(k, 4))); % I_branch_h_total_abs(i, k)=abs(U_h(branch_h(k ,1))-U_h(branch_h(k,2)))*yij;%Iij = |Ui-Uj|*|yij| % end else %fprintf('******%dth harmonic is not considered******\n',h); end end end p=size(abs(U_h)); THDU = sqrt(sum(V_bus_h_total_abs.^2, 1)) ./ Bus_V(:, 2)';%各个节点的谐波畸变率 sum_THDU = sum(THDU)/100; % 所有节点的 THDU 总和 f11=sum_THDU; f1(l,1)=f11; % 计算电压偏差(例如:所有节点电压与额定电压的偏差的最大值) %nominal_voltage = 1.0; % 假设额定电压为1.0 p.u. % voltage_deviation = max(abs(Bus_V(:, 2) - nominal_voltage))/0.1; % f22 = voltage_deviation ;% 第二个目标电压偏差最小化 % f2(l,1)=f22; %end % 计算充电桩谐波电流绝对值之和 (f2) f22 = total_charge_current; f2(l,1)=f22; % 添加对抗性关系:当谐波电流很小时,强制增加THD % if f22 <500 % 阈值可根据实际情况调整 % f11 = f11 + 5 * (400 - f22); % 惩罚项 % f1(l,1)=f11; %end f=[f1,f2]; end %for iter=1:7 % 打印调试信息 iter=1; disp(['Iteration ', num2str(iter), ':']); disp(['f1: min = ', num2str(min(f1)), ', max = ', num2str(max(f1))]); disp(['f2: min = ', num2str(min(f2)), ', max = ', num2str(max(f2))]); R = corrcoef([f1, f2]); disp(['Correlation between f1 and f2: ', num2str(R(1,2))]); end %d=[U_h;I_h;THDU];%这里不是目标函数,不需要回到example中的REP中,只要在另一个程序中画图即可,那个程序在寻优之后,是运用寻优得到的确切各个电流值来画图即可 请用matlab回答

追问,方法1的最小化电压偏差,我已下代码的计算可以吗,是否正确计算 function f= m(x) %%这个函数就是给一组粒子,返回一个sumTHDU! %% n=size(x,1);%粒子数。 %x包含了所有粒子的所有变量,200*80 for iter = 1:7 for l=1:n %l的意思是每一种粒子情况下的一个sumTHDU,最终会合在一个f中,输出给example的REP中 %80个谐波电流值用x(l,j)的形式带入,表示第l个粒子情况下的第j个谐波电流的大小,10*8的一行排布 %以上是构建粒子群的循环代码,以下是在一个粒子值下的运算结果(得到一个sum) %% ac_data = case33bw_60; %这里未使用loadcase %case33bw case_ieee34 ac_case8(阻抗较小) ac_baseMVA = ac_data.baseMVA; ac_bus = ac_data.bus; ac_branch = ac_data.branch; ac_gen = ac_data.gen; ac_dg = ac_data.dg; %%电网数据 source1 = ac_data.source; %谐波源 charge1=ac_data.charge; %充电桩需要再单独在33中去设置 ac_bn = find(ac_bus(:, 2)==3); %平衡节点 ac_pv = find(ac_bus(:, 2)==2); %PV节点 ac_pq = find(ac_bus(:, 2)==1); %PQ节点 UB = ac_bus(1,10); ZB =UB^2/ac_baseMVA; IB = ac_baseMVA/sqrt(3)/UB; m = length (ac_pq); % 初始化变量:保存各节点各次谐波注入电流幅值 harmonic_num = length(source1(1, :))-1; bus_num = length(ac_bus(:, 1)); I_bus_h_total_abs = zeros(harmonic_num, bus_num); % harmonic_num x bus_num f1 = zeros(n, 1); f2 = zeros(n, 1); %% 基于牛拉法的基波潮流计算 %基波下,充电桩的参数设定,与x包含的80值无关,但与正反向充电时的功率有关,这块的思路 Ybus = createYbus(ac_baseMVA, ac_bus, ac_branch); Pacs = -ac_bus(:,3); %有功负荷消耗,看做负值 Pacs(ac_gen(:,1)) = ac_gen(:,2) - ac_bus(ac_gen(:,1),3); %发电机节点的有功功率 % 删不删去dg,充电桩的有功功率要不要算,有功注入与无功注入 Pacs(ac_dg(:,1)) = Pacs(ac_dg(:,1))+ ac_dg(:,2) ; %接入dg电源用功注入 Qacs = -ac_bus(:,4); Qacs(ac_gen(:,1)) = ac_gen(:,3) - ac_bus(ac_gen(:,1),4); %发电机节点的无功功率 Qacs(ac_dg(:,1)) = Qacs(ac_dg(:,1))+ ac_dg(:,3) ; %接入dg电源无功注入 Pacs = Pacs/ac_baseMVA; Qacs = Qacs /ac_baseMVA; %标幺化,bus不用标幺化 kac = 0;%迭代次数 %计算节点功率Pi,Qi busNum = length(ac_bus(:, 1)); Bus_V = ac_bus(:, [1,8:9]); %仅用于形成雅克比矩阵 Bus_V(ac_gen(:,1),2) = ac_gen(:,6); %平衡节点电压 Pii=zeros(busNum, 2); %所有节点(包括平衡节点)的Pi Qii=zeros(busNum, 2); Pii(:,1)=Bus_V(:, 1); %没有特殊的含义,复制编号 Qii(:,1)=Bus_V(:, 1); Y = Ybus([ac_pq;ac_pv],[ac_pq;ac_pv]); %除去平衡节点后的Y阵,用于雅克比矩阵,直接去掉该行列 Pacs = Pacs([ac_pq;ac_pv],:); Qacs = Qacs([ac_pq;ac_pv],:); while true for i=1:busNum for j=1:busNum detal_ij=(Bus_V(i,3)-Bus_V(j,3))*pi/180; %角度转弧度 Pii(i, 2)=Pii(i, 2)+Bus_V(j, 2)*(real(Ybus(i, j))*cos(detal_ij)+imag(Ybus(i, j))*sin(detal_ij)); %Pi从2开始 Qii(i, 2)=Qii(i, 2)+Bus_V(j, 2)*(real(Ybus(i, j))*sin(detal_ij)-imag(Ybus(i, j))*cos(detal_ij)); end Pii(i, 2) = Bus_V(i, 2)*Pii(i, 2); Qii(i, 2) = Bus_V(i, 2)*Qii(i, 2); end %重新编号1~m为PQ节点,m+1~n-1+m为PV节点 Pi = Pii([ac_pq;ac_pv], :); %除去平衡节点且重置节点位置 Qi = Qii([ac_pq;ac_pv], :); %除去平衡节点且重置节点位置 V = Bus_V([ac_pq;ac_pv], :); Uac_m = V(:, 2); Uac_a = V(:, 3); Uacs = Uac_m .* exp(1j * (Uac_a*pi/180)); dP = Pacs - Pi(:,2); dQ = Qacs - Qi(:,2); % dP = Pacs - real(Uacs.*conj(Y*Uacs));%公式不能用 % dQ = Qacs - imag(Uacs.*conj(Y*Uacs)); if max(abs(dP)) <= 1e-9 && max(abs(dQ(1:m))) <= 1e-9 %收敛判据 break end [J,H,N,K,L] = Jacobi(V, Y, ac_pq ,ac_pv,Pi,Qi); %返回雅克比矩阵各子矩阵 Ud2 = diag(V(:,2)); dPQ = [dP ; dQ(1:m)]; ang_U = -J^-1*dPQ; dang = ang_U(1:busNum-1); %弧度结果 dU = diag(Uac_m(1:m))*ang_U(busNum:end); %数据修正 Bus_V(V(1:m,1),2) = Bus_V(V(1:m,1),2)+dU; %修正原编号下PQ节点电压幅值和相角 Bus_V(V(:,1),3) = Bus_V(V(:,1),3)+dang*180/pi; %弧度转角度,空载情况角度增加 Pii(:,2) =0; Qii(:,2) = 0; kac = kac+1; end %% 平衡节点功率计算Sn %默认只有一个平衡节点 Ui = Bus_V(:, 2).*cos(Bus_V(:, 3)*pi/180)+1i*Bus_V(:, 2).*sin(Bus_V(:, 3)*pi/180); %电压复数形式 Sn=0; for i=1:busNum Sn = Sn+ Ui(ac_bn)*(conj(Ybus(i, ac_bn))*(conj(Ui(i)))); %Ui*sum(conj(Yij)*conj(Uj)) end %方法一:计算支路电流 branch_num = length(ac_branch(:, 11)); I_branch = zeros(branch_num, 3); S_branch = zeros(branch_num, 5); I_branch(:, 1:2) = ac_branch(:, 1:2); S_branch(:, 1:2) =ac_branch(:, 1:2); from_node = ac_branch(:, 1); to_node = ac_branch(:, 2); z_branch = (ac_branch(:, 3)+1i*ac_branch(:, 4))/ZB; I_branch(:, 3) = (Ui(from_node)-Ui(to_node))./(z_branch); %支路流过的电流 for k = 1:length(I_branch(:,1)) %考虑电容注入电流 I_branch(k, 3) = I_branch(k, 3) +Ui(from_node(k))*(1i*ac_branch(k,5)*ZB)/2; I_branch(k, 3) = I_branch(k, 3) +Ui(to_node(k))*(1i*ac_branch(k,5)*ZB)/2; end S_branch(:, 3) = Ui(from_node).*conj(I_branch(:, 3))*ac_baseMVA; %支路ij流过的容量 S_branch(:, 4) = Ui(to_node).*conj(-I_branch(:, 3))*ac_baseMVA; %支路ji流过的容量 S_branch(:, 5) =real(S_branch(:, 3)+S_branch(:, 4)); %基波潮流有功损耗 ac_loss = sum(S_branch(:, 5)); %计算节点注入电流 bus_num = length(ac_bus(:, 1)); Iii = zeros(bus_num, 2); Iii(:, 1) = ac_bus(:, 1);%标点 Sii = Pii(:,2)+1i*Qii(:, 2); Iii(:, 2) = conj(Sii)./conj(Ui); %注意共轭的取值 Ii = Ybus*Ui; %Ii = Yi1*U1+Yi2*U2+Yi3*U3+…… %% 诺顿谐波潮流计算 harmonic_U_h = zeros(bus_num, 3);%3列,1节点、2谐波幅值、3相角 harmonic_U_h(:, 1)=ac_bus(:, 1);%第一列是节点数 %harmonic_U_h算的是全部33节点的 source_bus = source1(:, 1);%确定谐波源的节点数作为第一列 %单独谐波源的节点编号 %Charge_bus = [5,10,13,16,20,24,11,28,31,17]; % 10个特定节点的编号,作为充电桩 charge_bus=charge1(:,1); %单独充电桩的节点编号 %但是,应该在33节点中设置 harmonic_U_h(source_bus, 2) = 0.05; %谐波源的谐波幅值设为0.05 %全体先设为了0.05吗? harmonic_U_h(:, 3) = 0; %谐波相角设为0 harmonic_num = length(source1(1, :))-1; %此处考虑5,7,11,13,17次谐波,17也全为0 load_power = (ac_bus(:, 3)+1i*ac_bus(:, 4)); %负荷功率MVA Zload = zeros(bus_num, harmonic_num); V_bus_h_total_abs = zeros(harmonic_num , bus_num); I_branch_h_total_abs = zeros(harmonic_num , branch_num); loss = zeros(branch_num ,harmonic_num ); Pi_fam = -Pii(:,2)*ac_baseMVA; Qi_fam = -Qii(:,2)*ac_baseMVA;Sii_fam = Sii*ac_baseMVA;%采用有名值计算 source_R1 = Pi_fam(source_bus).*(Bus_V(source_bus, 2)*UB).^2./(abs(Sii_fam(source_bus))).^2;%阻抗串联模型 source_X1 = Qi_fam(source_bus).*(Bus_V(source_bus, 2)*UB).^2./(abs(Sii_fam(source_bus))).^2; for i = 1:harmonic_num %计算各次的 %谐波源负荷模型被代替 h = 2*i+1; %次数 I_h = zeros(bus_num, 1); %所有节点电流向量,表示一个特定次数的所有电流值(列向量) charge1(:, i+1)=0; if charge1(:, i+1)==0 %存在一个充电桩发出该次谐波 %这是在假设充电桩也在33以后的形式 Charge_Ih = zeros(bus_num, 1); % 初始化已知谐波电流矩阵(复数,标幺值) for j=1:10 index = (j-1)*8 + i; % 第j个节点的第i次谐波在x中的位置 Charge_Ih(charge_bus(j)) = x(l, index); % charge_bus(j)是第j个充电桩的节点编号 end I_h = Charge_Ih; %上述是对已知量的先赋值给I_h,对于剩下的谐波源及其他节点再计算他们的谐波电流 if source1(:, i+1)~=0 %存在谐波源发出该次谐波 I_h0= -Iii(source1(:,1), 2).*source1(:, i+1); %用节点注入电流约为0.0075时谐波电压畸变率2% %什么意思 基准的意思 harmonic_Uhs = harmonic_U_h(:,2).* exp(1j * (harmonic_U_h(:,3)*pi/180));%谐波电压初始值 Zh_eq = source_R1+1i*h*source_X1; while true %解耦迭代过程 I_eq = harmonic_Uhs(source1(:,1))./Zh_eq; I_eq = I_eq/IB; %标幺化 I_h(source1(:,1)) = I_h0+I_eq; %发电机谐波模型 XG_h = 1i*h*ac_gen(:, 23)/ZB; %负序电抗0.2;XG=1i*h*0.2*sqrt(real(Sn)^2+imag(Sn)^2); yG = 1./XG_h; Zload([ac_bn;ac_pv] , i) = XG_h; %负荷谐波阻抗模型 Num_L= find( load_power(ac_pq) ~=0); %pq节点中非零负荷的位置 RL = real(load_power(ac_pq(Num_L))).*(Bus_V(ac_pq(Num_L), 2)*UB).^2./(abs(load_power(ac_pq(Num_L)))).^2;%有名值计算 RL = RL/ZB; %33节点系统需要标幺化,下同 XL = imag(load_power(ac_pq(Num_L))).*(Bus_V(ac_pq(Num_L), 2)*UB).^2./(abs(load_power(ac_pq(Num_L)))).^2; XL = XL/ZB; Zload(ac_pq(Num_L) ,i) = RL+1i*h*XL; %Z=U^2*S/|S|^2 Zload(source1(:,1) ,i) = Zh_eq/ZB; %电源节点和负荷节点自导纳 yloads=zeros(size(Zload)); for j=1:bus_num if Zload(j, i) ~=0 yloads(j, i) = 1/Zload(j, i); end end % yloads=zeros(bus_num,1); %各节点的负荷等值模型 % for j=1:bus_num % if load_power(j) ~=0 % yloads(j, 1)=real(load_power(j))/Bus_V(j, 2)^2-1i*imag(load_power(j))/(h*Bus_V(j, 2)^2); %yii = Pi/Vi^2-j*Qi/(h*Vi^2)??? % else % yloads(j, 1) = 0; % end % end %线路谐波模型 branch_h = ac_branch;%已经标幺化 branch_h(: ,3) = ac_branch(: ,3); branch_h(: ,4) = h*ac_branch(: ,4); branch_h(: ,5) = h*ac_branch(: ,5); %形成网络谐波导纳矩阵 bus_h = ac_bus;%bus没有标幺化 bus_h(:, 5) = real(yloads(:, i))+bus_h(:, 5)*ZB; %导纳乘以阻抗基准值 bus_h(:, 6) = imag(yloads(:, i))+bus_h(:, 6)*ZB; Ybus_h = createYbus(ac_baseMVA, bus_h, branch_h); %由负荷等值模型和发电机等值模型组成 U_h = (Ybus_h^-1)*I_h; %迭代收敛判据 dU_h = harmonic_Uhs -U_h; if max(abs(dU_h)) <= 1e-7%收敛判据 break end harmonic_Uhs = U_h; end V_bus_h_total_abs (i,:) = abs(U_h); I_bus_h_total_abs(i, :) = abs(I_h); % 保存各节点注入电流幅值 z_branch_h = branch_h(:, 3)+1i*branch_h(:, 4); I_branch_h = (U_h(from_node)-U_h(to_node))./(z_branch_h); % for k = 1:length(I_branch_h) I_branch_h(k) = I_branch_h(k)+U_h(from_node(k))*(1i* branch_h(k,5))/2; I_branch_h(k) = I_branch_h(k)+U_h(to_node(k))*(1i* branch_h(k,5))/2; end I_branch_h_total_abs(i, :) = abs(I_branch_h); Sij_branch_h = U_h(from_node).*conj(I_branch_h); %支路ij流过的容量 Sji_branch_h = U_h(to_node).*conj(-I_branch_h); %支路ji流过的容量 loss(: ,i) =abs(real(Sij_branch_h+Sji_branch_h))*ac_baseMVA*10^6; %谐波潮流有功损耗 % for k= 1:branch_num % yij = abs(1/(branch_h(k, 3)+1i*branch_h(k, 4))); % I_branch_h_total_abs(i, k)=abs(U_h(branch_h(k ,1))-U_h(branch_h(k,2)))*yij;%Iij = |Ui-Uj|*|yij| % end else %fprintf('******%dth harmonic is not considered******\n',h); end end end p=size(abs(U_h)); THDU = sqrt(sum(V_bus_h_total_abs.^2, 1)) ./ Bus_V(:, 2)';%各个节点的谐波畸变率 sum_THDU = sum(THDU)/10000; % 所有节点的 THDU 总和 f11=sum_THDU; f1(l,1)=f11; % 计算电压偏差(例如:所有节点电压与额定电压的偏差的最大值) nominal_voltage = 1.0; % 假设额定电压为1.0 p.u. voltage_deviation = max(abs(Bus_V(:, 2) - nominal_voltage))/0.1; f22 = voltage_deviation ;% 第二个目标电压偏差最小化 f2(l,1)=f22; end f=[f1,f2]; end % 打印调试信息 disp(['Iteration ', num2str(iter), ':']); disp(['f1: min = ', num2str(min(f1)), ', max = ', num2str(max(f1))]); disp(['f2: min = ', num2str(min(f2)), ', max = ', num2str(max(f2))]); R = corrcoef([f1, f2]); disp(['Correlation between f1 and f2: ', num2str(R(1,2))]); end %d=[U_h;I_h;THDU];%这里不是目标函数,不需要回到example中的REP中,只要在另一个程序中画图即可,那个程序在寻优之后,是运用寻优得到的确切各个电流值来画图即可

最新推荐

recommend-type

Comsol声子晶体能带计算:六角与三角晶格原胞选取及布里渊区高对称点选择 - 声子晶体 v1.0

内容概要:本文详细探讨了利用Comsol进行声子晶体能带计算过程中,六角晶格和三角晶格原胞选取的不同方法及其对简约布里渊区高对称点选择的影响。文中不仅介绍了两种晶格类型的基矢量定义方式,还强调了正确设置周期性边界条件(特别是相位补偿)的重要性,以避免计算误差如鬼带现象。同时,提供了具体的MATLAB代码片段用于演示关键步骤,并分享了一些实践经验,例如如何通过观察能带图中的狄拉克锥特征来验证路径设置的准确性。 适合人群:从事材料科学、物理学研究的专业人士,尤其是那些正在使用或计划使用Comsol软件进行声子晶体模拟的研究人员。 使用场景及目标:帮助研究人员更好地理解和掌握在Comsol环境中针对不同类型晶格进行精确的声子晶体能带计算的方法和技术要点,从而提高仿真精度并减少常见错误的发生。 其他说明:文章中提到的实际案例展示了因晶格类型混淆而导致的问题,提醒使用者注意细节差异,确保模型构建无误。此外,文中提供的代码片段可以直接应用于相关项目中作为参考模板。
recommend-type

springboot213大学生心理健康管理系统的设计与实现.zip

springboot213大学生心理健康管理系统的设计与实现
recommend-type

三轴自动锁螺丝机PLC配方编程:吸钉式锁螺丝智能调整与注释详解 变址寄存器 高效版

一种基于三菱FX系列PLC的三轴自动锁螺丝机的配方编程方法。该系统采用吸钉式锁螺丝方式,通过PLC进行智能管理和调整。主要内容包括:利用D寄存器阵列和变址寄存器Z来存储和管理不同配方的数据,如坐标和螺丝数量;通过触摸屏和示教器简化调试流程,使工人能够快速设置和保存参数;并通过RS指令将数据保存到触摸屏内置存储中。此外,还展示了具体的PLC程序片段,解释了如何通过简单的寄存器操作实现复杂的配方管理和自动化操作。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和机械设备调试的专业人士。 使用场景及目标:适用于需要提高生产效率和简化调试流程的制造业企业。主要目标是帮助技术人员掌握如何使用PLC进行配方管理,优化自动锁螺丝机的操作流程,减少人工干预,提升设备的智能化水平。 其他说明:文中提供的具体PLC程序代码和详细的注释有助于读者更好地理解和应用相关技术。同时,通过实例演示了如何利用PLC寄存器寻址特性和变址寄存器简化程序逻辑,为类似项目提供有价值的参考。
recommend-type

基于QT与STM32的Modbus-TCP四遥功能实现及源码解析

基于Qt开发的Modbus-TCP远程控制系统,用于实现四遥(遥测、遥控、遥信、遥调)功能。系统由上位机和下位机组成,上位机使用Qt进行图形界面开发,下位机采用STM32和W5500以太网模块,所有Modbus功能均自行实现,未使用第三方库。文中具体展示了各个功能的实现细节,包括ADC数据采集、LED控制、按键状态读取以及参数调节等功能的具体代码实现。 适合人群:具有一定嵌入式开发经验的研发人员,尤其是熟悉Qt和STM32的开发者。 使用场景及目标:适用于工业自动化、智能家居等领域,旨在帮助开发者理解和实现基于Modbus-TCP协议的远程控制系统,掌握四遥功能的具体实现方法。 其他说明:文中提供了详细的代码片段和技术难点解析,有助于读者深入理解系统的实现过程。同时,针对常见的开发问题给出了具体的解决方案,如浮点数转换、字节序处理等。
recommend-type

ERP系统客户与供应商信息视图创建:Oracle数据库中客户和供应商数据整合查询设计

内容概要:本文档定义了一个名为 `xxx_SCustSuplier_info` 的视图,用于整合和展示客户(Customer)和供应商(Supplier)的相关信息。视图通过连接多个表来获取组织单位、客户账户、站点使用、位置、财务代码组合等数据。对于客户部分,视图选择了与账单相关的记录,并提取了账单客户ID、账单站点ID、客户名称、账户名称、站点代码、状态、付款条款等信息;对于供应商部分,视图选择了有效的供应商及其站点信息,包括供应商ID、供应商名称、供应商编号、状态、付款条款、财务代码组合等。视图还通过外连接确保即使某些字段为空也能显示相关信息。 适合人群:熟悉Oracle ERP系统,尤其是应付账款(AP)和应收账款(AR)模块的数据库管理员或开发人员;需要查询和管理客户及供应商信息的业务分析师。 使用场景及目标:① 数据库管理员可以通过此视图快速查询客户和供应商的基本信息,包括账单信息、财务代码组合等;② 开发人员可以利用此视图进行报表开发或数据迁移;③ 业务分析师可以使用此视图进行数据分析,如信用评估、付款周期分析等。 阅读建议:由于该视图涉及多个表的复杂连接,建议读者先熟悉各个表的结构和关系,特别是 `hz_parties`、`hz_cust_accounts`、`ap_suppliers` 等核心表。此外,注意视图中使用的外连接(如 `gl_code_combinations_kfv` 表的连接),这可能会影响查询结果的完整性。
recommend-type

Web前端开发:CSS与HTML设计模式深入解析

《Pro CSS and HTML Design Patterns》是一本专注于Web前端设计模式的书籍,特别针对CSS(层叠样式表)和HTML(超文本标记语言)的高级应用进行了深入探讨。这本书籍属于Pro系列,旨在为专业Web开发人员提供实用的设计模式和实践指南,帮助他们构建高效、美观且可维护的网站和应用程序。 在介绍这本书的知识点之前,我们首先需要了解CSS和HTML的基础知识,以及它们在Web开发中的重要性。 HTML是用于创建网页和Web应用程序的标准标记语言。它允许开发者通过一系列的标签来定义网页的结构和内容,如段落、标题、链接、图片等。HTML5作为最新版本,不仅增强了网页的表现力,还引入了更多新的特性,例如视频和音频的内置支持、绘图API、离线存储等。 CSS是用于描述HTML文档的表现(即布局、颜色、字体等样式)的样式表语言。它能够让开发者将内容的表现从结构中分离出来,使得网页设计更加模块化和易于维护。随着Web技术的发展,CSS也经历了多个版本的更新,引入了如Flexbox、Grid布局、过渡、动画以及Sass和Less等预处理器技术。 现在让我们来详细探讨《Pro CSS and HTML Design Patterns》中可能包含的知识点: 1. CSS基础和选择器: 书中可能会涵盖CSS基本概念,如盒模型、边距、填充、边框、背景和定位等。同时还会介绍CSS选择器的高级用法,例如属性选择器、伪类选择器、伪元素选择器以及选择器的组合使用。 2. CSS布局技术: 布局是网页设计中的核心部分。本书可能会详细讲解各种CSS布局技术,包括传统的浮动(Floats)布局、定位(Positioning)布局,以及最新的布局模式如Flexbox和CSS Grid。此外,也会介绍响应式设计的媒体查询、视口(Viewport)单位等。 3. 高级CSS技巧: 这些技巧可能包括动画和过渡效果,以及如何优化性能和兼容性。例如,CSS3动画、关键帧动画、转换(Transforms)、滤镜(Filters)和混合模式(Blend Modes)。 4. HTML5特性: 书中可能会深入探讨HTML5的新标签和语义化元素,如`<article>`、`<section>`、`<nav>`等,以及如何使用它们来构建更加标准化和语义化的页面结构。还会涉及到Web表单的新特性,比如表单验证、新的输入类型等。 5. 可访问性(Accessibility): Web可访问性越来越受到重视。本书可能会介绍如何通过HTML和CSS来提升网站的无障碍访问性,比如使用ARIA标签(Accessible Rich Internet Applications)来增强屏幕阅读器的使用体验。 6. 前端性能优化: 性能优化是任何Web项目成功的关键。本书可能会涵盖如何通过优化CSS和HTML来提升网站的加载速度和运行效率。内容可能包括代码压缩、合并、避免重绘和回流、使用Web字体的最佳实践等。 7. JavaScript与CSS/HTML的交互: 在现代Web开发中,JavaScript与CSS及HTML的交云并用是不可或缺的。书中可能会讲解如何通过JavaScript动态地修改样式、操作DOM元素以及使用事件监听和响应用户交互。 8. Web框架和预处理器: 这本书可能会提到流行的Web开发框架和预处理器,比如Bootstrap、Foundation、Sass和Less等,它们是如何简化和加速开发流程的。 9. 测试和维护: 书中也可能包含关于如何测试网页以及如何持续优化和维护CSS和HTML代码的章节。例如,使用断言测试、自动化测试、性能分析工具等。 最后,鉴于文件名称列表中的“压缩包子文件”的表述,这可能是对“压缩包”文件的一种误译或误用,此处“压缩包”应该指的是包含该书籍PDF文件的压缩文件格式,如ZIP或RAR。而“Pro CSS and HTML Design Patterns.pdf”指的就是该书籍的PDF格式电子版文件。 以上所述,构成了《Pro CSS and HTML Design Patterns》一书可能包含的核心知识点。通过学习这些内容,Web前端开发者可以掌握更为高效和优雅的设计模式,从而在日常工作中更高效地解决实际问题。
recommend-type

Zotero 7数据同步:Attanger插件安装&设置,打造文献管理利器

/i.s3.glbimg.com/v1/AUTH_08fbf48bc0524877943fe86e43087e7a/internal_photos/bs/2018/L/j/ipKA8TRPyt4ptaG1DGww/t-m-01.png) # 1. Zotero 7数据同步简介 在数字时代,管理研究数据变得日益重要,而Zot
recommend-type

卷积神经网络的基础理论200字

<think>我们正在回答用户关于卷积神经网络(CNN)基础理论的询问。根据提供的引用资料,我们可以概述CNN的基本结构和工作原理。引用[1]提到CNN是一种前馈神经网络,信息从输入单向流动到输出。引用[2]指出CNN在图像处理等领域应用广泛,通过层次结构和参数调整实现模式识别。引用[3]说明CNN包含卷积层,使用卷积核提取局部特征,减少参数量,提高效率。引用[4]则提到了训练过程,包括前向传播、误差计算和反向传播(梯度下降)。因此,我们将从以下几个方面概述CNN:1.CNN的基本结构(卷积层、池化层、全连接层)2.卷积操作的工作原理(局部感受野、权重共享)3.训练过程(前向传播、损失函数、反
recommend-type

轻便实用的Java库类查询工具介绍

标题 "java2库类查询" 和描述表明,所提及的工具是一个专门用于查询Java库类的应用程序。此软件旨在帮助开发者快速地查找和引用Java的标准开发工具包(SDK)中包含的所有应用程序编程接口(API)类。通过这样的工具,开发者可以节省大量在官方文档或搜索引擎上寻找类定义和使用方法的时间。它被描述为轻巧且方便,这表明其占用的系统资源相对较少,同时提供直观的用户界面,使得查询过程简洁高效。 从描述中可以得出几个关键知识点: 1. Java SDK:Java的软件开发工具包(SDK)是Java平台的一部分,提供了一套用于开发Java应用软件的软件包和库。这些软件包通常被称为API,为开发者提供了编程界面,使他们能够使用Java语言编写各种类型的应用程序。 2. 库类查询:这个功能对于开发者来说非常关键,因为它提供了一个快速查找特定库类及其相关方法、属性和使用示例的途径。良好的库类查询工具可以帮助开发者提高工作效率,减少因查找文档而中断编程思路的时间。 3. 轻巧性:软件的轻巧性通常意味着它对计算机资源的要求较低。这样的特性对于资源受限的系统尤为重要,比如老旧的计算机、嵌入式设备或是当开发者希望最小化其开发环境占用空间时。 4. 方便性:软件的方便性通常关联于其用户界面设计,一个直观、易用的界面可以让用户快速上手,并减少在使用过程中遇到的障碍。 5. 包含所有API:一个优秀的Java库类查询软件应当能够覆盖Java所有标准API,这包括Java.lang、Java.util、Java.io等核心包,以及Java SE平台的所有其他标准扩展包。 从标签 "java 库 查询 类" 可知,这个软件紧密关联于Java编程语言的核心功能——库类的管理和查询。这些标签可以关联到以下知识点: - Java:一种广泛用于企业级应用、移动应用(如Android应用)、网站后端、大型系统和许多其他平台的编程语言。 - 库:在Java中,库是一组预打包的类和接口,它们可以被应用程序重复使用。Java提供了庞大的标准库,以支持各种常见的任务和功能。 - 查询:查询指的是利用软件工具搜索、定位和检索信息的过程。对于Java库类查询工具来说,这意味着可以通过类名、方法签名或其他标识符来查找特定的API条目。 最后,压缩包文件列表包含了两个文件:“java.dit”和“Java.exe”。其中“Java.exe”很可能是程序的可执行文件,而“java.dit”可能是一个数据文件,用于存储Java类的索引或数据。由于文件名后缀通常与文件类型相关联,但“dit”并不是一个常见的文件扩展名。这可能是一个特定于软件的自定义格式,或是一个打字错误。 总结来说,"java2库类查询" 是一个针对Java开发者的实用工具,它提供了一个轻量级、易用的平台来查询和定位Java标准库中的所有类和API。此工具对优化开发流程,减少查找Java类文档的时间大有裨益,尤其适合需要频繁查阅Java API的开发者使用。
recommend-type

【Zotero 7终极指南】:新手必备!Attanger插件全攻略与数据同步神技

# 1. Zotero 7与Attanger插件的介绍 在当今的学术研究和知识管理领域,高效的文献管理工具至关重要。Zotero 7作为一个流行的参考文献管理软件,因其强大的功能和用户友好的界面而受到专业人士的青睐。而Attanger插件则为Zotero 7带来了更多定制化和高级功能,极大地增强