0

最近C++を使い始めたばかりで、ユーザー定義のodeのシステムの統合を可能にするクラスを作成しました。その性能を比較するために2つの異なるインテグレータを使用します。ここで、コードの一般的なレイアウトは、次のとおりodeのシステムを解決するためのC++数値積分器

class integrators { 
    private: 
     double ti; // initial time 
      double *xi; // initial solution 
      double tf; // end time 
      double dt; // time step 
      int  n; // number of ode's 

     public: 
      // Function prototypes 
      double f(double, double *, double *); // function to integrate 
      double rk4(int, double, double, double, double *, double *); 
      double dp8(int, double, double, double, double *, double *); 
     }; 

     // 4th Order Runge-Kutta function 
     double integrators::rk4(int n, double ti, double tf, double dt, double *xi, double *xf) { 
      // Function statements 
     } 

     // 8th Order Dormand-Prince function 
     double integrators::dp8(int n, double ti, double tf, double dt, double *xi, double *xf) { 
      // Function statements 
     } 

     // System of first order differential equations 
     double integrators::f(double t, double *x, double *dx) { 
      // Function statements 
     } 

     int main() { 
      // Initial conditions and time related parameters 
      const int n = 4; 
      double t0, tmax, dt; 
      double x0[n], xf[n]; 

      x0[0] = 0.0;       
      x0[1] = 0.0;       
      x0[2] = 1.0;    
      x0[3] = 2.0;    

      // Calling class integrators 
      integrators example01; 
      integrators example02; 

      // First integrator 
      example02.dp8(n, t0, tmax, dt, x0, xf); 

      // Second integrator 
      example01.rk4(n, t0, tmax, dt, x0, xf); 
     } 

問題である場合を除き、第1の積分を実行すると、私は第2の積分器に対して同じ初期条件を使用することはできません後にメイン、変化における初期条件X0を含む配列私は同じ初期条件(x0_rk4とx0_dp8)を持つ別の配列を定義します。両方のインテグレータでこの配列を使用するために、この配列を一定に保つより専門的な方法はありますか?

答えて

1

いいえ、実際はありません。あなたは根本的な配列にアクセスするためにx0_rk4.data()を使用する必要があります

std::array<double, n> x0_rk4 = { 0.0, 0.0, 1.0, 2.0 }; 
auto x0_dp8 = x0_rk4; // copy! 

:しかし、よりエレガントな解決策が存在します。 std::arrayなどの現代的なC++機能を生ポインタなどの代わりに使用すると良いでしょう。

+0

ありがとう@ Rakete1111!私は自分のC++の本を更新する必要があると思う。私が今までに持っていた問題は、数値メソッドに適用される新しいC++ブックを見つけることです。 – Leonel

2

最も簡単な方法は、インテグレーテイング関数内で配列のローカルコピーを作成することです。

'n'を関数に渡す方法を 'const int n'に変更すると、内部にdouble currentSolution[n];のようなものを作成し、初期配列から新しい配列に要素をコピーすることができます。このアプローチは、あなたがどこかで "偶然"修正しない限り、最初の配列をそのまま保存します。

このような事故の可能性を防ぐには、より深く、stlコンテナの1つを使用する必要があります。私はあなたがstd::valarray<T>とうまくいくと思います。

const std::valarray<double>&に渡す方法を変更し、再度非constローカルコピーを作成します。

+0

ありがとうございます!私は本当にベクトル、配列、およびvalarrayで作業を開始する必要があります – Leonel

関連する問題