大规模开源线性代数求解器(Eigen,LAPACK,Ceres)+JSim数值解算器+Plot Digitizer

2021-12-08 20:02:31 浏览数 (1)

看见一个招聘的要求,说有这个的经验最好。就搜索了一下。

代码语言:javascript复制
https://eigen.tuxfamily.org/index.php?title=Main_Page

一个C 的计算矩阵的库

代码语言:javascript复制
#include <iostream>
#include <Eigen/Dense>

using Eigen::MatrixXd;

int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0)   m(0,1);
  std::cout << m << std::endl;
}

没有什么依赖的库,就是标准库

代码语言:javascript复制
https://eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html

这是他的长篇教程

代码语言:javascript复制
http://www.netlib.org/lapack/

LAPACK 是用 Fortran 90 编写的,提供用于求解联立线性方程组、线性方程组的最小二乘解、特征值问题和奇异值问题的例程。还提供了相关的矩阵分解(LU、Cholesky、QR、SVD、Schur、广义 Schur),以及相关计算,例如 Schur 分解的重新排序和估计条件数。处理密集矩阵和带状矩阵,但不处理一般稀疏矩阵。在所有领域,都为单精度和双精度实数和复数矩阵提供了类似的功能。

LAPACK 项目的最初目标是使广泛使用的 EISPACK 和 LINPACK 库在共享内存向量和并行处理器上高效运行。在这些机器上,LINPACK 和 EISPACK 效率低下,因为它们的内存访问模式不考虑机器的多层内存层次结构,从而花费太多时间移动数据而不是进行有用的浮点运算。LAPACK 通过重新组织算法以在最内层循环中使用块矩阵运算(例如矩阵乘法)来解决此问题。这些块操作可以针对每个架构进行优化,以考虑内存层次结构,从而提供一种可移植的方式来在不同的现代机器上实现高效率。我们使用术语“便携式”而不是“便携式”,因为,编写 LAPACK 例程,以便通过调用基本线性代数子程序 (BLAS) 来执行尽可能多的计算。LAPACK 一开始就被设计为利用 Level 3 BLAS——一组 Fortran 子程序的规范,用于执行各种类型的矩阵乘法和具有多个右手边的三角系统的解决方案。由于 3 级 BLAS 操作的粗粒度,它们的使用提高了许多高性能计算机的效率,特别是如果制造商提供了特殊编码的实现。

BLAS 的高效机器特定实现可用于许多现代高性能计算机。有关已知供应商或 ISV 提供的 BLAS 的详细信息,请参阅 BLAS 常见问题解答。或者,用户可以下载 ATLAS 以自动为架构生成优化的 BLAS 库。BLAS 的 Fortran 77 参考实现可从 netlib 获得;但是,不鼓励使用它,因为它的性能不如经过专门调整的实现。

但是吧,太复杂了。

代码语言:javascript复制
http://www.netlib.org/lapack/lug/node3.html

给了一本书的地址,可以看看。

代码语言:javascript复制
http://ceres-solver.org/

Google的计算库,看起来不错,名字叫做谷神星

反正挺多的

代码语言:javascript复制
https://github.com/ceres-solver/ceres-solver

开源地址在此。

其实对于我这种数值算法爱好者来说,这些库真是再好不过的学习资源了。

对了,看论文的时候看到一个有趣的东西。是一个Java的数值计算包

代码语言:javascript复制
https://www.physiome.org/

文章就是这样写的

代码语言:javascript复制
https://www.physiome.org/jsim/docs/MML_Matlab.html
代码语言:javascript复制
// Example for MML to Matlab translation
import nsrunit; 
unit conversion on;

math mml2matlab {
   realDomain t sec; t.min=0; t.max=1; t.delta=0.01;
   real C(t) mM;
   real k =1 sec^(-1);
   when(t=t.min) C=1;
   C:t = -k*C; 
}

我们写的仿真程序

代码语言:javascript复制
options = odeset('RelTol',1e-12,'AbsTol',1e-9);
[t x rInfo] = mytest( linspace(0,1,101),@ode23,options);
clf;
plot(t,x,'k')
title('Exponential Decay')
xlabel('Time, sec')
ylabel('Concentration, mM')
代码语言:javascript复制
http://plotdigitizer.sourceforge.net

Plot Digitizer 是一个 Java 程序,用于数字化功能数据的扫描图。在报告和参考文献中,数据通常以功能 XY 型散点图或折线图的形式呈现。为了使用这些数据,必须以某种方式将其数字化。该程序将允许您获取绘图的扫描图像(GIF、JPEG 或 PNG 格式),只需在每个数据点上单击鼠标即可快速将绘图中的值数字化。然后可以将这些数字保存到文本文件中,并在您需要的任何地方使用。Plot Digitizer 适用于线性和对数轴刻度。除了数字化数据图中的点外,该程序还可用于数字化其他类型的扫描数据(例如缩放绘图或正字照片)。

0 人点赞