logo资料库

Eigen求解线性方程组.docx

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
// // main.cpp // eigentry // // Created by niqian on 2017/4/17. // Copyright © 2017年 niqian. All rights reserved. // #include using namespace std; #include #include using namespace Eigen; typedef Eigen::SparseMatrix SpMat; // 声明一个列优先的双精度稀疏 矩阵类型 typedef Eigen::Triplet T; //三元组(行,列,值) void SolveLinearEquation_qq(int mtype,const vector> &coeff_matrix,const vector &load_vect,vector &m_solute); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%% void inputM(vector> &aT) { int i, j, d, row, col; vector R; cout << "Enter the row and column: "; cin >> row >> col; cout << "Enter the matrix:" << endl; for(i=0; i
{ } R.clear(); for(j=0; j> d; R.push_back(d); } aT.push_back(R); } void inputB(vector &bT) { int i, j, d, n; vector R; cout << "Enter the row and column: "; cin >> n; cout << "Enter the vector:" << endl; for(i=0; i>d; bT.push_back(d); } } int main(int argc, const char * argv[]) { vector> am; vector bv; vector x; am.clear();bv.clear();x.clear(); inputM(am); inputB(bv); SolveLinearEquation_qq(11,am,bv,x); int n = x.size(); for(int i = 0; i
return 0; } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% void SolveLinearEquation_qq(int mtype,const vector> &coeff_matrix,const vector &load_vect,vector &m_solute) { int m = coeff_matrix.size(); // 未知元素的数量 // Assembly: vector coefficients; if (-2 == mtype)//symmetric matrix { // list of non-zeros coefficients for(int i=0; i 10e-8) { coefficients.push_back(T(i,j,coeff_matrix[i][j])); coefficients.push_back(T(j,i,coeff_matrix[j][i])); } } } cout<<"symmetric matrix!!!:"; } if (11 == mtype)//real unsymmetric
{ for(int i=0; i 10e-8) { coefficients.push_back(T(i,j,coeff_matrix[i][j])); } } } cout<<"unsymmetric matrix!!!:"; } VectorXd b(m); for (int i=0;i < m;++i) b(i) = load_vect[i]; // 等号右边的向量b SpMat A(m,m); // 等号左边的矩阵A A.setFromTriplets(coefficients.begin(), coefficients.end()); // 求解 SimplicialCholesky chol(A); // 执行A的 Cholesky分解 VectorXd x = chol.solve(b);// 使用A的Cholesky分解来求解等号右边的向量b m_solute.resize(m); for (int i = 0; i < m; i++) { m_solute[i] = x(i); } }
分享到:
收藏