English 中文(简体)
Eigen:Pardiso提供一种非常接近零的错误解决办法,
原标题:Eigen::Pardiso gives a wrong solution which very close to zero,
  • 时间:2023-05-20 13:51:09
  •  标签:

我利用Eigen3.4和mkl解决par线系统。

此前,我得以利用Eigen:SimplicialLDLT解决国际电子教育问题,但需要很长时间。 表二是J^T * J和EE是一种密集的病媒计算出来的一种稀释矩阵。 J是泛神的矩阵,其尺寸为175215 * 175215,EE是介质175215 * 1。 而J是无可争辩的,它只为神父和神父附近的分子具有价值。

就我的案件而言,Eigen:SimplicialLDLT使用14套,而MATLAB只使用2.5套。 因此,我试图利用Eigen:Pardiso来解决这一问题。 使用这种方法确实很快,但产生一种非常接近零的不正确解决办法。 这种方法似乎有许多参数可以确定,它是否帮助我找到正确的解决办法? 还是有另一个更有效的办法解决这一问题?

我几乎使用了Eigen提供的所有方法,包括自己的偿付者和一些外部偿付者,例如 SuiteSparse,但结果不是好的,要么非常缓慢,要么不正确。 我想找到一个正确的解决办法,时间消耗类似于MATLAB。

我的法典如下:

Eigen::SparseMatrix<double> U = JPSlice.transpose() * JPSlice ;
Eigen::SparseMatrix<double> V = JDRow.transpose() * JDRow + WeightHH;
Eigen::SparseMatrix<double> W = JPSlice.transpose() * JDRow;
Eigen::VectorXd VecErrorS = Eigen::VectorXd::Map(ErrorS.data(), ErrorS.size());
Eigen::VectorXd EP = -JPSlice.transpose()  * VecErrorS;
Eigen::VectorXd ED = -JDRow.transpose()  * VecErrorS;
Eigen::ArrayXi RowIdSelectVar = IdSelectVar.col(0);
Eigen::ArrayXi ColIdSelectVar = IdSelectVar.col(1);
// Sort the order to variables order
Eigen::ArrayXi ArraySortSelectId = RowIdSelectVar * ValParam.Sizej + ColIdSelectVar;
std::sort(ArraySortSelectId.data(), ArraySortSelectId.data() + ArraySortSelectId.size());
Eigen::ArrayXd SortSelectMap = SelectMap.transpose().reshaped(ValParam.Sizei*ValParam.Sizej,1);
Eigen::VectorXd XH0 = SortSelectMap(ArraySortSelectId);
Eigen::VectorXd EH = -WeightHH * XH0;
Eigen::VectorXd EDEH = ED + EH;

Eigen::SparseMatrix<double> UW = igl::cat(2, U, W);
Eigen::SparseMatrix<double> WT = W.transpose();
Eigen::SparseMatrix<double> WV = igl::cat(2, WT, V);
Eigen::SparseMatrix<double> II = igl::cat(1, UW, WV);
Eigen::VectorXd EE = igl::cat(1,EP,EDEH);
II.makeCompressed();
Eigen::initParallel();
Eigen::ConjugateGradient<Eigen::SparseMatrix<double>> solver;// or other method 
solver.compute(II);
Eigen::VectorXd Delta = solver.solve(EE);
问题回答

贵国的汇总表有多少? 如果是大的,你会更好地利用迭代的偿付器。 直接解决者具有很高的复杂性,最适合你们期望解决许多线性系统时,这种系统与相同的矩阵和不同的RHS矢量(例如,依赖时间线的PDEs)。

如果J是平方,那么J^TJ如果是不可扭转的,肯定是正面的(反过来说,如果J不是不可扭转的,A不是不可改变的)。 梯度法适合这种情况,应当非常快。 如果J是M <的MxN直径;N(未定的系统),则该栏没有自由,因此J角没有减到{0}。 因此,J^TJ肯定不会是积极的。 不过,你仍然可以尝试协调小组,但可以核实结果。 如果J与M >(N)纠缠在一起,你可能会试图尽量减少一种规范,即:Jx-b,与EEE = J^Tb, 以及Eigen的提议。 Eigen:LeastSquares Conjugate Gradient to resolution that without Constructioning J^TJ.

你们可以尝试预先确定,以加快迭代计划(并改善稳定)。 很可能是Eigen在盒子中提供。 否则,一个极其简单的计划就是要以学生的绝对价值为先决条件。

你们也可以尝试通常相当强大的全球机制。 尤其是如果你怀疑肯定的积极性。

作为最后说明,您可在上获得更好的uck。





相关问题
热门标签