list<interval> split(interval const & i, unsigned n) { list<interval> ret; double lb = i.leftBound(); double const rb = i.rightBound(); double const width = rb - lb; double const step = width / n; for (unsigned i = 0; i < n - 1; i++) { ret.emplace_back(lb, lb + step); lb += step; } ret.emplace_back(lb, rb); return ret; }
void ode_solver::prune_trajectory(interval& time, IVector& e) { // Remove datapoints after time interval. auto ite = find_if (m_trajectory.begin(), m_trajectory.end(), [&time](pair<interval, IVector>& item) { return item.first.leftBound() > time.rightBound(); }); m_trajectory.erase(ite, m_trajectory.end()); // Update the datapoints in the time interval ite = find_if (m_trajectory.begin(), m_trajectory.end(), [&time](pair<interval, IVector>& item) { return item.first.leftBound()>= time.leftBound(); }); for_each(ite, m_trajectory.end(), [&e](pair<interval, IVector>& item) { intersection(item.second, e, item.second); }); }