Changeset View
Changeset View
Standalone View
Standalone View
kmplot/xparser.cpp
Show First 20 Lines • Show All 355 Lines • ▼ Show 20 Line(s) | 344 | { | |||
---|---|---|---|---|---|
356 | m_y_temp.combine( m_y, dx/2, m_k2 ); | 356 | m_y_temp.combine( m_y, dx/2, m_k2 ); | ||
357 | m_k3 = rk4_f( order, eq, x + dx/2, m_y_temp ); | 357 | m_k3 = rk4_f( order, eq, x + dx/2, m_y_temp ); | ||
358 | 358 | | |||
359 | m_y_temp.combine( m_y, dx, m_k3 ); | 359 | m_y_temp.combine( m_y, dx, m_k3 ); | ||
360 | m_k4 = rk4_f( order, eq, x + dx, m_y_temp ); | 360 | m_k4 = rk4_f( order, eq, x + dx, m_y_temp ); | ||
361 | 361 | | |||
362 | m_y.addRK4( dx, m_k1, m_k2, m_k3, m_k4 ); | 362 | m_y.addRK4( dx, m_k1, m_k2, m_k3, m_k4 ); | ||
363 | 363 | | |||
364 | if ( !std::isfinite(m_y[0]) ) | 364 | // The condition on the total accumulated error (O(dx^5)) should not be violated for rapidly increasing functions, e.g. e^x^2 | ||
365 | if ( !std::isfinite(m_y[0]) || qAbs((state->y[0]-m_y[0])*dx*dx) > 1) | ||||
365 | { | 366 | { | ||
366 | differentialFinite = false; | 367 | differentialFinite = false; | ||
367 | state->resetToInitial(); | 368 | state->resetToInitial(); | ||
368 | return 0; | 369 | return 1e200*((m_y[0] > 0) - (m_y[0] < 0)); | ||
369 | } | 370 | } | ||
370 | } | 371 | } | ||
371 | 372 | | |||
372 | state->x = x + dx; | 373 | state->x = x + dx; | ||
373 | state->y = m_y; | 374 | state->y = m_y; | ||
374 | 375 | | |||
375 | return m_y[0]; | 376 | return m_y[0]; | ||
376 | } | 377 | } | ||
▲ Show 20 Lines • Show All 449 Lines • Show Last 20 Lines |