0

최근에 C++을 사용하기 시작했고 사용자 정의 된 ode 's 시스템의 통합을 허용하는 클래스를 만들었습니다. 성능을 비교하기 위해 두 개의 서로 다른 통합자를 사용합니다. 여기서, 코드의 일반 레이아웃은 :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); 
     } 

문제하다 않는 제 적분기를 실행하고 I 번째 적분기 동일한 초기 조건을 사용할 수 후 주요 변화의 초기 조건 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 컨테이너 중 하나를 사용해야합니다. 나는 당신이 std::valarray<T>으로 괜찮을 것이라고 생각합니다.

전달 방법을 const std::valarray<double>&으로 변경하고 다시 const가 아닌 로컬 복사본을 만듭니다.

+0

대단히 고마워요! 정말 벡터, 배열 및 valarray 작업을 시작해야합니다. – Leonel

관련 문제