⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm_pmutry.m

📁 基于PSAT 软件的多目标最优潮流计算用于中小型电力系统的分析和管理
💻 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:    fmilano@thunderbox.uwaterloo.ca%Web-site:  http://thunderbox.uwaterloo.ca/~fmilano%% Copyright (C) 2002-2006 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.con(:,[1 2]);    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.con(:,[1 2]);  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 + -