| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- #include "pch.h"
- #include "CalculEquation.h"
- CalculEquation::CalculEquation()
- {
- m_nNodeMatricCol = NODE_MATRIC_COLLOM;
- m_nNodeMatricRow = NODE_MATRIC_ROW;
- a=new double *[m_nNodeMatricRow];
- for (int aindex=0;aindex< m_nNodeMatricRow;aindex++)
- {
- a[aindex]=new double [m_nNodeMatricCol];
- }
- b=new double *[m_nNodeMatricRow];
- for (int bindex=0;bindex < m_nNodeMatricRow;bindex++)
- {
- b[bindex]=new double [m_nNodeMatricCol];
- }
-
- /*
- for(int aXindex=0;aXindex<NODE_MATRIC_ROW;aXindex++)
- {
- vector<long double> va;
- for (int aYindex=0;aYindex<NODE_MATRIC_COLLOM;aYindex++)
- {
- va.push_back(0.0);
- }
- a.push_back(va);
- }
- for(int bXindex=0;bXindex<NODE_MATRIC_ROW;bXindex++)
- {
- vector<long double> vb;
- for (int bYindex=0;bYindex<NODE_MATRIC_COLLOM;bYindex++)
- {
- vb.push_back(0.0);
- }
- b.push_back(vb);
- }*/
- }
- CalculEquation::~CalculEquation()
- {
- Clear();
- if (b!=NULL)
- {
- for (int bindex = m_nNodeMatricRow -1;bindex>=0;bindex--)
- {
- if (b[bindex]==NULL)
- {
- continue;
- }
- delete []b[bindex];
- b[bindex]=NULL;
- }
- delete []b;
- b=NULL;
- }
- if (a!=NULL)
- {
- for (int aindex = m_nNodeMatricRow -1;aindex>=0;aindex--)
- {
- if (a[aindex]==NULL)
- {
- continue;
- }else
- {
- if (aindex==1)
- {
- double* test=a[aindex];
- for (int xs=0;xs< m_nNodeMatricCol;xs++)
- {
- //delete a[aindex];
- double pi=*(test+xs);
- pi=0.0;
- }
- //delete []a[aindex];
- }else
- {
- delete []a[aindex];
- }
-
- a[aindex]=NULL;
- }
- }
- delete []a;
- a=NULL;
- }
- }
- void CalculEquation::chengplus(int i,const double k, int j)//i行乘k加到j行
- {
- for(int t=0;t<lie;t++)
- {
- b[j-1][t]+=b[i-1][t]*k;
- }
- }
- void CalculEquation::chengk(int i,const double k)//i行乘k
- {
- for(int c=0;c<lie;c++)
- {
- b[i-1][c]=b[i-1][c]*k;
- }
- }
- void CalculEquation::exchange(int i, int j)//i行与j行互换
- {
- long double temp=0;
- for(int t=0;t<lie;t++)
- {
- temp=b[i-1][t];
- b[i-1][t]=b[j-1][t];
- b[j-1][t]=temp;
- }
- }
- void CalculEquation::SetParam(int hang,int lie,const double ratio)//行列参数设置,给矩阵对应位置的元素赋值, //设置节点导纳+电流矩阵中的各节点自导、互导、注入电流参数 xyx注释
- {
- double inData=ratio;
- if (a[hang]!=NULL)
- {
- a[hang][lie]=inData; //将节点导纳+注入电流矩阵赋给a阵
- }
- }
- void CalculEquation::hualie(int i) //函数的具体功能:对第i列的第i行前的元素乘k运算,第i行后的元素:将第i行的元素乘kkk加到对应的第i行的对应元素
- {
- int jilu=-1;
- for(int v=0;v<(hang-i+1);v++) //对第i列元素的第i行后的元素进行处理,
- {
- if(b[i-1+v][i-1]!=0) //判断第i列元素的第i行后的元素是否非零 //主对角线及下三角元素 xyx注释
- {
- jilu=i+v;
- break;
- }
- }
- if(jilu==-1)
- {
- }
- else //对非零元素进行处理
- {
- long double kkk=1;
- exchange(i,jilu);//第i行与第jilu行交换 //第一步:交换矩阵的两行,进行行交换后尽量使主对角线非零且下三角为元素为0 xyx注释
- chengk(i,(1.0/b[i-1][i-1]));//对第i行的元素乘k //对第i行元素归一化 2016.03.18 //第二步:用非零常数乘矩阵的某行,将主对角元素归一化 xyx注释
- for(int w=0;w<(hang-i);w++)//对第i行前面的元素进行判断
- {
- if(b[i-1][i-1]!=0)//行列元素坐标为(i,i)的非零判断
- {
- kkk=0.0-(b[i+w][i-1]/b[i-1][i-1]);
- chengplus(i,kkk,i+1+w);//第i-1行乘kkk加到i+w行 //第三步:用常数乘矩阵的某行,加到其它的行上 xyx注释
- }
- }
- }
- }
- void CalculEquation::Uhualie(int i)//?此函数的功能和作用
- {
- if(b[i-1][i-1]!=0)//第i行第i列元素非零判断
- {
- long double kkk=1;
- for(int w=0;w<(i-1);w++)
- {
- if(b[i-1][i-1]!=0)
- {
- kkk=0.0-(b[i-2-w][i-1]/b[i-1][i-1]);//?这里有具体的公式存在不?
- chengplus(i,kkk,i-1-w);//将第i行第i列的元素乘kkk(随w的值变化而变化)加到第i列第i-1-w行上
- }
- }
- }
- }
- void CalculEquation::jisuan()//
- {//详细注释此函数的功能和作用:
- if (a==NULL||b==NULL)
- {
- return;
- }
- for(int i=0;i < m_nNodeMatricRow;i++)
- {
- for(int j=0;j< m_nNodeMatricCol;j++)
- {
- b[i][j]=a[i][j]; //将a矩阵参数赋给b矩阵,此时矩阵中存放直流节点的自导、互导、注入电流值
- }
- }
- int z=0;
- if(hang<lie) //z=行数、列数中的较小者,此处z取行数 xyx注释
- {
- z=hang;
- }
- else
- {
- z=lie;
- }
- //以下函数的功能为:矩阵初等行变换法求逆: xyx注释
- //第一步:交换矩阵的两行,各非零行的第一个非零元素的列标随着行标的增大而严格增大,形成阶梯矩阵
- //第二步:用一非零常数乘矩阵的某行
- //第三步:用常数乘矩阵的某行,加到其它的行上
- for(int zi=0;zi<z;zi++)//对矩阵维数较小的列进行划列(顺序)
- {
- hualie(zi+1);
- }
- for(int zii=0;zii<z;zii++)//对矩阵维数较小的列进行优化(逆序)
- {
- Uhualie(z-zii);
- }
- for(int zck=0;zck<z;zck++)
- {
- if(b[zck][zck]!=0)
- {
- chengk(zck+1,(1.0/b[zck][zck]));//对第zck+1行元素乘(1.0/b[zck][zck])运算
- }
- }
- }
- void CalculEquation::Clear()//矩阵清零 //矩阵初始化清零,将所有元素值设为0 xyx注释
- {
- if (a==NULL||b==NULL)
- {
- return;
- }
- for(int i=0;i < m_nNodeMatricRow;i++)
- {
- if (a[i] != NULL)
- {
- for(int j=0;j< m_nNodeMatricCol;j++)
- {
- a[i][j]=0.0;
- }
- }
- if (b[i] != NULL)
- {
- for(int j=0;j< m_nNodeMatricCol;j++)
- {
- b[i][j]=0.0;
- }
- }
- }
- }
- void CalculEquation::SetHangLie(int h,int l)//设置行列
- {
- hang = h;
- lie=l;
- };
- BOOL CalculEquation::CheckResult() //验证结果的正确性(很想知道这个函数的具体意义是什么?)
- {
- int testa=0;
- int testb=0;
- //double bbvalue[17];
- for(int i=0;i<hang;i++)
- {
- for(int j=0;j<hang;j++)
- {
- if(b[i][j]!=0) //判断求出的逆矩阵第i行各元素是否非零:节点导纳矩阵的逆矩阵 xyx注释
- {
- testb+=1; //(1)若存在非零元素,则进行计数testb+=1;(2)若前lie-1列的元素全为零,则testb==0 xyx注释
- }
- }
-
- double bvalue = b[i][lie-1]; //第i行的最后一列元素:节点注入电流bvalue xyx注释
-
- // bbvalue[i] = b[i][lie-1];///
- if(testb==0&&b[i][lie-1]!=0) //若第i行的前lie-1列的元素全为0,且最后一列元素!=0,则说明该行的方程无解,并进行计数testa+=1 xyx注释
- {
- int ivalue = i;
- testa+=1;
- }
- testb=0;
- }
- if(testa!=0) //testa!=0,说明该行的方程无解,计算错误 xyx注释
- {
- return FALSE;
- }
- return TRUE;
- }
|