2014-06-05 2 views
1

저는 화학 반응 네트워크를 통합하기 위해 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];

아무쪼록 고맙습니다.

+0

설정에 대해 더 많은 정보를 줄 수 있습니까? 예를 들어 어떤 스테퍼를 사용하십니까? 예를 들어, runge_kutta 스테퍼는 NaN을 제공해서는 안됩니다 (infintiy의 고정 소수점을 제외하고 :)). – headmyshoulder

+0

이 예제에서는 방금 단순한 통합 함수 인 integrate (system, x0, t0, t1, dt)를 사용했습니다. 문서에서는 "runge_kutta_dopri5를 기반으로 한 고밀도 출력 스테퍼"를 사용한다고합니다. –

+0

NaN에는 여러 가지 가능성이 있습니다. 그러나 runge_kutta4 스테퍼를 사용하면 RK4가 dopri5보다 우수하다는 의미는 아닙니다. integrate_const (runge_kutta4 (), system, x0, t0, t1, dt)와 같이 runge_kutta4에 시스템을 통합 할 수 있습니까? 어쩌면 r.h.s. 의 ODE가 큰 값으로 생성되어 시스템이 매우 빠르게 무한대로 이동합니다. – headmyshoulder

답변

1

어딘가에 단계 크기가 문제가 될 수 있습니다. 그래서 초기 단계 크기 dt를 10 배로 줄였습니다. 이제는 작동 중입니다. 어쩌면 초기 경사가 일부 종에겐 커야했을 것입니다. 답장을 보내 주셔서 감사합니다!

왜 당신이 대답으로 일 투쟁하고 그것을 stackoverflow에서 물어 마자 당신은 그것을 스스로 찾으십시오? : D

+0

비슷한 문제가 있지만 해결할 수 없습니다. 적응 형 스테퍼의 초기 (또는 최대 및 최소) 스텝 크기를 어떻게 변경합니까? – simmmons

3

잘 NaN를위한 몇 가지 이유가 있습니다

  • 부문 + 나누 x/0
  • 0으로 - 무한 (추가/자체에 무한대를 뺀 Infinity/Infinity
  • 곱셈 0 × (+- Infinity)
  • 자체는 예를 들어 Infinity - Infinity을)
  • Any operation with NaN 또한 NaN이됩니다.

그래서 위에서 언급 한 내용 중 일부가 코드에서 발생합니다. IEEE 754의 NaN은 모든 지수 비트가 1이지만 아직 가수 비트가 아닌 형태입니다. 선행 비트는 + 또는 - NaN을 나타냅니다.

+1

나는 + - 무한대 *로 곱셈을 할 것입니다 ... ... – NirMH

+0

고마워요. 어떤 종이라도 모든 종류의 값이 약 10이되는 Infinity를 얻을 수있는 방법을 알지 못합니다.그러나 나는 시스템을 다시 한번 점검 할 것이다. –

+0

@ Andro47 Division ofof Infinity_ by + -Infinity는 NaN으로 나타납니다. + 유한 한 숫자로 나누면 각각 +0.0을 얻게됩니다. – Archie

관련 문제