저는 화학 반응 네트워크를 통합하기 위해 C++ boost/odeint를 사용하고 있습니다. 모든 반응은 일부 반응을 제거 할 때를 제외하고는 잘 작동합니다. 그렇다면 가끔 출력물에 nan이 있습니다. 여기 출력의 작은 부분입니다. 첫 번째 열은 시간이고 다른 열은 종의 농도입니다.C++ odeint output "not a number"
0.0 2.8701 3.4354 3.48348 4.30509 5.43538 5.35687 2.9138 5.31905 3.51382 0.0268472 -nan 2.93435 -nan -nan -nan -nan 2.9138 -nan -nan 0.0695729 -nan 2.28324 -nan -nan -nan -nan 2.9138 -nan -nan 0.112299 -nan 1.77661 -nan -nan -nan -nan 2.9138 -nan -nan 0.155024 -nan 1.3824 -nan -nan -nan -nan 2.9138 -nan -nan 0.19939 -nan 1.06535 -nan -nan -nan -nan 2.9138 -nan -nan
제 종은 그 자체에 따라 상기 7 종은 일정하다.
제 질문은 : odeint는 언제 출력으로 -nan을 부여합니까? 어딘가에 0/0 디비전이있을 수 있지만 모든 방정식에는 제품 만 포함되어 있습니다.
dxdt [5] = - (C) [2] * X [5] + C [3] * X [9] * X [3];
아무쪼록 고맙습니다.
설정에 대해 더 많은 정보를 줄 수 있습니까? 예를 들어 어떤 스테퍼를 사용하십니까? 예를 들어, runge_kutta 스테퍼는 NaN을 제공해서는 안됩니다 (infintiy의 고정 소수점을 제외하고 :)). – headmyshoulder
이 예제에서는 방금 단순한 통합 함수 인 integrate (system, x0, t0, t1, dt)를 사용했습니다. 문서에서는 "runge_kutta_dopri5를 기반으로 한 고밀도 출력 스테퍼"를 사용한다고합니다. –
NaN에는 여러 가지 가능성이 있습니다. 그러나 runge_kutta4 스테퍼를 사용하면 RK4가 dopri5보다 우수하다는 의미는 아닙니다. integrate_const (runge_kutta4(), system, x0, t0, t1, dt)와 같이 runge_kutta4에 시스템을 통합 할 수 있습니까? 어쩌면 r.h.s. 의 ODE가 큰 값으로 생성되어 시스템이 매우 빠르게 무한대로 이동합니다. –
headmyshoulder