?? sparsem_anslysis.cpp
字號:
#include"stdafx.h"
#include"Analysis.h"
#include"Sparsem.h"
#include ".\analysis.h"
CSparseMatrix znmna_list; //聲明一個(gè)稀疏矩陣類對象
void Analysis::GetVBrNum()
{
int i,j,k,t,tt;
bNUM_vbNUM=new int[BranchNumber+1];
vBranchNumber=0;
for(i=1;i<BranchNumber+1;i++) bNUM_vbNUM[i]=0;//初始化
for(i=1;i<BranchNumber+1;i++)
{
t=Branch[i].type;
if(t==VS||t==VCVS||t==OPAMP)//必然的電壓定義之路
{
vBranchNumber++;
bNUM_vbNUM[i]=vBranchNumber;
}
else if(t==CCVS)
{
vBranchNumber++;//本身為電壓定義支路
bNUM_vbNUM[i]=vBranchNumber;
k=Branch[i].ncfrom;
tt=Branch[k].type;
if((tt==G||tt==R)&&Branch[k].ncfrom==0&&Branch[k].ncto==0)
{
vBranchNumber++;//控制之路也為電壓定義支路
bNUM_vbNUM[k]=vBranchNumber;
Branch[k].ncto=1;//做一個(gè)標(biāo)記
}
}
else if(t==CCCS){
k=Branch[i].ncfrom;
tt=Branch[k].type;
if((tt==G||tt==R)&&Branch[k].ncfrom==0&&Branch[k].ncto==0)
{
vBranchNumber++;//控制之路作為電壓定義支路
bNUM_vbNUM[k]=vBranchNumber;
Branch[k].ncto=1;
}
}
else if((t==G||t==R)&&Branch[i].ncfrom==1)
{ //指定為電壓定義支路
vBranchNumber++;
bNUM_vbNUM[i]=vBranchNumber;
}
}
vbNUM_bNUM=new int[vBranchNumber+1];
for (i=1;i<BranchNumber+1;i++)//電壓定義支路到支路的映射
{
j=bNUM_vbNUM[i];
vbNUM_bNUM[j]=i;
}
}
/********************************************************/
void Analysis::Fromlist_symlu()
{
znmna_list.newList(RANK,NONZERO,1);//秩為100,稀疏度為0.3 ,全主元排序
znmna_list.setRankList(NodeNumber+vBranchNumber);//置list的階數(shù)
int k,kk,nb,t,nf,nt,ncf,nct;
nb=NodeNumber+vBranchNumber+1;
for(int i=1;i<BranchNumber+1;i++)
{
br=Branch+i;
t=br->type;
nf=br->nfrom;
nt=br->nto;
ncf=br->ncfrom;
nct=br->ncto;
if(t==R)
{
if(ncf==0&&nct==0)//非電壓定義支路
{
if(nf==0) znmna_list.insertListEle(nt,nt);
else if(nt==0)znmna_list.insertListEle(nf,nf);
else{
znmna_list.insertListEle(nf,nf);
znmna_list.insertListEle(nt,nt);
znmna_list.insertListEle(nf,nt);
znmna_list.insertListEle(nt,nf);//對Y的貢獻(xiàn)
}
}
else
{
k=br->number;
k=bNUM_vbNUM[k];
k=k+NodeNumber;
znmna_list.insertListEle(nf,k);//
znmna_list.insertListEle(nt,k);//對B的貢獻(xiàn),即對節(jié)電電流的貢獻(xiàn)
znmna_list.insertListEle(k,nf);/////對C的貢獻(xiàn)
znmna_list.insertListEle(k,nt);///// 為支路特性
znmna_list.insertListEle(k,k);//////對D的貢獻(xiàn)
}
}
else if(t==G)
{
if(ncf==0&&nct==0)
{
if(nf==0) znmna_list.insertListEle(nt,nt);
else if(nt==0) znmna_list.insertListEle(nf,nf);
else{
znmna_list.insertListEle(nf,nf);
znmna_list.insertListEle(nt,nt);
znmna_list.insertListEle(nt,nf);///////對Y的貢獻(xiàn)
znmna_list.insertListEle(nf,nt);
}
}
else{
k=br->number;
k=bNUM_vbNUM[k];
k=k+NodeNumber;
znmna_list.insertListEle(nf,k);//
znmna_list.insertListEle(nt,k);//對B的貢獻(xiàn)
znmna_list.insertListEle(k,nf);///對C的貢獻(xiàn)
znmna_list.insertListEle(k,nt);///
znmna_list.insertListEle(k,k);//////對D的貢獻(xiàn)
}
}
else if(t==VCCS) //電壓控制電流源支路
{
znmna_list.insertListEle(nf,ncf);// 修正,書上有誤
znmna_list.insertListEle(nf,nct);
znmna_list.insertListEle(nt,ncf);
znmna_list.insertListEle(nt,nct);
}
else if(t==CCCS) //電流控制電流源支路
{
k=ncf;
k=bNUM_vbNUM[k];
k=k+NodeNumber;
znmna_list.insertListEle(nf,k);
znmna_list.insertListEle(nt,k);
}
else if(t==VCVS)
{
k=br->number;
k=bNUM_vbNUM[k];
k=k+NodeNumber;
znmna_list.insertListEle(nf,k);
znmna_list.insertListEle(nt,k);
znmna_list.insertListEle(k,nf);
znmna_list.insertListEle(k,nt);
znmna_list.insertListEle(k,ncf);
znmna_list.insertListEle(k,nct);
}
else if(t==CCVS)
{
kk=ncf; //修正
kk=bNUM_vbNUM[kk];
kk+=NodeNumber;
k=br->number;
k=bNUM_vbNUM[k];
k+=NodeNumber;
znmna_list.insertListEle(nf,k);
znmna_list.insertListEle(nt,k);
znmna_list.insertListEle(k,nf);
znmna_list.insertListEle(k,nt);
znmna_list.insertListEle(k,kk);
}
else if(t==OPAMP)
{
k=br->number;
k=bNUM_vbNUM[k];
k=k+NodeNumber;
znmna_list.insertListEle(nf,k);
znmna_list.insertListEle(nt,k);
znmna_list.insertListEle(k,ncf);
znmna_list.insertListEle(k,nct);
}
else if(t==VS)
{
k=br->number;
k=bNUM_vbNUM[k];
k=k+NodeNumber;
znmna_list.insertListEle(nf,k);
znmna_list.insertListEle(nt,k);
znmna_list.insertListEle(k,nf);
znmna_list.insertListEle(k,nt);
}
}
znmna_list.covListTab();
//先優(yōu)化排序,在轉(zhuǎn)化成三角形表,因?yàn)殡p鏈表是動態(tài)結(jié)構(gòu)
//方便生成,插入,刪除,和優(yōu)化排序,
//然后再轉(zhuǎn)化成三角形表進(jìn)行LU分解
}
void Analysis::InsertB_symFE()//插入右端向量,并進(jìn)行符號前消
{
for(int i=1;i<BranchNumber+1;i++)
{
BRANCH* br=Branch+i;
int t=br->type;
int nf=br->nfrom;
int nt=br->nto;
if(t==CS)
{
if(nf==0)znmna_list.insertB(nt);
else if(nt==0)znmna_list.insertB(nf);
else {
znmna_list.insertB(nf);
znmna_list.insertB(nt);
}
}
else if (t==VS){
int k=br->number;
k=bNUM_vbNUM[k];
k=k+NodeNumber;
znmna_list.insertB(k);
}
}
znmna_list.symFE();//先有端向量填元處理,再符號前消
}
void Analysis:: LoadAData_numLU()//裝配數(shù)值,進(jìn)行數(shù)值分解
{
int k,kk;
for(int i=1;i<BranchNumber+1;i++)
{
BRANCH* br=Branch+i;
char t=br->type;
int nf=br->nfrom;
int nt=br->nto;
int ncf=br->ncfrom;
int nct=br->ncto;
double val=br->value;
if(t==R)//電阻支路
{
if(ncf==0&&nct==0)//非電壓定義支路
{
val=1.0/val;//轉(zhuǎn)換成電導(dǎo)
if(nf==0)znmna_list.insertCoef(nt,nt,val);//始節(jié)點(diǎn)為0
else if(nt==0)znmna_list.insertCoef(nf,nf,val);//終節(jié)點(diǎn)為零
else
{
znmna_list.insertCoef(nf,nf,val);
znmna_list.insertCoef(nt,nt,val);
znmna_list.insertCoef(nf,nt,-val);
znmna_list.insertCoef(nt,nf,-val);
//對Y的導(dǎo)納貢獻(xiàn),通過節(jié)點(diǎn)-節(jié)點(diǎn)關(guān)系來寫
//其實(shí)此時(shí)看做電導(dǎo),形勢是一樣的·
}
}
else
{ //電壓定義電阻支路
k=br->number;
k=bNUM_vbNUM[k];//電壓定義支路號
k=k+NodeNumber;
znmna_list.insertCoef(nf,k,1);//修正 書上為val,對B貢獻(xiàn),即對該節(jié)點(diǎn)節(jié)點(diǎn)電流貢獻(xiàn)
znmna_list.insertCoef(nt,k,-1);//修正
znmna_list.insertCoef(k,nf,1.0); //
znmna_list.insertCoef(k,nt,-1.0);//這3項(xiàng)為支路特性 Unf-Unto-val*jk=0
znmna_list.insertCoef(k,k,-1.0*val);
}
}
else if(t==G)//電導(dǎo)支路
{
if(ncf==0&&nct==0)//非電壓定義支路
{
if(nf==0)znmna_list.insertCoef(nt,nt,val);
else if(nt==0)znmna_list.insertCoef(nf,nf,val);
else
{
znmna_list.insertCoef(nf,nf,val);
znmna_list.insertCoef(nt,nt,val);
znmna_list.insertCoef(nf,nt,-1.0*val);
znmna_list.insertCoef(nt,nf,-1.0*val);
}
}
else//電壓定義電導(dǎo)支路
{
k=br->number;
k=bNUM_vbNUM[k];//電壓定義支路號
k=k+NodeNumber;
znmna_list.insertCoef(nf,k,1.0);
znmna_list.insertCoef(nt,k,-1.0); //導(dǎo)納貢獻(xiàn)
znmna_list.insertCoef(k,nf,1.0); //對C貢獻(xiàn)
znmna_list.insertCoef(k,nt,-1.0);
znmna_list.insertCoef(k,k,-1.0/val); //對D貢獻(xiàn),注意此時(shí)支路特性為Unf-Unto-jk/G=0
}
}
else if(t==VCCS)//電壓控制電流源支路
{
znmna_list.insertCoef(nf,ncf,val); //對節(jié)點(diǎn)nf的電流貢獻(xiàn)用g(Uncf-Uncto) 表示
znmna_list.insertCoef(nf,nct,-1*val);
znmna_list.insertCoef(nt,ncf,-1*val);//對nto貢獻(xiàn),左邊為流出節(jié)點(diǎn)的電流
znmna_list.insertCoef(nt,nct,val);
}
else if(t==CCCS)//電流控制電流源支路
{
k=ncf;
k=bNUM_vbNUM[k];//控制支路號
k=k+NodeNumber;//電壓定義支路號
znmna_list.insertCoef(nf,k,val); ///對B的貢獻(xiàn),流出nf的電流a*jk
znmna_list.insertCoef(nt,k,-1.0*val); //流出nto的電流為-a*jk
}
else if(t==VCVS)//電壓控制電壓源支路
{
k=br->number;//支路號
k=bNUM_vbNUM[k];//電壓定義支路號
k=k+NodeNumber;
znmna_list.insertCoef(nf,k,1.0); //
znmna_list.insertCoef(nt,k,-1.0);// 對B的貢獻(xiàn),即電壓定義支路對節(jié)點(diǎn)的電流貢獻(xiàn)
znmna_list.insertCoef(k,nf,1.0);
znmna_list.insertCoef(k,nt,-1.0);
znmna_list.insertCoef(k,ncf,-1.0*val);
znmna_list.insertCoef(k,nct,val);// 以上四個(gè)為支路特性,即Unf-Unto-(Uncf-Uncto)=0
}
else if(t==CCVS)//電流控制電壓源支路
{
kk=ncf;//控制支路號
kk=bNUM_vbNUM[kk];
kk=kk+NodeNumber;
k=br->number;//支路號
k=bNUM_vbNUM[k];
k=k+NodeNumber;
znmna_list.insertCoef(nf,k,1.0);//對節(jié)點(diǎn)電流的貢獻(xiàn)
znmna_list.insertCoef(nt,k,-1.0);//
znmna_list.insertCoef(k,nf,1.0);// 支路特性Unf_Unto-rm*jk=0
znmna_list.insertCoef(k,nt,-1.0);//對C的貢獻(xiàn)
znmna_list.insertCoef(k,kk,-1.0*val);//對D的貢獻(xiàn)
}
else if(t==OPAMP)//理想運(yùn)算放大器,因?yàn)樘摂啵瑳]有電流貢獻(xiàn)多一看作一條電壓定義支路
{
k=br->number;//支路號
k=bNUM_vbNUM[k];//電壓定義支路號
k=k+NodeNumber;
znmna_list.insertCoef(nf,k,1.0);//
znmna_list.insertCoef(nt,k,-1.0);//對Y的貢獻(xiàn),
znmna_list.insertCoef(k,ncf,1.0);// 輸入口支路特性即虛短,Ui-Uj=0;
znmna_list.insertCoef(k,nct,-1.0);
}
else if(t==VS)//獨(dú)立電壓源
{
k=br->number;//支路號
k=bNUM_vbNUM[k];//電壓定義支路號
k=k+NodeNumber;
znmna_list.insertCoef(nf,k,1.0); //對節(jié)點(diǎn)電流的貢獻(xiàn)即Y
znmna_list.insertCoef(nt,k,-1.0); //
znmna_list.insertCoef(k,nf,1.0); //Unf-Unto=0
znmna_list.insertCoef(k,nt,-1.0); // 支路特性,C
}
}
znmna_list.numLU();
}
void Analysis:: LoadBData_BS()
{
int i,t,nf,nt,ncf,nct,k;
double val;//裝配右端向量數(shù)值
for(i=1;i<BranchNumber+1;i++)
{
BRANCH*br=Branch+i;
t=br->type;
nf=br->nfrom;
nt=br->nto;
ncf=br->ncfrom;
nct=br->ncto;
val=br->value;
if(t==CS)
{
znmna_list.insertBVal( nf,-1*val);//修正
znmna_list.insertBVal(nt,val);///因?yàn)橛疫吺橇魅牍?jié)點(diǎn)的獨(dú)立電流源的和
//而我們規(guī)定電流源的方向?yàn)閚f->nto
}
else if(t==VS)
{
k=br->number;
k=bNUM_vbNUM[k];
k=k+NodeNumber;
znmna_list.insertBVal(k,val); //第k條電壓定義支路
}
}
znmna_list. makeSolution();// 數(shù)值前消、后代,獲得Tab中的解
CString Total;
CString outmsg;
double m_out;
for( i=1;i<NodeNumber+vBranchNumber+1;i++)
{
m_out=znmna_list.getX(i);
if(i<NodeNumber+1)
outmsg.Format("u[%d]=%4.4f\n",i,m_out);
else {
int v=vbNUM_bNUM[i-NodeNumber];
outmsg.Format("vBranchNumber=%d; I[%d]=%4.8f\n",v,i-NodeNumber, (double) m_out);
}
Total=Total+outmsg;
}
AfxMessageBox(Total,MB_OK|MB_ICONINFORMATION);
znmna_list.deleteList();
znmna_list.delete_tableT();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -