struct jdlb *insert1(struct jdlb *tp,struct jdlb *z) //节点导纳矩阵插入指针数据{
struct jdlb *p0,*p111,*p112;
double r,r1,x,x1;
kk=0;
p111=tp;
p0=z;
if(p0==null)
return(tp);
if(tp==null)
{ tp=p0;
p0->next=null;
return(tp);
}
if(p0->lnxt<p111->lnxt)
{ tp=p0;
p0->next=p111;
return(tp);
}
while((p0->lnxt>p111->lnxt)&&(p111->next!=null))
{ p112=p111;
p111=p111->next;
}
if(p0->lnxt==p111->lnxt) //两点间有多条线路或变压器
{ r=p111->fu*cos(p111->jd);
x=p111->fu*sin(p111->jd);
r1=p0->fu*cos(p0->jd);
x1=p0->fu*sin(p0->jd);
r=r+r1;
x=x+x1;
x1=sqrt(r*r+x*x);
p111->fu=x1;
p111->jd=atan2(x,r);
kk=1;
return(tp);
}
if((p111->next==null)&&(p0->lnxt>p111->lnxt))
{ p111->next=p0;
p0->next=null;
}
else
{ p112->next=p0;
}
return(tp);
}
//线路部分形成节点导纳矩阵
p1=(struct jdlb *)malloc(len);
p2=(struct jdlb *)malloc(len);
p3=headlij; //线路部分
while(p3!=null) //形成节点导纳矩阵,可为双边的{ r=p3->fu;
x=p3->jd;
bb=p3->bb;
i=p3->i;
j=p3->j;
gij=r/(r*r+x*x);
bij=-x/(r*r+x*x);
r=-gij;
x=-bij;
tmp=sqrt(r*r+x*x);
if(tmp!=0)
{ p1->irow=i;
p1->lnxt=j;
p1->fu=tmp;
p1->jd=atan2(x,r);
a[i]=insert1(a[i],p1);
if(kk==0)
p1=(struct jdlb *)malloc(len);
p2->irow=j;
p2->lnxt=i;
p2->fu=tmp;
p2->jd=atan2(x,r);
a[j]=insert1(a[j],p2);
if(kk==0)
p2=(struct jdlb *)malloc(len);
}
p3->fu=tmp;
p3->jd=atan2(x,r);
p3->bb=bb;
g[i]=g[i]+gij;
b[i]=b[i]+bij+bb;
g[j]=g[j]+gij;
b[j]=b[j]+bij+bb;
}
k=1;
p4=headbyq;
while(p4!=null) //变压器部分
{ i=p4->i;
j=p4->j;
r=p4->r;
x=p4->x;
k0=p4->kk;
gij=r/(r*r+x*x);
bij=-x/(r*r+x*x);
k0=1/k0; //在计变压器变比时用1/k0来做变量,既用倒数来做变量r=-gij*k0;
x=-bij*k0;
tmp=sqrt(r*r+x*x);
if(tmp!=0)
{ p1->irow=i;
p1->lnxt=j;
p1->fu=tmp;
p1->jd=atan2(x,r);
a[i]=insert1(a[i],p1);
if(kk==0)
p1=(struct jdlb *)malloc(len);
p2->irow=j;
p2->lnxt=i;
p2->fu=tmp;
p2->jd=atan2(x,r);
a[j]=insert1(a[j],p2);
if(kk==0)
p2=(struct jdlb *)malloc(len);
}
g[i]=g[i]+gij*k0*k0;
b[i]=b[i]+bij*k0*k0;
g[j]=g[j]+gij;
b[j]=b[j]+bij;
p4=p4->next;
}
free(p1);
free(p2);
p5=headjdzl;
while(p5!=null) //接地支路部分
{ i=p5->i;
r=p5->g;
x=p5->bb;
g[i]=g[i]+r;
b[i]=b[i]+x;
p5=p5->next;
}
p6=headglfh;
while(p6!=null) //功率负荷部分
{ i=p6->i;
r=p6->pg;
bb=p6->pd;
x=p6->qg;
k0=p6->qd;
p[i]=r-bb;
q[i]=x-k0;
ppp[i]=bb;
qqq[i]=k0;
p6=p6->next;
}
p9=headphd;
while(p9!=null)
{ for(i=1;i<=mm;i++)
{ if(i==p9->phd)
{ p9->p=ppp[i];
p9->q=qqq[i];
}
}
p9=p9->next;
}
j=1;
p8=headwgxz;
while(p8!=null) //和控制点无关
{ i=p8->i;
gq[j]=i; //记录约束节点无功号
gmin[j]=p8->qmin;
gmax[j]=p8->qmax;
gqbz[j]=0; //=0表示PV节点,=1表示由PV节点转成了PQ节点qd[j]=qqq[i]; //负荷无功
j=j+1;
p8=p8->next;
}
rq=j-1; //无功约束的个数
for(i=1;i<=mm;i++) //节点导纳矩阵对角线上的元素{ r=sqrt(g[i]*g[i]+b[i]*b[i]);
b[i]=atan2(b[i],g[i]);
g[i]=r;
}
j=0; //用于判断是否有孤点
for(i=1;i<=mm;i++)
{ if(g[i]==0)
j=j+1;
}
if(j>0)
return 1;
a[mm+1]=null;
p1=a[1];
i=1; //将节点导纳矩阵联起来
while(i<=mm)
{ j=0;
while(p1->next!=null)
{ j=j+1;
p1=p1->next;
}
i=i+1;
p1->next=a[i];
}。