1 # ifndef CPPAD_UTILITY_ODE_GEAR_HPP
2 # define CPPAD_UTILITY_ODE_GEAR_HPP
366 template <
typename Vector,
typename Fun>
381 CheckNumericType<Scalar>();
384 CheckSimpleVector<Scalar, Vector>();
388 "OdeGear: m is less than one"
392 "OdeGear: n is equal to zero"
395 size_t(T.size()) >= (m+1),
396 "OdeGear: size of T is not greater than or equal (m+1)"
399 size_t(X.size()) >= (m+1) * n,
400 "OdeGear: size of X is not greater than or equal (m+1) * n"
404 "OdeGear: the array T is not monotone increasing"
423 for(k = 0; k < m; k++)
424 alpha[m] += one / (T[m] - T[k]);
427 beta[m-1] = one / (T[m-1] - T[m]);
428 for(k = 0; k < m-1; k++)
429 beta[m-1] += one / (T[m-1] - T[k]);
433 for(j = 0; j < m; j++)
435 alpha[j] = one / (T[j] - T[m]);
436 for(k = 0; k < m; k++)
438 { alpha[j] *= (T[m] - T[k]);
439 alpha[j] /= (T[j] - T[k]);
445 for(j = 0; j <= m; j++)
448 beta[j] = one / (T[j] - T[m-1]);
449 for(k = 0; k <= m; k++)
450 {
if( k != j && k != m-1 )
451 { beta[j] *= (T[m-1] - T[k]);
452 beta[j] /= (T[j] - T[k]);
459 for(i = 0; i < n; i++)
460 x_m[i] = X[(m-1) * n + i];
461 F.Ode(T[m-1], x_m, f);
464 for(i = 0; i < n; i++)
466 for(j = 0; j < m; j++)
467 x_m[i] -= beta[j] * X[j * n + i];
473 F.Ode_dep(T[m], x_m, f_x);
476 for(i = 0; i < n; i++)
477 {
for(j = 0; j < n; j++)
478 A[i * n + j] = - f_x[i * n + j];
479 A[i * n + i] += alpha[m];
490 "OdeGear: step size is to large"
494 for(k = 0; k < 3; k++)
500 for(i = 0; i < n; i++)
502 for(j = 0; j < n; j++)
503 b[i] -= f_x[i * n + j] * x_m[j];
504 for(j = 0; j < m; j++)
505 b[i] -= alpha[j] * X[ j * n + i ];
512 for(i = 0; i < n; i++)
513 { X[m * n + i] = x_m[i];
514 e[i] = x_m[i] - x_m0[i];
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution.
void OdeGear(Fun &F, size_t m, size_t n, const Vector &T, Vector &X, Vector &e)
Define the CppAD error checking macros (all of which begin with CPPAD_ASSERT_)
void LuInvert(const SizeVector &ip, const SizeVector &jp, const FloatVector &LU, FloatVector &B)
int LuFactor(SizeVector &ip, SizeVector &jp, FloatVector &LU)
std::complex< double > sign(const std::complex< double > &x)
File used to define CppAD::vector and CppAD::vectorBool.