?? dcanalysis.cpp
字號:
#include "iostream.h"
#include "fstream.h"
#include "string.h"
#include "math.h"
#define SIZE 21
//A*X=Z, A=L*U, U*X=Y, L*Y=Z
extern double A[SIZE][SIZE];
extern double Z[SIZE];
extern double X[SIZE];
extern double Y[SIZE];
extern void InitLU(int maxsize);
extern void FindMax(int maxsize, int step);
extern int LUDecomposition(int maxsize);
struct device
{
char name[10];
int self1;
int self2;
int ctrl1;
int ctrl2;
double value;
}dev[30];
int dev_num;
int maxsize;
int max(int a,int b,int c,int d)
{
int x,y;
x=(a>b?a:b);
y=(c>d?c:d);
return (x>y?x:y);
}
void LoadData(void)
{
ifstream ifile("DCinput.txt");
int temp;
dev_num=0;
maxsize=0;
while ( !ifile.eof() )
{
ifile>>temp;
if ( temp == 1 ) //independent device
{
ifile>>dev[dev_num].name;
ifile>>dev[dev_num].self1;
ifile>>dev[dev_num].self2;
ifile>>dev[dev_num].val;
dev[dev_num].ctrl1 = 0;
dev[dev_num].ctrl2 = 0;
}
else if ( temp == 2 )
{
ifile>>dev[dev_num].name;
ifile>>dev[dev_num].self1;
ifile>>dev[dev_num].self2;
ifile>>dev[dev_num].ctrl1;
ifile>>dev[dev_num].ctrl2;
ifile>>dev[dev_num].val;
}
temp=max(dev[dev_num].self1,dev[dev_num].self2,dev[dev_num].ctrl1,dev[dev_num].ctrl2);
if( maxsize<temp) maxsize=temp;
dev_num++;
}
ifile.close();
}
void FillTable(void)
{
double temp;
for ( int i = 0 ; i < dev_num ; i++ )
{
if ( !strcmp( dev[i].name , "R" ) )
Fill_R(i);
else if ( !strcmp( dev[i].name , "G" ) )
Fill_G(i);
/* else if ( !strcmp( dev[i].name , "C" ) )
Fill_C(i,1);
else if ( !strcmp( dev[i].name , "L" ) )
Fill_L(i,1);*/
else if ( !strcmp( dev[i].name , "CS" ) )
Fill_CS(i);
else if ( !strcmp( dev[i].name , "VS" ) )
Fill_VS(i);
else if ( !strcmp( dev[i].name , "CCCS" ) )
Fill_CCCS(i);
else if ( !strcmp( dev[i].name , "VCCS" ) )
Fill_VCCS(i);
else if ( !strcmp( dev[i].name , "VCVS" ) )
Fill_VCVS(i);
else if ( !strcmp( dev[i].name , "CCVS" ) )
Fill_CCVS(i);
}
}
void Fill_R(int n)
{
A[dev[n].self1][dev[n].self1] += 1.0/dev[n].value;
A[dev[n].self2][dev[n].self2] += 1.0/dev[n].value;
A[dev[n].self1][dev[n].self2] -= 1.0/dev[n].value;
A[dev[n].self2][dev[n].self1] -= 1.0/dev[n].value;
}
void Fill_G(int n)
{
A[dev[n].self1][dev[n].self1] += dev[n].value;
A[dev[n].self2][dev[n].self2] += dev[n].value;
A[dev[n].self1][dev[n].self2] -= dev[n].value;
A[dev[n].self2][dev[n].self1] -= dev[n].value;
}
void Fill_CS(int n)
{
Z[dev[n].self1] -= dev[n].value;
Z[dev[n].self2] += dev[n].val;
}
void Fill_VS(int n)
{
maxsize++;
A[maxsize][dev[n].self1] = 1;
A[maxsize][dev[n].self2] = -1;
Z[maxsize] = dev[n].value;
A[dev[n].self1][maxsize] = 1;
A[dev[n].self2][maxsize] = -1;
}
void Fill_CCCS( int n )
{
maxsize++;
}
void Fill_VCCS( int n )
{
A[dev[n].self1][dev[n].ctrl1] += dev[n].value;
A[dev[n].self2][dev[n].ctrl2] += dev[n].value;
A[dev[n].self1][dev[n].ctrl2] -= dev[n].value;
A[dev[n].self2][dev[n].ctrl1] -= dev[n].value;
}
void Fill_VCVS( int n )
{
maxsize++;
if( dev[n].node_k != 0 )
{
a[maxsize][dev[n].node_k - 1] += 1;
a[dev[n].node_k - 1][maxsize] += 1;
}
if ( dev[n].node_l != 0 )
{
a[maxsize][dev[n].node_l - 1] -= 1;
a[dev[n].node_l - 1][maxsize] -= 1;
}
if ( dev[n].node_i != 0 )
a[maxsize][dev[n].node_i - 1] -= dev[n].val;
if ( dev[n].node_j != 0 )
a[maxsize][dev[n].node_j - 1] += dev[n].val;
maxsize++;
}
void Fill_ccvs( int n )
{
if ( dev[n].node_i != 0 )
{
a[maxsize][dev[n].node_i - 1] += 1;
a[dev[n].node_i - 1][maxsize] += 1;
}
if ( dev[n].node_j != 0 )
{
a[maxsize][dev[n].node_j - 1] -= 1;
a[dev[n].node_j - 1][maxsize] -= 1;
}
maxsize++;
if ( dev[n].node_k != 0 )
{
a[maxsize][dev[n].node_k - 1] += 1;
a[dev[n].node_k - 1][maxsize] += 1;
}
if ( dev[n].node_l != 0 )
{
a[maxsize][dev[n].node_l - 1] -= 1;
a[dev[n].node_l - 1][maxsize] -= 1;
}
a[maxsize][maxsize - 1] -= dev[n].val;
maxsize++;
}
void output()
{
int t = 0;
cout<<"節點號"<<" "<<"節點電壓"<<endl;
for ( int i = 0 ; i < node_num ; i++ )
cout<<" "<<i+1<<" "<<b[i]<<endl;
}
void main()
{
InitLU(SIZE);
maxsize=0;
dev_num=0;
LoadData();
FillTable();
outputmatrix();
LU_decomposition();
equation_solve();
outputmatrix();
output();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -