微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Eigen中SparseLU的计算错误C++

如何解决Eigen中SparseLU的计算错误C++

最近我发现在某些情况下,SparseLU 求解器会得到错误的答案。

我在附件中举了一个例子,其中“A.csv”是方程Ax=b的系数矩阵,“b.csv”是方程的右边部分。

代码如下:

// solve the linear system: Ax = b
Eigen::VectorXd sparselu_x,pardisolu_x;
SparseLU<spmat> solver_splu;
PardisoLU<spmat> solver_pdslu;

// SparseLU results
solver_splu.compute(A);
sparselu_x = solver_splu.solve(b);

// PardisoLU results
solver_pdslu.compute(A);
pardisolu_x = solver_pdslu.solve(b);


// print some of the difference
cout << "sparselu results - pardisolu results (last 5 items):\n\n" << (sparselu_x - pardisolu_x).tail(5) << endl;

cout << "\n\n\n\nA*x - b (sparselu results,last 5 items):\n\n" << (A * sparselu_x - b).tail(5) << endl;
cout << "\n\n\n\nA*x - b (pardisolu results,last 5 items):\n\n" << (A * pardisolu_x - b).tail(5) << endl;

输出

sparselu results - pardisolu results (last 5 items):

 6.25516e-10
 6.36814e-08
-1.45986e-05
  -0.0170633
   -0.437249




A*x - b (sparselu results,last 5 items):

           0
 1.81899e-12
-1.81899e-12
     18.0459
     621.588




A*x - b (pardisolu results,last 5 items):

1.81899e-12
          0
          0
          0
          0

关于读取csv文件解决系统的完整数据和代码上传到:

https://github.com/cpc-tyym/SparseLU-eg

因为效率,我真的更喜欢sparselu求解器,但是这个错误让我选择了pardiso求解器,它比sparselu求解器慢3倍。那么谁能找出 sparselu 求解器是否在某个地方出错了,或者我在求解方程时是否犯了任何错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。