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

📄 main.cpp

📁 用于集成电路辅助设计的一写算法
💻 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{                                 //建立一个结构体,保存每条支路的信息
	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};                                    //为结构体数组申请空间
int b;                                           //全局变量b为支路数
int n;                                            //全局变量n为节点数 
int out=0;
void showcircuit();                             //显示输入电路的拓朴结构
char cindata();                               //输入电路数据
void cleardata();                             //清除结构体数组释放空间
void moreinform();                            //为受控源申请更多的信息
void buildmixed();                            //建立混合方程
void showmixed();                             //显示混合方程
void typevccs(int);                           //当受控源为第一类VCCS时的处理


void main()
{  
  char key;
  cout<<"=============直流分析程序=============\n";
  key=cindata();                                         //输入电路数据
  if(key=='y')                                           //检查输入是否有误    
	{
	  cleardata();                                       //用户重新输入数据,要清理之前的数据输入
	  cindata();
    }
  else													//确认输入数据后就建立相关矩阵
    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<<"计算结果如下:";
		for(int i=0;i<order;i++)
		{
			if(i/10==0) cout<<endl;
			cout<<ans[i]<<"    ";
		}
	}
	else exit(0);
}
void showcircuit()                             
{   cout<<"您输入的数据如下:\n";
    cout<<"支路号(1->b)  起始节点(0->n-1)  终止节点(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<<"请输入总的支路数:\n";
   cin>>b;
   cout<<"请输入总的节点数:\n";
   cin>>n;
   cout<<"请按下列顺序输入相关数据:\n支路号(1->b)  起始节点(0->n-1)  终止节点(0->n-1)  类型(1->10)  大小\n"; 
   cout<<"类型代号:\n 1-电阻\n 2-电导\n 3-电感\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<<"需要修改数据么?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<<"条支路是受控源"<<"请按下列顺序输入相关信息:\n";
      cout<<"控制支路号(1->b) 控制系数\n";
      cin>>control[i].connumber;
      cin>>control[i].gm;
	}
	}	
}


void showmixed()
{    
	cout<<"下面是混合方程系数矩阵:\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 + -