⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dcanalysis.cpp

📁 采用矩阵方法实现的spice电路直流分析程序。用visual c++实现
💻 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 + -