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

📄 maffbsub.cpp

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

//************************************************************************
// maffbsub - fast forward - backward substitution for sparse matrix
// 快速线性方程求解叠代过程,CA,OPF,LF用
//************************************************************************
#include <malib.h>

//************************************************************************
int EmsMatrix::maffbsub (void)
{
   if ( nmastate > 0 )
   {
      initialize();
   
      forward_sub();
   
      divide_diagonal();
   
      backward_sub();
   }

   return ( SUCCESS );
}

//************************************************************************
// initialize  -  Establish maorder-mastate linkage
//************************************************************************
void EmsMatrix::initialize (void )
{
   int i;      
   struct maorderst *maorderpt; 
   struct mastatest *mastatept; 
   
   for (i=0;i<nmastate;i++)
   {
      maorderpt = maorder_vt[i];
	  mastatept = mastate_vt[maorderpt->mastate_itm-1];
      maorderpt->link.mastatept = mastatept;
   
      if ( mastatept->stat.fastfbs )
      {
         maorderpt->stat.fastfbs = TRUE;
         mastatept->stat.fastfbs = FALSE;
      }
      else
      {
         maorderpt->stat.fastfbs = FALSE;
         mastatept->x = 0.0;
      }
   }
   return;
}

//************************************************************************
// formard_sub  -  Forward substitution
//************************************************************************
void EmsMatrix::forward_sub (void)
{
   int i;      
   int j; 
   double value; 
   struct maorderst *maorderpt, *maorder_pt;
   struct  magmtrxst *magmtrxpt; 
  
   for ( i=0;  i<nmastate;i++)
   {
      maorderpt = maorder_vt[i];
	  if ( maorderpt->stat.fastfbs )
      {
         value    = 0.0;
         
         for ( j=0;j<maorderpt->magmtrx_cnt;j++)
         {
			magmtrxpt  = magmtrx_vt[j+maorderpt->magmtrx_itm-1] ;
			maorder_pt = maorder_vt[magmtrxpt->colitm-1];
            if ( maorder_pt->stat.fastfbs )
               value += magmtrxpt->element * maorder_pt->link.mastatept->x;
         }
   
         maorderpt->link.mastatept->x -= value;
          
         j = maorderpt->magmtrx_col;
         while ( j != 0 )
         {
            magmtrxpt = magmtrx_vt[j-1];
            maorder_pt = maorder_vt[magmtrxpt->rowitm-1];
            maorder_pt->stat.fastfbs = TRUE;
            j = magmtrxpt->magmtrx_itm;
         }
      }
   }
   
   return;
}

//************************************************************************
// divide_diagonal  -  Divide by diagonals
//************************************************************************
void EmsMatrix::divide_diagonal (void )
{
   int i;        
   struct maorderst *maorderpt;       

   for ( i=0;  i<nmastate;i++)
   {
       maorderpt = maorder_vt[i];
	   if ( maorderpt->stat.fastfbs )
         maorderpt->link.mastatept->x *= maorderpt->diag;
   }
   
   return;
}

//************************************************************************
// backward_sub  -  Backward substitution
//************************************************************************
void EmsMatrix::backward_sub(void)
{
   int i, j;        
   int magmtrx_col;      
   double value;         
   struct maorderst *maorderpt, *maorder_pt;       
   struct magmtrxst *magmtrxpt;  
 
   for ( i=0;  i<nmastate;i++)
   {
	  maorderpt =maorder_vt[nmastate-i-1];

	  if ( maorderpt->stat.fastfbs )
      {
         value    = 0.0;
         magmtrx_col = maorderpt->magmtrx_col;
         while ( magmtrx_col != 0 )
         {
            magmtrxpt   = magmtrx_vt[magmtrx_col-1];
            maorder_pt  = maorder_vt[magmtrxpt->rowitm-1];
            if ( maorder_pt->stat.fastfbs )
               value += magmtrxpt->element * maorder_pt->link.mastatept->x;
            magmtrx_col  = magmtrxpt->magmtrx_itm;
         }
   
         maorderpt->link.mastatept->x -= value;
          
         for ( j=0;  j<maorderpt->magmtrx_cnt;j++)
         {
            magmtrxpt  = magmtrx_vt[j+maorderpt->magmtrx_itm-1];

			maorder_pt = maorder_vt[magmtrxpt->colitm-1];
            
			maorder_pt->stat.fastfbs = TRUE;
         }
      }
   }

   return;
}

⌨️ 快捷键说明

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