?? main.cpp
字號:
#include "stdio.h"
#include "iostream.h"
#include "stdlib.h"
#include "lu.h"
const int arraysize=500; //定義總長為500
float wmatrix[arraysize]={0}; //混合方程等號右邊的列向量
float mixedmatrix[arraysize][arraysize]={0}; //混合方程矩陣
struct circuitmap{ //建立一個結(jié)構(gòu)體,保存每條支路的信息
int branchnumber;
int startpoint;
int endpoint;
int type;
float value;
};
struct coninform{
int connumber;
float gm;
};
struct current{
int mark;
float value;
};
struct voltage{
int mark;
float value;
};
coninform control[arraysize]={0};
circuitmap circuit[arraysize]={0};
current currentfor[arraysize]={0};
voltage voltagefor[arraysize]={0}; //為結(jié)構(gòu)體數(shù)組申請空間
int b; //全局變量b為支路數(shù)
int n; //全局變量n為節(jié)點數(shù)
int out=0;
void showcircuit(); //顯示輸入電路的拓樸結(jié)構(gòu)
char cindata(); //輸入電路數(shù)據(jù)
void cleardata(); //清除結(jié)構(gòu)體數(shù)組釋放空間
void moreinform(); //為受控源申請更多的信息
void buildmixed(); //建立混合方程
void showmixed(); //顯示混合方程
void typevccs(int); //當受控源為第一類VCCS時的處理
void main()
{
char key;
cout<<"=============直流分析程序=============\n";
key=cindata(); //輸入電路數(shù)據(jù)
if(key=='y') //檢查輸入是否有誤
{
cleardata(); //用戶重新輸入數(shù)據(jù),要清理之前的數(shù)據(jù)輸入
cindata();
}
else //確認輸入數(shù)據(jù)后就建立相關(guān)矩陣
moreinform();
buildmixed();
showmixed();
cout<<"要通過LU分解求解方程么?(y/n)\n";
cin>>key;
if(key=='y')
{
int order=n+out-1;
float *lmatrix = new float[order*order];
float *umatrix=new float[order*order];
float *ans=new float[order];
float *temp=new float[order];
LU_decompose(mixedmatrix,lmatrix,umatrix,wmatrix,order);
solve_L(lmatrix,wmatrix,temp,order);
solve_U(umatrix,temp,ans,order);
cout<<"計算結(jié)果如下:";
for(int i=0;i<order;i++)
{
if(i/10==0) cout<<endl;
cout<<ans[i]<<" ";
}
}
else exit(0);
}
void showcircuit()
{ cout<<"您輸入的數(shù)據(jù)如下:\n";
cout<<"支路號(1->b) 起始節(jié)點(0->n-1) 終止節(jié)點(0->n-1) 類型(1-10) 大小\n";
for(int k=1;k<=b;k++)
{
cout<<circuit[k].branchnumber<<"\t\t";
cout<<circuit[k].startpoint<<"\t\t";
cout<<circuit[k].endpoint<<"\t\t ";
cout<<circuit[k].type<<"\t\t";
cout<<circuit[k].value<<"\t\t";
cout<<"\n";
}
}
char cindata()
{ int i=1;
char sure;
cout<<"請輸入總的支路數(shù):\n";
cin>>b;
cout<<"請輸入總的節(jié)點數(shù):\n";
cin>>n;
cout<<"請按下列順序輸入相關(guān)數(shù)據(jù):\n支路號(1->b) 起始節(jié)點(0->n-1) 終止節(jié)點(0->n-1) 類型(1->10) 大小\n";
cout<<"類型代號:\n 1-電阻\n 2-電導\n 3-電感\(zhòng)n 4-電容\n 5-VCCS\n 6-CCCS\n 7-VCVS\n 8-CCVS\n 9-獨立電壓源\n 10-獨立電流源\n";
while(i<=b)
{
cin>>circuit[i].branchnumber;
cin>>circuit[i].startpoint;
cin>>circuit[i].endpoint;
cin>>circuit[i].type;
cin>>circuit[i].value;
i++;
}
circuitmap temper;
for(int k=1;k<=b-1;k++)
{
for(int j=1;j<=b-1;j++)
{ if (circuit[j].branchnumber>circuit[j+1].branchnumber)
{
temper=circuit[j];
circuit[j]=circuit[j+1];
circuit[j+1]=temper;
}
}
}
showcircuit();
cout<<"需要修改數(shù)據(jù)么?Y/N \n";
cin>>sure;
return sure;
}
void cleardata()
{ for (int i=1;i<=b;i++)
{
circuit[i].branchnumber=0;
circuit[i].startpoint=0;
circuit[i].endpoint=0;
circuit[i].type=0;
circuit[i].value=0;
}
}
void buildmixed()
{
for(int i=1;i<=b;i++)
{
if (circuit[i].type==1)
{
mixedmatrix[circuit[i].startpoint][circuit[i].startpoint]+=1/circuit[i].value;
mixedmatrix[circuit[i].endpoint][circuit[i].endpoint]+=1/circuit[i].value;
mixedmatrix[circuit[i].endpoint][circuit[i].startpoint]-=1/circuit[i].value;
mixedmatrix[circuit[i].startpoint][circuit[i].endpoint]-=1/circuit[i].value;
}
else if (circuit[i].type==2)
{ mixedmatrix[circuit[i].startpoint][circuit[i].startpoint]+=circuit[i].value;
mixedmatrix[circuit[i].endpoint][circuit[i].endpoint]+=circuit[i].value;
mixedmatrix[circuit[i].endpoint][circuit[i].startpoint]-=circuit[i].value;
mixedmatrix[circuit[i].startpoint][circuit[i].endpoint]-=circuit[i].value;
}
else if (circuit[i].type==3)
{
voltagefor[i].value=0;
}
else if (circuit[i].type==4)
{
currentfor[i].value=0;
}
else if (circuit[i].type==5)
{
typevccs(i);
}
else if (circuit[i].type==6)
{
if(currentfor[control[i].connumber].value!=0)
{
if (circuit[control[i].connumber].type==1)
{
control[i].gm=control[i].gm/circuit[control[i].connumber].value; //等效于VCCS的情況;
typevccs(i);
}
else if (circuit[control[i].connumber].type==2)
{
control[i].gm=control[i].gm*circuit[control[i].connumber].value; //等效于VCCS的情況;
typevccs(i);
}
}
else if (currentfor[control[i].connumber].value==0)
{
mixedmatrix[circuit[control[i].connumber].startpoint][n+out]+=1; //等效于一個四端元件
mixedmatrix[circuit[control[i].connumber].endpoint][n+out]-=1;
mixedmatrix[circuit[i].startpoint][n+out]+=control[i].gm;
mixedmatrix[circuit[i].endpoint][n+out]-=control[i].gm;
mixedmatrix[n+out][circuit[control[i].connumber].startpoint]+=1;
mixedmatrix[n+out][circuit[control[i].connumber].endpoint]-=1;
mixedmatrix[n+out+1][circuit[i].startpoint]+=1;
mixedmatrix[n+out+1][circuit[i].endpoint]-=1;
out++;
currentfor[control[i].connumber].mark=-1;
}
}
else if (circuit[i].type==7)
{
mixedmatrix[circuit[i].startpoint][n+out]+=1;
mixedmatrix[circuit[i].endpoint][n+out]-=1;
mixedmatrix[n+out][circuit[control[i].connumber].startpoint]-=control[i].gm;
mixedmatrix[n+out][circuit[control[i].connumber].endpoint]+=control[i].gm;
mixedmatrix[n+out][circuit[i].startpoint]+=1;
mixedmatrix[n+out][circuit[i].endpoint]-=1;
out++;
currentfor[i].mark=-1;
}
else if (circuit[i].type==8)
{
if(voltagefor[control[i].connumber].value!=0)
{
if (circuit[control[i].connumber].type==1)
{ control[i].gm=control[i].gm/circuit[control[i].connumber].value; //等效于VCVS處理;
mixedmatrix[circuit[i].startpoint][n+out]+=1;
mixedmatrix[circuit[i].endpoint][n+out]-=1;
mixedmatrix[n+out][circuit[control[i].connumber].startpoint]-=control[i].gm;
mixedmatrix[n+out][circuit[control[i].connumber].endpoint]+=control[i].gm;
mixedmatrix[n+out][circuit[i].startpoint]+=1;
mixedmatrix[n+out][circuit[i].endpoint]-=1;
out++;
currentfor[i].mark=-1;
}
else if (circuit[control[i].connumber].type==2)
{ control[i].gm=control[i].gm*circuit[control[i].connumber].value; //等效于VCVS處理;
mixedmatrix[circuit[i].startpoint][n+out]+=1;
mixedmatrix[circuit[i].endpoint][n+out]-=1;
mixedmatrix[n+out][circuit[control[i].connumber].startpoint]-=control[i].gm;
mixedmatrix[n+out][circuit[control[i].connumber].endpoint]+=control[i].gm;
mixedmatrix[n+out][circuit[i].startpoint]+=1;
mixedmatrix[n+out][circuit[i].endpoint]-=1;
out++;
currentfor[i].mark=-1;
}
}
else if (voltagefor[control[i].connumber].value==0)
{ mixedmatrix[n+out][circuit[control[i].connumber].startpoint]+=1; //等效于四端元件;
mixedmatrix[n+out][circuit[control[i].connumber].endpoint]-=1;
mixedmatrix[n+out+1][circuit[i].startpoint]+=1;
mixedmatrix[n+out+1][circuit[i].endpoint]-=1;
mixedmatrix[n+out+1][n+out]+=control[i].gm;
mixedmatrix[circuit[control[i].connumber].startpoint][n+out]+=1;
mixedmatrix[circuit[control[i].connumber].endpoint][n+out]-=1;
mixedmatrix[circuit[i].startpoint][n+out+1]+=1;
mixedmatrix[circuit[i].endpoint][n+out+1]-=1;
out++;
currentfor[control[i].connumber].mark=-1;
currentfor[i].mark=-1;
}
}
else if (circuit[i].type==9)
{
mixedmatrix[circuit[i].startpoint][n+out]+=1;
mixedmatrix[circuit[i].endpoint][n+out]-=1;
mixedmatrix[n+out][circuit[i].startpoint]+=1;
mixedmatrix[n+out][circuit[i].endpoint]-=1;
out++;
wmatrix[n+out]=circuit[i].value;
currentfor[i].mark=-1;
}
else if (circuit[i].type==10)
{
wmatrix[circuit[i].startpoint]+=circuit[i].value;
wmatrix[circuit[i].endpoint]-=circuit[i].value;
}
}
}
void moreinform()
{
for(int i=1;i<=b;i++)
{ if((circuit[i].type==5)||(circuit[i].type==6)||(circuit[i].type==7)||(circuit[i].type==8))
{ cout<<"第"<<i<<"條支路是受控源"<<"請按下列順序輸入相關(guān)信息:\n";
cout<<"控制支路號(1->b) 控制系數(shù)\n";
cin>>control[i].connumber;
cin>>control[i].gm;
}
}
}
void showmixed()
{
cout<<"下面是混合方程系數(shù)矩陣:\n";
for(int i=1;i<=n-1+out;i++)
{
{ for(int j=1;j<=n-1+out;j++)
cout<<mixedmatrix[i][j]<<"\t";
}
cout<<"\n";
}
}
void typevccs(int i)
{
if (circuit[control[i].connumber].endpoint!=0)
{
mixedmatrix[circuit[i].startpoint][circuit[control[i].connumber].startpoint]+=control[i].gm;
mixedmatrix[circuit[i].endpoint][circuit[control[i].connumber].endpoint]+=control[i].gm;
mixedmatrix[circuit[i].startpoint][circuit[control[i].connumber].endpoint]-=control[i].gm;
mixedmatrix[circuit[i].endpoint][circuit[control[i].connumber].startpoint]-=control[i].gm;
}
else if((circuit[control[i].connumber].endpoint==0)&(circuit[i].endpoint!=0))
{
mixedmatrix[circuit[i].startpoint][circuit[control[i].connumber].startpoint]+=control[i].gm;
mixedmatrix[circuit[i].endpoint][circuit[control[i].connumber].endpoint]=0;
mixedmatrix[circuit[i].startpoint][circuit[control[i].connumber].endpoint]=0;
mixedmatrix[circuit[i].endpoint][circuit[control[i].connumber].startpoint]-=control[i].gm;
}
else if((circuit[i].endpoint==0)&(circuit[control[i].connumber].endpoint==0))
{
mixedmatrix[circuit[i].startpoint][circuit[control[i].connumber].startpoint]+=control[i].gm;
mixedmatrix[circuit[i].endpoint][circuit[control[i].connumber].endpoint]=0;
mixedmatrix[circuit[i].startpoint][circuit[control[i].connumber].endpoint]=0;
mixedmatrix[circuit[i].endpoint][circuit[control[i].connumber].startpoint]=0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -