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

📄 mafbsub.cpp

📁 电力系统稀疏矩阵计算类,用法范例代码,包括三个目录,MALIB(类),MATEST(使用范例),INCLUDE(*.H),是我编写的电力系统能量管理系统基础类之一.
💻 CPP
字号:
//===========================================================================
//
//                            EMS高级应用软件
//
//===========================================================================
//  rev    0.0   8-9-2004      initial release   Qwbin
//  版本   0.0   8-9-2004      第一次发布        齐文斌
//---------------------------------------------------------------------------

//************************************************************************
// mafbsub - forward/backward substitution for sparse symmetric matrix 
// 线性方程求解叠代过程
//************************************************************************
#include <malib.h>

//************************************************************************
int EmsMatrix::mafbsub(void)
{
   int i;
   struct maorderst *maorderpt;  
   struct mastatest *mastatept, *base_mastatept; 

   if ( nmastate > 0 )
   {
      for (i = 0; i < nmastate; i++)
      {
         maorderpt = maorder_vt[i];
		 mastatept = mastate_vt[maorderpt->mastate_itm-1];
         maorderpt->link.mastatept = mastatept;
      }

      forward_substitution ();
    

	  //按经典PQ分解法or修正PQ分解法选择不同数据来源   mdn  04-11-11
	  if( ( Q_V == 2 ) && ( lf_type == 2) )
	  {
		  for(i = 0; i< nmastate; i++)
		  {
		      maorderpt = maorder_vt[i];
			  maorderpt->link.mastatept->x *= maorderpt->diag1;
		  }
	  }
	  else
	  {
		  for(i = 0; i< nmastate; i++)
		  {
              maorderpt = maorder_vt[i];
			  maorderpt->link.mastatept->x *= maorderpt->diag;
		  }
	  }
	  //

      backward_substitution ();

   }

   return ( SUCCESS );
}

//************************************************************************
// forward_substitution - forward substitution
//
// Zi=Zj-Lij*Zi 前代运算
//************************************************************************
void EmsMatrix::forward_substitution (void)
{
   int i; 
   int j;             
   double value;        
   struct maorderst *maorderpt;      
   struct maorderst *col_maorderpt;  
   struct magmtrxst *magmtrxpt;      

   for (i = 0;  i < nmastate; i++)
   {
      maorderpt = maorder_vt[i];
	  value    = 0.0;
      //magmtrxpt  = base_magmtrxpt + maorderpt->magmtrx_itm;
      for ( j = 0; j < maorderpt->magmtrx_cnt; j++)
      {
        
		 magmtrxpt =magmtrx_vt[j+maorderpt->magmtrx_itm-1];
		 if (magmtrxpt->colitm <1) break;  //mdn  06-3-22
		 col_maorderpt = maorder_vt[magmtrxpt->colitm-1];
//         value += magmtrxpt->element * col_maorderpt->link.mastatept->x;

		 //双重标识控制因子表的数据来源  mdn 04-11-10
		 if ( ( Q_V == 2 ) && ( lf_type == 2) )
			 value += magmtrxpt->xij * col_maorderpt->link.mastatept->x;
		 else
			 value += magmtrxpt->element * col_maorderpt->link.mastatept->x;


      }
      maorderpt->link.mastatept->x -= value;

   }
   

   return;
}

//************************************************************************
// backward_substitution - backward substitution
// 回推运算
// xi=xi-Uij*xj
//************************************************************************
void EmsMatrix::backward_substitution (void)
{
   int i, magmtrx_col;      
   double value;         
   struct maorderst *maorderpt, *row_maorderpt;   
   for (i = 0; i < nmastate; i++)
   {
      maorderpt =  maorder_vt[nmastate-1-i];
	  value    = 0.0;
      magmtrx_col = maorderpt->magmtrx_col;
      while ( magmtrx_col >0 )
      {
         magmtrxpt = magmtrx_vt[magmtrx_col-1];	
         
		 if (magmtrxpt->rowitm<1) break;    //mdn  06-3-22

         row_maorderpt = maorder_vt[magmtrxpt->rowitm-1];
 //        value += magmtrxpt->element * row_maorderpt->link.mastatept->x;
 
		 //双重标识控制因子表的数据来源  mdn 04-11-10
		 if ( ( Q_V == 2 ) && ( lf_type == 2) )
			 value += magmtrxpt->xij * row_maorderpt->link.mastatept->x;
		 else
			 value += magmtrxpt->element * row_maorderpt->link.mastatept->x;
		 //

         magmtrx_col = magmtrxpt->magmtrx_itm;
      }
      maorderpt->link.mastatept->x -= value;
   }

   return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -