我很擅长Python,但是我对C++和指针之类的东西很陌生。我试着用线性代数的特征包来写一些解ODE的代码(我以后需要处理很多矩阵,所以我计划从它开始)。我有以下RK4的代码,它们可以工作:
#include "../eigen-eigen-b3f3d4950030/Eigen/Dense"
using namespace Eigen;
VectorXd Func(const VectorXd& a)
{ // equations for solving simple harmonic oscillator
Vector2d ans;
ans(0) = a(1); // dy/dt
ans(1) = -a(0); // d2y/dt2
return ans;
}
MatrixXd RK4(VectorXd Func(const VectorXd& y), const Ref<const VectorXd>& y0, double h, int step_num)
{
MatrixXd y(step_num, y0.rows());
y.row(0) = y0;
for (int i=1; i<step_num; i++){
VectorXd y_old = y.row(i-1).transpose();
VectorXd k1 = h*Func(y_old);
VectorXd k2 = h*Func(y_old+k1/2);
VectorXd k3 = h*Func(y_old+k2/2);
VectorXd k4 = h*Func(y_old+k3);
VectorXd dy = (k1 + 2*k2 + 2*k3 + k4)/6;
y.row(i) = y.row(i-1) + dy.transpose();
}
return y;
}
int main()
{
Vector2d v1;
v1(0) = 1.4; v1(1) = -0.1;
double h = 0.1;
int step_num = 50;
MatrixXd sol = RK4(Func,v1,h,step_num);
return 0;
}
我有以下问题:
-
什么意思
&
在函数参数中?通过参考?我刚从
official documentation
,但我不太确定是否理解RK4函数参数中的每一位,比如
VectorXd Func(const VectorXd& y)
-
据我所知,我们不能从函数返回一个完整的2D数组,我们返回的只是数组的第一个元素(如果我错了,请纠正我)。那这个呢
Eigen::MatrixX
? 我们到底在传递/返回什么?矩阵的第一个元素,还是特征库定义的一个全新的对象?
-
谢谢