Не могу использовать неявный решатель из OdeInt правильно в Xcode 7.3.1
Мне нужно решить некоторые жесткие обыкновенные дифференциальные уравнения, поэтому я узнал о неявных методах, которые предоставляет Odeint. Однако, когда я копирую и соблюдаю в Xcode пример в документации Odeint, http://headmyshoulder.github.io/odeint-v2/doc/boost_numeric_odeint/tutorial/stiff_systems.html (полный пример см. По ссылке "stiff_system".cpp "в нижней части страницы), для неявного метода rosenbrock4 требуется около 40030 шагов для интеграции вместо 71, как утверждается в документации. Напротив, для метода runge_kutta_dopri5, который также применяется в примере для сравнения, я получаю ровно 1531 шаг, как в документации. Соответственно, неявный метод, конечно, требует гораздо больше времени для вычислений, чем метод runga_kutta, хотя пример должен продемонстрировать преимущество неявных методов над явными для этого особого случая жесткой задачи. Теперь, если я скомпилирую код на другом компьютере с использованием компилятора g++, я получу почти точный результат, а именно 74 шага для неявного метода, что очень близко к 71 предложенному в документации, но все еще не точному.
Кто-нибудь может объяснить, почему неявный метод не работает должным образом с Xcode 7.3.1 и что можно сделать, чтобы использовать его в Xcode назначенным способом?
1 ответ
Итак, после некоторого разочаровывающего поиска, чтобы заставить odeint делать то, что он должен делать, я обнаружил, что все работает нормально, когда вы используете версию 1.59 библиотеки boost (содержащей odeint). Описанная проблема с методом rosenbrock4, по-видимому, существует только для более поздних версий 1.60 - 1.62. Таким образом, это определенно кажется проблемой с библиотекой, а не с xcode. Я сообщу об этой проблеме в odeint. В то же время, если вы столкнулись с той же проблемой, вы можете просто скачать boost 1.59, с которым все работает нормально.