int compareMatrices(int** a, int** b){ int aWidth = xMatrix(a); int bWidth = xMatrix(b); if (aWidth > bWidth){ return 1; } else if (aWidth < bWidth){ return -1; } int w = aWidth; int aHeight = yMatrix(a); int bHeight = yMatrix(b); if (aHeight > bHeight){ return 1; } else if (aHeight < bHeight){ return -1; } int l = aWidth; for (int i = 0; i < w; i++){ for (int j = 0; j < l; j++){ if (a[i][j] > b[i][j]){ return 1; } else if (a[i][j] < b[i][j]){ return -1; } } } return 0; }
void swapMatrixRow(int** a, int row1, int row2){ int s = yMatrix(a); for(int i = 0; i < s; i++){ int a1 = a[row1][i]; a[row1][i] = a[row2][i]; a[row2][i] = a1; } }
void printMatrix(int** a){ printf("[\n"); int n = xMatrix(a); int m = yMatrix(a); for (int i = 0; i < n; i++){ printMatrixRow(a[i], m); } printf("]\n"); }
int compareMatrixRow(int** a, int row1, int** b, int row2){ int s = yMatrix(a); for(int i = 0; i < s; i++){ int ai = a[row1][i]; int bi = b[row2][i]; if (ai > bi){ return 1; } else if (ai < bi){ return -1; } } return 0; }
DLLEXPORT void vclGemv(const BlasTranspose transA, const int m, const int n, const ScalarType alpha, const ScalarType a[], const int aOffset, const int aLength, const ScalarType x[], const int xOffset, const int xLength, const ScalarType beta, ScalarType y[], const int yOffset) { auto aPtr = &(a[0]) + aOffset; auto xPtr = &(x[0]) + xOffset; auto yPtr = &(y[0]) + yOffset; // wrap host buffer within ViennaCL viennacl::vector<ScalarType> xVec((ScalarType*)xPtr, viennacl::MAIN_MEMORY, xLength); viennacl::matrix<ScalarType> aMatrix((ScalarType*)aPtr, viennacl::MAIN_MEMORY, m, n); viennacl::matrix<ScalarType> yMatrix(yPtr, viennacl::MAIN_MEMORY, m, n); // auto aux = alpha * viennacl::linalg::prod(aMatrix, xVec) + beta * yMatrix; };
Matrix4 &Matrix4::FromEulerAngle(const EulerAngle &euler) { float fCos, fSin; fCos = Cos(euler.yaw); fSin = Sin(euler.yaw); Matrix3 yMatrix(fCos, 0.0, fSin, 0.0, 1.0, 0.0, -fSin, 0.0, fCos); fCos = Cos(euler.pitch); fSin = Sin(euler.pitch); Matrix3 xMatrix(1.0, 0.0, 0.0, 0.0, fCos, -fSin, 0.0, fSin, fCos); fCos = Cos(euler.roll); fSin = Sin(euler.roll); Matrix3 zMatrix(fCos, -fSin, 0.0, fSin, fCos, 0.0, 0.0, 0.0, 1.0); *this = yMatrix * (xMatrix * zMatrix); return *this; }
bool PowerFlow::Run(const char *filePath) { iPsoTextReader reader; int K; if(reader.Read(filePath)) { YMatrix yMatrix(reader); if(yMatrix.MakeParameter()) { int totalNum=reader.GetTotalNodeNum(); PFJacobian pfJacobian(reader,yMatrix); boost::shared_array<double> unbalance; double *b=NULL; boost::shared_ptr<std::list<swingNodeStruct> > swingNode=reader.GetSwingNodeData(); boost::shared_ptr<std::list<genReactivepowerLimitStruct> > genRepowLimit(reader.GetGenReactivepowerLimitData()); this->Initialization(totalNum,this->mVoltAngle,this->mVolt,reader.GetGenReactivepowerLimitData()); //开始进入循环 for(K=1; K<reader.GetMaxIteration()+1; ++K) { std::cout<<"正在进行第"<<K<<"次迭代"<<std::endl; pfJacobian.Make(this->mVoltAngle,this->mVolt); // std::cout<<"得到不平衡量"<<std::endl; //得到不平衡量 unbalance=pfJacobian.GetUnbalance(); b=unbalance.get(); //准备解出修正量 // std::cout<<"准备解出修正量"<<std::endl; for(int i=0; i<reader.GetTotalNodeNum()*2; ++i) { b[i]=-b[i]; } //对平衡节点进行处理 // std::cout<<"对平衡节点进行处理"<<std::endl; for(std::list<swingNodeStruct>::iterator ite=swingNode->begin(); ite!=swingNode->end(); ++ite) { swingNodeStruct value=*ite; b[value.i]=0; } //对pv节点进行处理 // std::cout<<"对pv节点进行处理"<<std::endl; for(std::list<genReactivepowerLimitStruct>::iterator ite=genRepowLimit->begin(); ite!=genRepowLimit->end(); ++ite) { genReactivepowerLimitStruct value=*ite; b[value.i+totalNum]=0; } //检查终止条件 // std::cout<<"检查终止条件"<<std::endl; if(this->AbsMax(b,totalNum*2)<reader.GetEPS()) { break; } sparseMatSruct spMat; spMat=pfJacobian.GetJacoBian(); Solve::solveT(spMat.dim,spMat.Ap.get(),spMat.Ai.get(),spMat.Ax.get(),b); // std::cout<<"开始计算迭代数"<<std::endl; this->Update(this->mVoltAngle,this->mVolt,b); } } else { std::cout<<"线路参数错误!"<<std::endl; } std::cout<<"迭代"<<K<<"次"<<std::endl; return true; } else { return false; } }