📄 jacobfac.c
字号:
/* FACTS mismatch vectors and Jacobian */#include "jacob.h"#ifdef ANSIPROTOvoid SVCFunJac(SparseMatrix *Mptr,BOOLEAN flagF,BOOLEAN flagJ);void TCSCFunJac(SparseMatrix *Mptr,BOOLEAN flagF,BOOLEAN flagJ);void STATCOMFunJac(SparseMatrix *Mptr,BOOLEAN flagF,BOOLEAN flagJ);#elsevoid SVCFunJac();void TCSCFunJac();void STATCOMFunJac();#endif/* Construct the SVC part of the mismatch vector and Jacobian */#ifdef ANSIPROTOvoid SVCFunJac(SparseMatrix *Mptr,BOOLEAN flagF,BOOLEAN flagJ)#elsevoid SVCFunJac(Mptr,flagF,flagJ)BOOLEAN flagF,flagJ;SparseMatrix *Mptr;#endif{ INDEX i,k,l; SVCbusData *SVCptr; VALUETYPE Vref,Vk,Vl,Xl,Xc,Bv,Xsl,Qsvc,alpha; BOOLEAN flag1; i=NacVar+11*Ndc/2; for(SVCptr=dataPtr->SVCbus;SVCptr!=NULL;SVCptr=SVCptr->Next){ k=ACvar[SVCptr->From->N]; Vk=SVCptr->From->V; l=ACvar[SVCptr->Ctrl->N]; Vl=SVCptr->Ctrl->V; if (!strcmp(SVCptr->Cont,"AL")) flag1=FALSE; else flag1=TRUE; if(!flag1)Vref=SVCptr->Vref; else Vref=SVCptr->Vvar; Xl=SVCptr->Xl; Xc=SVCptr->Xc; Xsl=SVCptr->slope; Bv=SVCptr->Bv; Qsvc=SVCptr->Qsvc; alpha=SVCptr->alpha_svc; if(flagF){ dF[i+1]=Vl-Vref-Xsl*Vk*(Bv-1.0/Xc); dF[i+2]=Vk*Vk*(Bv-1.0/Xc)+Qsvc; dF[i+3]=-PI*Xl*Bv+2.0*(PI-alpha)+sin(2.0*alpha); dF[k+1]=dF[k+1]+Qsvc; } if(flagJ){ JacElement(Mptr,k+1,i+1,1.0); JacElement(Mptr,i+1,k+1,-Xsl*(Bv-1.0/Xc)); JacElement(Mptr,i+1,l+1,1.0); JacElement(Mptr,i+1,i+2,-Xsl*Vk); JacElement(Mptr,i+2,k+1,-2.0*Vk*(1.0/Xc-Bv)); JacElement(Mptr,i+2,i+1,1.0); JacElement(Mptr,i+2,i+2,Vk*Vk); JacElement(Mptr,i+3,i+2,-PI*Xl); if(!flag1){ JacElement(Mptr,i+1,i+3,0.0); JacElement(Mptr,i+3,i+3,-2.0*(1.0-cos(2.0*alpha)));} else { JacElement(Mptr,i+1,i+3,-1.0); JacElement(Mptr,i+3,i+3,0.0);} if(flagH){ if(strpbrk(SVCptr->From->Type,"L")){ JacElement(Mptr,i+1,Mptr->n1,-Xsl*(Bv-1.0/Xc)); JacElement(Mptr,i+2,Mptr->n1,2.0*Vk*(Bv-1.0/Xc)); } if(strpbrk(SVCptr->Ctrl->Type,"L")){ JacElement(Mptr,i+1,Mptr->n1,1.0); } } } i=i+3; }}/* Construct the TCSC part of the mismatch vector and Jacobian */#ifdef ANSIPROTOvoid TCSCFunJac(SparseMatrix *Mptr,BOOLEAN flagF,BOOLEAN flagJ)#elsevoid TCSCFunJac(Mptr,flagF,flagJ)BOOLEAN flagF,flagJ;SparseMatrix *Mptr;#endif{ INDEX i,k,kp,m,mp; TCSCbusData *TCSCptr; VALUETYPE Vk,Vm,thk,thm,Xl,Xc,Ptcsc,Qtcsck,Qtcscm,Be,alpha,Itcsc,delta_t; VALUETYPE Bset,Pset,Iset,delta_set,Ctrl,Kf; VALUETYPE s1,s2,s3,s4,s5,s6,s7,s8; BOOLEAN dVk=FALSE,dVm=FALSE; i=NacVar+11*Ndc/2+3*Nsvc; for(TCSCptr=dataPtr->TCSCbus;TCSCptr!=NULL;TCSCptr=TCSCptr->Next){ k=ACvar[TCSCptr->From->N]; kp=k+1; Vk=TCSCptr->From->V; thk=TCSCptr->From->Ang; m=ACvar[TCSCptr->To->N]; mp=m+1; Vm=TCSCptr->To->V; thm=TCSCptr->To->Ang; Xc=TCSCptr->Xc; Xl=TCSCptr->Xl; Kf=sqrt(Xc/Xl); Ctrl=TCSCptr->Control; if(!strcmp(TCSCptr->Cont,"X")) Bset=TCSCptr->Bset; else if(!strcmp(TCSCptr->Cont,"P")) Pset=Ctrl; else if(!strcmp(TCSCptr->Cont,"I")) Iset=Ctrl; else if(!strcmp(TCSCptr->Cont,"D")) delta_set=Ctrl; Ptcsc=TCSCptr->Ptcsc; Qtcsck=TCSCptr->Qtcsck; Qtcscm=TCSCptr->Qtcscm; Be=TCSCptr->Be; alpha=TCSCptr->alpha_tcsc; Itcsc=TCSCptr->Itcsc; delta_t=TCSCptr->delta_t; if (TCSCptr->From->Cont!=NULL) dVk=TRUE; else dVk=FALSE; if (TCSCptr->To->Cont!=NULL) dVm=TRUE; else dVm=FALSE; if(flagF){ dF[i+1]=-Vk*Vm*Be*sin(thk-thm)-Ptcsc; dF[i+2]=-Vk*Vk*Be+Vk*Vm*Be*cos(thk-thm)-Qtcsck; dF[i+3]=-Vm*Vm*Be+Vk*Vm*Be*cos(thk-thm)-Qtcscm; /* dF[i+4]=1.0/Xc-(2.0*(PI-alpha)+sin(2.0*alpha))/(PI*Xl)-Be; */ dF[i+4]= PI*cos(Kf*(-PI+alpha))*(pow(Kf,4.0)-2.0*Kf*Kf+1.0)/Xc/(-PI*pow(Kf,4.0)* cos(Kf*(-PI+alpha))+PI*cos(Kf*(-PI+alpha))+2.0*pow(Kf,4.0)*alpha* cos(Kf*(-PI+alpha))-2.0*alpha*Kf*Kf*cos(Kf*(-PI+alpha))+pow(Kf,4.0)* sin(-2.0*PI+2.0*alpha)*cos(Kf*(-PI+alpha))-sin(-2.0*PI+2.0*alpha)* Kf*Kf*cos(Kf*(-PI+alpha))-4.0*Kf*Kf*Kf*pow(cos(-PI+alpha),2.0)* sin(Kf*(-PI+alpha))+4.0*Kf*Kf*cos(-PI+alpha)*sin(-PI+alpha)* cos(Kf*(-PI+alpha)))-Be; if(Itcsc >= 0)dF[i+5]=sqrt(Ptcsc*Ptcsc+Qtcsck*Qtcsck)-Itcsc*Vk; else dF[i+5]=-sqrt(Ptcsc*Ptcsc+Qtcsck*Qtcsck)-Itcsc*Vk; dF[i+6]=thk-thm-delta_t; if(!strcmp(TCSCptr->Cont,"X"))dF[i+7]=Bset-Be; else if(!strcmp(TCSCptr->Cont,"P"))dF[i+7]=Pset-Ptcsc; else if(!strcmp(TCSCptr->Cont,"I"))dF[i+7]=Iset-Itcsc; else if(!strcmp(TCSCptr->Cont,"D"))dF[i+7]=delta_set-delta_t; dF[k]=dF[k]-Ptcsc; dF[k+1]=dF[k+1]-Qtcsck; dF[m]=dF[m]+Ptcsc; dF[m+1]=dF[m+1]-Qtcscm; } if(flagJ){ JacElement(Mptr,k,i+1,-1.0); JacElement(Mptr,k+1,i+2,-1.0); JacElement(Mptr,m,i+1,1.0); JacElement(Mptr,m+1,i+3,-1.0); if (!strpbrk(TCSCptr->From->Type,"S")) JacElement(Mptr,i+1,k,-Vk*Vm*Be*cos(thk-thm)); if(dVk){ JacElement(Mptr,i+1,kp,-Vm*Be*sin(thk-thm)); JacElement(Mptr,i+2,kp,-2.0*Vk*Be+Vm*Be*cos(thk-thm)); JacElement(Mptr,i+3,kp,Vm*Be*cos(thk-thm)); JacElement(Mptr,i+5,kp,-Itcsc); }else{ JacElement(Mptr,i+1,kp,0.0); JacElement(Mptr,i+2,kp,0.0); JacElement(Mptr,i+3,kp,0.0); JacElement(Mptr,i+5,kp,0.0); } if (!strpbrk(TCSCptr->To->Type,"S")) JacElement(Mptr,i+1,m,Vk*Vm*Be*cos(thk-thm)); if(dVm){ JacElement(Mptr,i+1,mp,-Vk*Be*sin(thk-thm)); JacElement(Mptr,i+2,mp,Vk*Be*cos(thk-thm)); JacElement(Mptr,i+3,mp,-2*Vm*Be+Vk*Be*cos(thk-thm)); }else{ JacElement(Mptr,i+1,mp,0.0); JacElement(Mptr,i+2,mp,0.0); JacElement(Mptr,i+3,mp,0.0); } JacElement(Mptr,i+1,i+1,-1.0); JacElement(Mptr,i+1,i+4,-Vk*Vm*sin(thk-thm)); if (!strpbrk(TCSCptr->From->Type,"S")) JacElement(Mptr,i+2,k,-Vk*Vm*Be*sin(thk-thm)); if (!strpbrk(TCSCptr->To->Type,"S")) JacElement(Mptr,i+2,m,Vk*Vm*Be*sin(thk-thm)); JacElement(Mptr,i+2,i+2,-1.0); JacElement(Mptr,i+2,i+4,-Vk*Vk+Vk*Vm*cos(thk-thm)); if (!strpbrk(TCSCptr->From->Type,"S")) JacElement(Mptr,i+3,k,-Vk*Vm*Be*sin(thk-thm)); if (!strpbrk(TCSCptr->To->Type,"S")) JacElement(Mptr,i+3,m,Vk*Vm*Be*sin(thk-thm)); JacElement(Mptr,i+3,i+3,-1.0); JacElement(Mptr,i+3,i+4,-Vm*Vm+Vk*Vm*cos(thk-thm)); JacElement(Mptr,i+4,i+4,-1.0); /* JacElement(Mptr,i+4,i+5,(2.0-2.0*cos(2*alpha))/(PI*Xl)); */ s1 = -PI*sin(Kf*(-PI+alpha))*Kf*(pow(Kf,4.0)-2.0*Kf*Kf+1.0)/Xc/(-PI* pow(Kf,4.0)*cos(Kf*(-PI+alpha))+PI*cos(Kf*(-PI+alpha))+2.0*pow(Kf,4.0)* alpha*cos(Kf*(-PI+alpha))-2.0*alpha*Kf*Kf*cos(Kf*(-PI+alpha))+ pow(Kf,4.0)*sin(-2.0*PI+2.0*alpha)*cos(Kf*(-PI+alpha))- sin(-2.0*PI+2.0*alpha)*Kf*Kf*cos(Kf*(-PI+alpha))-4.0*Kf*Kf*Kf* pow(cos(-PI+alpha),2.0)*sin(Kf*(-PI+alpha))+4.0*Kf*Kf*cos(-PI+alpha)* sin(-PI+alpha)*cos(Kf*(-PI+alpha))); s3 = -PI*cos(Kf*(-PI+alpha)); s5 = (pow(Kf,4.0)-2.0*Kf*Kf+1.0)/Xc; s7 = 1/(pow(-PI*pow(Kf,4.0)*cos(Kf*(-PI+alpha))+PI*cos(Kf*(-PI+alpha)) +2.0*pow(Kf,4.0)*alpha*cos(Kf*(-PI+alpha))-2.0*alpha*Kf*Kf* cos(Kf*(-PI+alpha))+pow(Kf,4.0)*sin(-2.0*PI+2.0*alpha)* cos(Kf*(-PI+alpha))-sin(-2.0*PI+2.0*alpha)*Kf*Kf*cos(Kf*(-PI+alpha)) -4.0*Kf*Kf*Kf*pow(cos(-PI+alpha),2.0)*sin(Kf*(-PI+alpha)) +4.0*Kf*Kf*cos(-PI+alpha)*sin(-PI+alpha)*cos(Kf*(-PI+alpha)),2.0)); s8 = PI*pow(Kf,5.0)*sin(Kf*(-PI+alpha))-PI*sin(Kf*(-PI+alpha))*Kf +2.0*pow(Kf,4.0)*cos(Kf*(-PI+alpha))-2.0*pow(Kf,5.0)*alpha* sin(Kf*(-PI+alpha))-2.0*Kf*Kf*cos(Kf*(-PI+alpha))+2.0*alpha*Kf*Kf*Kf* sin(Kf*(-PI+alpha))+2.0*pow(Kf,4.0)*cos(-2.0*PI+2.0*alpha)* cos(Kf*(-PI+alpha))-pow(Kf,5.0)*sin(-2.0*PI+2.0*alpha)* sin(Kf*(-PI+alpha))-2.0*cos(-2.0*PI+2.0*alpha)*Kf*Kf* cos(Kf*(-PI+alpha))+sin(-2.0*PI+2.0*alpha)*Kf*Kf*Kf* sin(Kf*(-PI+alpha))+4.0*Kf*Kf*Kf*cos(-PI+alpha)*sin(Kf*(-PI+alpha))* sin(-PI+alpha)-4.0*pow(Kf,4.0)*pow(cos(-PI+alpha),2.0)* cos(Kf*(-PI+alpha))-4.0*Kf*Kf*pow(sin(-PI+alpha),2.0)* cos(Kf*(-PI+alpha))+4.0*Kf*Kf*pow(cos(-PI+alpha),2.0)* cos(Kf*(-PI+alpha)); s6 = s7*s8; s4 = s5*s6; s2 = s3*s4; JacElement(Mptr,i+4,i+5,s1+s2); if(Itcsc >= 0){ if (Ptcsc==0)JacElement(Mptr,i+5,i+1,0.); else JacElement(Mptr,i+5,i+1,Ptcsc/(sqrt(Ptcsc*Ptcsc+Qtcsck*Qtcsck))); if (Qtcsck==0)JacElement(Mptr,i+5,i+2,0.); else JacElement(Mptr,i+5,i+2,Qtcsck/(sqrt(Ptcsc*Ptcsc+Qtcsck*Qtcsck)));} else { if (Ptcsc==0)JacElement(Mptr,i+5,i+1,0.); else JacElement(Mptr,i+5,i+1,-Ptcsc/(sqrt(Ptcsc*Ptcsc+Qtcsck*Qtcsck))); if (Qtcsck==0)JacElement(Mptr,i+5,i+2,0.); else JacElement(Mptr,i+5,i+2,-Qtcsck/(sqrt(Ptcsc*Ptcsc+Qtcsck*Qtcsck)));} JacElement(Mptr,i+5,i+6,-Vk); if (!strpbrk(TCSCptr->From->Type,"S")) JacElement(Mptr,i+6,k,1.0); if (!strpbrk(TCSCptr->To->Type,"S")) JacElement(Mptr,i+6,m,-1.0); JacElement(Mptr,i+6,i+7,-1.0); if(!strcmp(TCSCptr->Cont,"X")) JacElement(Mptr,i+7,i+4,-1.0); else { JacElement(Mptr,i+7,i+4,0.0); if (!strcmp(TCSCptr->Cont,"P")) JacElement(Mptr,i+7,i+1,-1.0); else if (!strcmp(TCSCptr->Cont,"I")) JacElement(Mptr,i+7,i+6,-1.0); else if (!strcmp(TCSCptr->Cont,"D")) JacElement(Mptr,i+7,i+7,-1.0); } if(flagH){ if(strpbrk(TCSCptr->From->Type,"L")){ JacElement(Mptr,i+1,Mptr->n1,-Vm*Be*sin(thk-thm)); JacElement(Mptr,i+2,Mptr->n1,-2.0*Vk*Be+Vm*Be*cos(thk-thm)); JacElement(Mptr,i+3,Mptr->n1,Vm*Be*cos(thk-thm)); JacElement(Mptr,i+5,Mptr->n1,-Itcsc); } else if(strpbrk(TCSCptr->To->Type,"L")){ JacElement(Mptr,i+1,Mptr->n1,-Vk*Be*sin(thk-thm)); JacElement(Mptr,i+2,Mptr->n1,Vk*Be*cos(thk-thm)); JacElement(Mptr,i+3,Mptr->n1,-2.0*Vm*Be+Vk*Be*cos(thk-thm)); } } } i=i+7; }}/* Construct the STATCOM part of the mismatch vector and Jacobian */#ifdef ANSIPROTOvoid STATCOMFunJac(SparseMatrix *Mptr,BOOLEAN flagF,BOOLEAN flagJ)#elsevoid STATCOMFunJac(Mptr,flagF,flagJ)BOOLEAN flagF,flagJ;SparseMatrix *Mptr;#endif{ INDEX i,k,l; STATCOMbusData *STATCOMptr; VALUETYPE Vk,delta,Vl,R,G,B,Gc,Xsl,Vref,P,Q,I,theta,Vdc,alpha,K,Cref; BOOLEAN flagLimits,flagPWM; i=NacVar+11*Ndc/2+3*Nsvc+NtcscVar; for(STATCOMptr=dataPtr->STATCOMbus;STATCOMptr!=NULL;STATCOMptr=STATCOMptr->Next){ k=ACvar[STATCOMptr->From->N]; Vk=STATCOMptr->From->V; delta=STATCOMptr->From->Ang; l=ACvar[STATCOMptr->Ctrl->N]; Vl=STATCOMptr->Ctrl->V; if (!strcmp(STATCOMptr->Cont,"PW") || !strcmp(STATCOMptr->Cont,"AL")) flagLimits=FALSE; else flagLimits=TRUE; if(!flagLimits) Vref=STATCOMptr->Vref; else Vref=STATCOMptr->Vvar; if (!strcmp(STATCOMptr->Cont1,"PW")) flagPWM=TRUE; else flagPWM=FALSE; R=STATCOMptr->R; G=STATCOMptr->G; B=STATCOMptr->B; Gc=STATCOMptr->Gc; Xsl=STATCOMptr->slope; I=STATCOMptr->I; theta=STATCOMptr->theta; Vdc=STATCOMptr->Vdc; K=STATCOMptr->k; alpha=STATCOMptr->alpha; P=STATCOMptr->P; Q=STATCOMptr->Q; Cref=STATCOMptr->Contref; if(flagF){ if (Q>0) dF[i+1]=Vl-Vref-Xsl*I; else dF[i+1]=Vl-Vref+Xsl*I; if (flagPWM) dF[i+2]=Vdc-Cref; else dF[i+2]=K-Cref; dF[i+3]=P-Gc*Vdc*Vdc-R*I*I; dF[i+4]=P-Vk*I*cos(delta-theta); dF[i+5]=Q-Vk*I*sin(delta-theta); dF[i+6]=P-G*Vk*Vk+G*K*Vdc*Vk*cos(delta-alpha)+B*K*Vdc*Vk*sin(delta-alpha); dF[i+7]=Q+B*Vk*Vk-B*K*Vdc*Vk*cos(delta-alpha)+G*K*Vdc*Vk*sin(delta-alpha); dF[k]=dF[k]-P; dF[k+1]=dF[k+1]-Q; } if(flagJ){ if (!flagLimits) { if (Q>0) JacElement(Mptr,i+1,i+1,-Xsl); else JacElement(Mptr,i+1,i+1,+Xsl); } else JacElement(Mptr,i+1,i+1,-1.0); JacElement(Mptr,i+1,l+1,1.0); if (flagPWM) JacElement(Mptr,i+2,i+3,1.0); else JacElement(Mptr,i+2,i+4,1.0); if (!flagLimits) JacElement(Mptr,i+3,i+1,-2.0*R*I); else JacElement(Mptr,i+3,i+1,0.0); JacElement(Mptr,i+3,i+3,-2.0*Gc*Vdc); JacElement(Mptr,i+3,i+6,1.0); if (!flagLimits) JacElement(Mptr,i+4,i+1,-Vk*cos(delta-theta)); else JacElement(Mptr,i+4,i+1,0.0); JacElement(Mptr,i+4,i+2,-Vk*I*sin(delta-theta)); JacElement(Mptr,i+4,i+6,1.0); JacElement(Mptr,i+4,k+1,-I*cos(delta-theta)); if (!strpbrk(STATCOMptr->From->Type,"S")) JacElement(Mptr,i+4,k,Vk*I*sin(delta-theta)); if (!flagLimits) JacElement(Mptr,i+5,i+1,-Vk*sin(delta-theta)); else JacElement(Mptr,i+5,i+1,0.0); JacElement(Mptr,i+5,i+2,Vk*I*cos(delta-theta)); JacElement(Mptr,i+5,i+7,1.0); JacElement(Mptr,i+5,k+1,-I*sin(delta-theta)); if (!strpbrk(STATCOMptr->From->Type,"S")) JacElement(Mptr,i+5,k,-Vk*I*cos(delta-theta)); JacElement(Mptr,i+6,i+3,G*K*Vk*cos(delta-alpha)+B*K*Vk*sin(delta-alpha)); JacElement(Mptr,i+6,i+4,G*Vdc*Vk*cos(delta-alpha)+B*Vdc*Vk*sin(delta-alpha)); JacElement(Mptr,i+6,i+5,G*K*Vdc*Vk*sin(delta-alpha)-B*K*Vdc*Vk*cos(delta-alpha)); JacElement(Mptr,i+6,i+6,1.0); JacElement(Mptr,i+6,k+1,-2.0*G*Vk+G*K*Vdc*cos(delta-alpha)+B*K*Vdc*sin(delta-alpha)); if (!strpbrk(STATCOMptr->From->Type,"S")) JacElement(Mptr,i+6,k,-G*K*Vdc*Vk*sin(delta-alpha)+B*K*Vdc*Vk*cos(delta-alpha)); JacElement(Mptr,i+7,i+3,-B*K*Vk*cos(delta-alpha)+G*K*Vk*sin(delta-alpha)); JacElement(Mptr,i+7,i+4,-B*Vdc*Vk*cos(delta-alpha)+G*Vdc*Vk*sin(delta-alpha)); JacElement(Mptr,i+7,i+5,-B*K*Vdc*Vk*sin(delta-alpha)-G*K*Vdc*Vk*cos(delta-alpha)); JacElement(Mptr,i+7,i+7,1.0); JacElement(Mptr,i+7,k+1,2.0*B*Vk-B*K*Vdc*cos(delta-alpha)-G*K*Vdc*sin(delta-alpha)); if (!strpbrk(STATCOMptr->From->Type,"S")) JacElement(Mptr,i+7,k,B*K*Vdc*Vk*sin(delta-alpha)+G*K*Vdc*Vk*cos(delta-alpha)); JacElement(Mptr,k,i+6,-1.0); JacElement(Mptr,k+1,i+7,-1.0); if(flagH){ if(strpbrk(STATCOMptr->From->Type,"L")){ JacElement(Mptr,i+4,Mptr->n1,-I*cos(delta-theta)); JacElement(Mptr,i+5,Mptr->n1,-I*sin(delta-theta)); JacElement(Mptr,i+6,Mptr->n1,-2.0*G*Vk+G*K*Vdc*cos(delta-alpha)+B*K*Vdc*sin(delta-alpha)); JacElement(Mptr,i+7,Mptr->n1,2.0*B*Vk-B*K*Vdc*cos(delta-alpha)-G*K*Vdc*sin(delta-alpha)); } if(strpbrk(STATCOMptr->Ctrl->Type,"L")){ JacElement(Mptr,i+1,Mptr->n1,1.0); } } } i=i+7; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -