📄 fm_pmutry.m
字号:
function [pmu_test2, I_idx_test, pseudi_test ,pmu_status, min_pmu] = fm_pmutry(pmu_test2,I_idx_test, pseudi_test ,pmu_status,sel_pmu,hdl_nob,hdl_pmu, min_pmu, zeroinj)% FM_PMUTRY routine for PMU placement%% (...) = FM_PMUTRY(...)%%This routine is generally called by FM_PMULOC%%Author: Federico Milano%Date: 11-Nov-2002%Version: 1.0.0%%E-mail: Federico.Milano@uclm.es%Web-site: http://www.uclm.es/area/gsee/Web/Federico%% Copyright (C) 2002-2008 Federico Milanoglobal Bus Line Fig Settingspmu_test = pmu_test2{sel_pmu};test_len = length(pmu_test);pmu_test3 = [];I_idx_test3 = [];pseudi_test3 = [];test3_idx = 0;idx4 = [];for i = 1:test_len vaipure = 1; connes = find(Line.Y(Bus.int(pmu_test(i)),:)); for j = 1:length(connes) if length(find(Line.Y(connes(j),:))) == 2 & ... zeroinj(Bus.int(pmu_test(i))) > 0 vaipure = 0; break end end if vaipure pmu_test_new = pmu_test([1:i-1, i+1:test_len]); if Fig.pmu set(hdl_pmu,'String',int2str(test_len)); drawnow end linee = [Line.fr, Line.to]; I_idx = []; nodi = []; pseudoi = 0; for ijk = 1:test_len-1 i_idx = fm_iidx(pmu_test_new(ijk),linee); I_idx = [I_idx; i_idx]; nodi_oss = [i_idx(:,4);pmu_test_new(ijk)]; nodi = [nodi; nodi_oss]; if Fig.pmu set(hdl_nob,'String',int2str(length(nodi))); drawnow end end linee(I_idx(:,2),[1 2]) = zeros(length(I_idx(:,1)),2); % determinazione delle pseudo-correnti determinate con % la legge di Kirchhoff per le correnti % ed eliminazione dei nodi di cui si può determinare la % tensione con la legge di Ohm % determinazione delle pseudo-correnti nelle linee ai cui % estremi sono note le tensioni for ii = 1:length(nodi) I_idx_from = find(linee(:,1) == nodi(ii)); if ~isempty(I_idx_from) I_idx_to = []; for jj = 1:length(I_idx_from) if ~isempty(find(nodi == linee(I_idx_from(jj),2))) I_idx_to = [I_idx_to; I_idx_from(jj)]; end end if ~isempty(I_idx_to); n_current = length(I_idx_to); api = [[1:n_current]', I_idx_to]; bpi = linee(I_idx_to,[1 2]); cpi = ones(length(I_idx_to),1); pi_idx = [api, bpi, cpi]; linee(pi_idx(:,2),[1 2]) = zeros(length(pi_idx(:,1)),2); I_idx = [I_idx; pi_idx]; pseudoi = pseudoi + length(pi_idx(:,1)); end end end count = 1; while count < length(nodi) if zeroinj(Bus.int(nodi(count))) == 0 I_idx_from = find(linee(:,1) == nodi(count)); I_idx_to = find(linee(:,2) == nodi(count)); ncfrom = length(I_idx_from); ncto = length(I_idx_to); nc = ncfrom + ncto; if nc == 1 if ncfrom == 1 ki_idx = [1, I_idx_from, linee(I_idx_from,[1 2]), 1]; else ki_idx = [1, I_idx_to, linee(I_idx_to,[2 1]), -1]; end linee(ki_idx(2),[1 2]) = zeros(length(ki_idx(1)),2); I_idx = [I_idx; ki_idx]; pseudoi = pseudoi + length(ki_idx(1)); nodi_oss = [nodi_oss; ki_idx(4)]; nodi = [ki_idx(4); nodi]; if Fig.pmu set(hdl_nob,'String',int2str(length(nodi))); drawnow end % dopo l'aggiunta di un nuovo nodo misurato bisogna % ricontrollare tutti i nodi count = 1; % ricerca di pseudo-correnti che possono essere misurate % con il nodo aggiunto for ii = 1:length(nodi) I_idx_from = find(linee(:,1) == nodi(ii)); if ~isempty(I_idx_from) I_idx_to = []; for jj = 1:length(I_idx_from) if ~isempty(find(nodi == linee(I_idx_from(jj),2))) I_idx_to = [I_idx_to; I_idx_from(jj)]; end end if ~isempty(I_idx_to); n_current = length(I_idx_to); api = [[1:n_current]', I_idx_to]; bpi = linee(I_idx_to,[1 2]); cpi = ones(length(I_idx_to),1); pi_idx = [api, bpi, cpi]; linee(pi_idx(:,2),[1 2]) = zeros(length(pi_idx(:,1)),2); I_idx = [I_idx; pi_idx]; pseudoi = pseudoi + length(pi_idx(:,1)); end end end else count = count + 1; end else count = count + 1; end end nodi_ord = sort(nodi); num_nodi = length(nodi); nodi_el = []; for jjj = 1:num_nodi nodi_el = [nodi_el; jjj+find(nodi_ord([jjj+1:num_nodi]) == ... nodi_ord(jjj))]; end nodi_ord(nodi_el) = []; if Fig.pmu set(hdl_nob,'String',int2str(Bus.n-length(nodi_ord))); drawnow end if length(nodi_ord) == Bus.n idx4 = [idx4; i]; test3_idx = test3_idx + 1; pmu_test3{test3_idx,1} = pmu_test_new; I_idx_test3{test3_idx,1} = I_idx; pseudi_test3{test3_idx,1} = pseudoi; if Fig.pmu set(hdl_pmu,'String',int2str(test_len-1)); set(hdl_nob,'String',int2str(Bus.n-length(nodi_ord))); drawnow end min_pmu = min(min_pmu,test_len-1); end endendif test3_idx > 0 & (test_len-length(pmu_test3)) < min_pmu pmu_test2(sel_pmu) = []; pmu_status(sel_pmu) = []; pmu_test2 = [pmu_test3; pmu_test2]; I_idx_test = [I_idx_test3; I_idx_test]; pseudi_test = [pseudi_test3; pseudi_test]; pmu_status = [zeros(length(pmu_test3),1); pmu_status]; if Fig.pmu set(hdl_pmu,'String',int2str(test_len-1)); drawnow endelseif test3_idx > 0 & (test_len-length(pmu_test3)) == min_pmu pmu_test_new = pmu_test; pmu_test_new(idx4) = []; if Fig.pmu set(hdl_pmu,'String',int2str(test_len-length(pmu_test3))); drawnow end linee = [Line.fr, Line.to]; I_idx = []; nodi = []; pseudoi = 0; for ijk = 1:length(pmu_test_new) i_idx = fm_iidx(pmu_test_new(ijk),linee); I_idx = [I_idx; i_idx]; nodi_oss = [i_idx(:,4);pmu_test_new(ijk)]; nodi = [nodi; nodi_oss]; if Fig.pmu set(hdl_nob,'String',int2str(length(nodi))); drawnow end end linee(I_idx(:,2),[1 2]) = zeros(length(I_idx(:,1)),2); % determinazione delle pseudo-correnti determinate con % la legge di Kirchhoff per le correnti % ed eliminazione dei nodi di cui si può determinare la % tensione con la legge di Ohm % determinazione delle pseudo-correnti nelle linee ai cui % estremi sono note le tensioni for ii = 1:length(nodi) I_idx_from = find(linee(:,1) == nodi(ii)); if ~isempty(I_idx_from) I_idx_to = []; for jj = 1:length(I_idx_from) if ~isempty(find(nodi == linee(I_idx_from(jj),2))) I_idx_to = [I_idx_to; I_idx_from(jj)]; end end if ~isempty(I_idx_to); n_current = length(I_idx_to); api = [[1:n_current]', I_idx_to]; bpi = linee(I_idx_to,[1 2]); cpi = ones(length(I_idx_to),1); pi_idx = [api, bpi, cpi]; linee(pi_idx(:,2),[1 2]) = zeros(length(pi_idx(:,1)),2); I_idx = [I_idx; pi_idx]; pseudoi = pseudoi + length(pi_idx(:,1)); end end end count = 1; while count < length(nodi) if zeroinj(Bus.int(nodi(count))) == 0 I_idx_from = find(linee(:,1) == nodi(count)); I_idx_to = find(linee(:,2) == nodi(count)); ncfrom = length(I_idx_from); ncto = length(I_idx_to); nc = ncfrom + ncto; if nc == 1 if ncfrom == 1 ki_idx = [1, I_idx_from, linee(I_idx_from,[1 2]), 1]; else ki_idx = [1, I_idx_to, linee(I_idx_to,[2 1]), -1]; end linee(ki_idx(2),[1 2]) = zeros(length(ki_idx(1)),2); I_idx = [I_idx; ki_idx]; pseudoi = pseudoi + length(ki_idx(1)); nodi_oss = [nodi_oss; ki_idx(4)]; nodi = [ki_idx(4); nodi]; if Fig.pmu set(hdl_nob,'String',int2str(length(nodi))); drawnow end % dopo l'aggiunta di un nuovo nodo misurato bisogna % ricontrollare tutti i nodi count = 1; % ricerca di pseudo-correnti che possono essere misurate % con il nodo aggiunto for ii = 1:length(nodi) I_idx_from = find(linee(:,1) == nodi(ii)); if ~isempty(I_idx_from) I_idx_to = []; for jj = 1:length(I_idx_from) if ~isempty(find(nodi == linee(I_idx_from(jj),2))) I_idx_to = [I_idx_to; I_idx_from(jj)]; end end if ~isempty(I_idx_to); n_current = length(I_idx_to); api = [[1:n_current]', I_idx_to]; bpi = linee(I_idx_to,[1 2]); cpi = ones(length(I_idx_to),1); pi_idx = [api, bpi, cpi]; linee(pi_idx(:,2),[1 2]) = zeros(length(pi_idx(:,1)),2); I_idx = [I_idx; pi_idx]; pseudoi = pseudoi + length(pi_idx(:,1)); end end end else count = count + 1; end else count = count + 1; end end nodi_ord = sort(nodi); num_nodi = length(nodi); nodi_el = []; for jjj = 1:num_nodi nodi_el = [nodi_el; jjj+find(nodi_ord([jjj+1:num_nodi]) == ... nodi_ord(jjj))]; end nodi_ord(nodi_el) = []; if Fig.pmu set(hdl_nob,'String',int2str(Bus.n-length(nodi_ord))); drawnow end if length(nodi_ord) == Bus.n pmu_test2(sel_pmu) = []; pmu_status(sel_pmu) = []; a = cell(1,1); a{1,1} = pmu_test_new; pmu_test2 = [a; pmu_test2]; a{1,1} = I_idx; I_idx_test = [a; I_idx_test]; a{1,1} = pseudoi; pseudi_test = [a; pseudi_test]; pmu_status = [1; pmu_status]; else pmu_test2(sel_pmu) = []; I_idx_test(sel_pmu) = []; pseudi_test(sel_pmu) = []; pmu_status(sel_pmu) = []; endelse if length(pmu_test2{sel_pmu}) > min_pmu pmu_test2(sel_pmu) = []; I_idx_test(sel_pmu) = []; pseudi_test(sel_pmu) = []; pmu_status(sel_pmu) = []; else pmu_status(sel_pmu) = 1; endend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -