代码之家  ›  专栏  ›  技术社区  ›  Physicist

带特征的函数指针

  •  0
  • Physicist  · 技术社区  · 6 年前

    我很擅长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;
    }
    

    我有以下问题:

    1. 什么意思 & 在函数参数中?通过参考?我刚从 official documentation ,但我不太确定是否理解RK4函数参数中的每一位,比如 VectorXd Func(const VectorXd& y)

    2. 据我所知,我们不能从函数返回一个完整的2D数组,我们返回的只是数组的第一个元素(如果我错了,请纠正我)。那这个呢 Eigen::MatrixX ? 我们到底在传递/返回什么?矩阵的第一个元素,还是特征库定义的一个全新的对象?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   Markus Mayr    6 年前
    1. 对, & 是按引用传递的;后者是用于传递函数的语法,该函数按引用获取向量并返回向量。一个 Eigen::Matrix std::function .
    2. 不能有多个返回参数,但可以返回 pair tuple 或者 Matrix RK4 返回整个矩阵。
    3. 代码相当有效。如果它真的是性能关键,可能有一些事情可以优化,但我现在不会担心。

      最大的问题是 RK4号 VectorXf Vector2d ). 但这将要求您为所有感兴趣的维度创建一个专门的版本,或者让编译器使用模板为您执行此操作。

    一般来说:读一本好书开始。