Программа определения места повреждения на воздушной линии электропередачи, страница 16

  if(mpb<=0) then

             write (Msg,'(a,i6,a)') &

      'Mатрицы Y многополюсника',NumMPDam,' в банке нет.'

            call AbortDlg(Msg)

    ier=1

    goto 99

  endif

По банковскому номеру определим число фаз в неповрежденном многопо­люснике

kfm=Coctym(mpb,3)

Выделяем память под матрицу узловых проводимостей неповрежденного многополюсника и под матрицу узловых проводимостей поврежденного много­полюсника.         

  Allocate(YMPNonDamaged(kfm*kfm),YMPDamaged(kfm*kfm))

Выделяем память под расчетные  и замеренные токи.

  Allocate(IEtalon(kfm),I(kfm))

Замеренные токи будем читать из текстового файла Etalon.txt.

Открываем текстовый файл Etalon.txt и читаем из него замеренные токи

open(11,file='C:\Maska\Develop\Etalon.txt')

read(11,*) IEtalon

Читаем матрицу Y неповрежденного многополюсника из Y файла

  read (Yfile,rec=Coctym(mpb,2)) YMPNonDamaged

Для нахождения минимума целевой функции двух переменных обращаемся к встроенной фортрановской процедуре ВСРОL. Данная процедура минимизирует целевую функцию при заданной системе ограничений типа неравенств.

   Xguess = (0.5,  5.0) – Стартовые значения переменных.

   XLB    = (0.001, 0.01)  Их нижние границы

   XUB    = (0.999,  100)  Их верхние границы

 data  Xguess/0.5, 5.0/, XLB/0.001, 0.01/, XUB/0.999E0, 100.0E0/

   FTol = 1.0E-3 – Требуемая точность поиска.

   IBtype = 0 - границы устанавливаются вручную

   MAXFCN = 300  - количество итераций (оценок)

  FCN – целевая функция (формирование целевой функции приведено ниже) 

call BCPOL(FCN,N,Xguess,IBtype,XLB,XUB,FTol,MAXFCN,X,Fvalue)

Результатом процедуры BCPOL является:

Distance = X(1) - расстояние до точки КЗ

          R=X(2) - Сопротивление КЗ

Вывод полученных результатов в файл результатов расчёта. С новой строки отступаем 7 пробелов и выводим символьную строку "ОПРЕДЕЛЕНИЕ МЕСТА ПОВРЕЖДЕНИЯ", на следующей строке выводим символьную строку:

"   Поврежденный МП  Вид КЗ  Расстояние (о.е.)  Сопротивление (Ом) "

write (print,'(/7x,a/a)')  &

     'О П Р Е Д Е Л Е Н И Е   М Е С Т А   П О В Р Е Ж Д Е Н И Я', &

     '   Поврежденный МП Вид КЗ  Расстояние Сопротивление'

Выводим номер поврежденного многополюсника, вид короткого замыкания, рас­стояние до места повреждения (в о.е.), сопротивление короткого замыкания

write (print,'(7x,i6,8x,i2,6x,F4.3,7x,F6.3)') NumMPDam,kindKZ,Distance,R

Если память выделялась, освобождаем ее

99 if (Allocated(YMPNonDamaged)) Deallocate(YMPNonDamaged)

   if (Allocated(DiagZ))Deallocate(DiagZ)

   if (Allocated(Zn))   Deallocate(Zn)

   if (Allocated(Zv))   Deallocate(Zv)

   if (Allocated(NextZ))Deallocate(NextZ)

   if (Allocated(AnbZ)) Deallocate(AnbZ)

   if (Allocated(IbsZ)) Deallocate(IbsZ)

   end subroutine

end module 

2.3.3 Процедураформированияцелевойфункции FCN

subroutine FCN(N,X,F)

Целевая функция от вектора переменных: расстояния до места повреждения (RelDistan) и сопротивления короткого замыкания (R).

use OMPData

          real*4::  F – Целевая функция

integer*4:: N  -  количество переменных

          real*4::    X(N)  - массив значений переменных

real*4::RelDistan, R

          integer*2::ADDMPFORY,mpb

          RelDistan=X(1) - длина до места повреждения в о.е.

          R=X(2) - сопротивление КЗ

Формируем матрицу Y поврежденного многополюсника. Для этого обраща­емся к процедуре MPDamLine, описание которой приведено в п.2.2.

 call MPDamLine (YMPNonDamaged,RelDistan, R,kindKZ,NumMPDam, YMPDamaged)

После того как была сформирована матрица Y поврежденного многополюс­ника, необходимо сформировать новую матрицу Y сети. Матрицу Y сети не фор­мируем а просто обнуляем блок соответствующий матрице Y неповрежденного многополюсника и на его места записываем новый блок соответствующий мат­рице Y поврежденного многополюсника. Для этого обращаемся к функции AddMPforY  результатом, которой является новая матрица Y сети и код ошибки, ежели не удалось сформировать матрицу Y. Процедура AddMPforY приведена в приложении 1.