if (AddMPforY(NumMPDam, -YMPNonDamaged)/=0) then; end if
if (AddMPforY(NumMPDam, YMPDamaged)==0) then; end if
Рассчитываем узловые напряжения при заданных узловых токах. Для чего обращаемся к процедуре UfromYandI, описание которой приведено ниже.
call UfromYandI
Находим токи поврежденного многополюсника для этого обращаемся к процедуре FindI.
call FindI(NumMPDam,mpb,YMPDamaged,I)
Формируем целевую функцию, для этого находим разность токов рассчитанных и замеренных и затем умножаем ее на сопряженную разность токов
I=I-IEtalon
F = Sum(Conjg(I)*I) Целевая функция.
return
end subroutine
Процедура расчёта узловых напряжений при заданных узловых токах
subroutine UfromYandI
Для расчета узловых напряжений используем следующий алгоритм:
- копируем матрицу Y сети в матрицу Z, то есть Z=Y, для этого воспользуемся процедурой CopyY.
call CopyY (DiagZ,Zn,Zv,AnbZ,IbsZ,NextZ,AnsZ,kIbsZ)
- затем обратим матрицу Z (то есть Y) с помощью процедуры DfakBU. Результатом данной процедуры будет матрицы Z сети и код ошибки, ежели не удалось обратить матрицу Z (то есть Y).
call DfakBU (DiagZ,Zn,Zv,AnbZ,IbsZ,NextZ,AnsZ,AnbD,ier) - Z^-1
if (ier/=0) then
if (ier<0) then
call AbortDlg('Не удалось обратить матрицу Y сети:')
else
write (Msg,'(a,i6,a)') &
Uzel(ier),' оказался вырожденным.'
call AbortDlg(Msg)
end if
goto 99
end if
- так как процедура SetEuz0 заслала узловые токи в Euz, то узловые напряжения определяются по формуле Euz=Z*Euz. Для вычисления узловых напряжений воспользуемся процедурой UBFMS.
call UBFMS (kuz,DiagZ, Zn,Zv,AnbZ,IbsZ,NextZ,AnbD,AnsZ,Kfuz, EUz, Anb,1_2)
99 end subroutine
Процедура определения токов по фазам поврежденного многополюсника
subroutine FindI(NumMPDam,mpb,Y,Im)
Входными параметрами процедуры FindI являются: схемный номер поврежденного многополюсника NumMPDam, банковский номер поврежденного многополюсника mpb, матрица проводимостей поврежденного многополюсника Y. Выходным парметром является вектор токов поврежденного многополюсника.
integer*2::kf,kfm,kfmp,Mask,mp,mpb,p,Pack,NumMPDam,Kfp(npmp)
complex:: U(nphmp),I(nphmp),Im(nphmp),Y(neymp)
Automatic U,I,Kfp
Определяем внутренний номер многополюсника mp и формируем вектор полюсных напряжений U для чего обращаемся к процедуре UMP1
call UMP1(NumMPDam,U,Kfp,kfmp,2,mp)
Определяем токи поврежденного многополюсника по следующей формуле I= Y * U где Y – матрица узловых проводимостей данного многополюсника, U – вектор полюсных напряжений. Для этого обращаемся к процедуре CoMPRd.
call CoMPRd(Y,U,I,kfmp,kfmp,1) !
Определим токи многополюсника с учетом разъемов.
Определяем внутренний Pack и пользовательский uPack номера пакета масок для поврежденного многополюсника.
Pack=CoctYm(mpb,4)
kf=1 - счетчик фаз многополюсника
do p=1,Cxema.Kpol(mp) - цикл по полюсам
if (Pack/=0) then - маскировка токов полюса
Mask=PlugPack(CocPack(Pack,2)-1+p)
Маскируем ток I(kf) с помощью процедуры MaskV
call MaskV (Mask,I(kf),Kfp(p),Im,kfm)
else - маскировка токов полюса не требуется
Mask=0
kfm=Kfp(p)
end if
if (Mask/=0) then
Mask=MatrD(Mask).numb - пользовательский номер маски
Если маскировка не требуется, то обращаемся к процедуре копирования CopyC комплексного вектора токов I размерности kfm в вектор Im: Im=I
Else
call CopyC(I(kf),Im,kfm)
end if
kf=kf+Kfp(p)
end do
еnd subroutine
end module
Итак, процедура ОМП в качестве компоненты комплекса «Маскарад», реализована.
Отладка и апробация программы ОМП в качестве компоненты комплекса «Маскарад» проводилась на следующем примере сети.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.