Введение Некоторые наборы ODE не могут быть решены аналитически.В этом случае существует множество хорошо известных методов, особенно в типичном научном программном обеспечении, таком как MATLAB.Пока вы остаетесь с этим, все в порядке.Но проблема начинается, если вы попытаетесь перенести эту функцию в другую среду.В моем случае мне это нужно в C #.
Некоторые детали Конечно, есть некоторые библиотеки C # для ODE, но в большинстве случаев (по крайней мере, в этом, с которым я знаком),Есть довольно ограничены.Давайте посмотрим на библиотеку OSLO, вот пример запроса:
var sol = Ode.RK547M(0, new Vector(5.0, 1.0),
(t, x) => new Vector(
x[0] - x[0] * x[1],
-x[1] + x[0] * x[1]));
Как вы можете видеть, она не позволяет предоставлять дополнительную поддержку не-OD уравнениям, ни встроенным алгоритмам.Это немного ограничено, если мы, например, должны решить настройку следующим образом:
a=x*2+7
b=y*x+3
c- need to be calculated with external algorithm basing and "b" and "x"
dx/dt=x - xy + a + c
dx/dt=-y +xy + b
В этом случае представленная выше библиотека кажется неэффективной.В C ++ я использую библиотеку odeint при помощи boost.Я могу определить структуру следующим образом:
struct solveODE
{
void operator()( const vector_type &y , vector_type &ODE , const double t )
{
double x=y[0];
double y=y[1];
a=x*2+7;
b=y*x+3;
additional_solve(b, x);
ODE[0]=x - xy + a + c;
ODE[1]=-y +xy + b;
}
};
И назвать ее так:
integrate_const(make_dense_output<stepper_type>( 1E-12, 1E-6 ),
solveODE(),
y, 0.0, t_end, dt ,
std::bind(&calc::printResults , std::ref(*this) , pl::_1 , pl::_2));
Проблема
Вопрос в том, какойбиблиотека для C # предоставит мне эту функциональность, в дополнение к решению жестких наборов од ?Производительность очень важна, так как набор од может содержать более 25 уравнений + множество вспомогательных алгебраических уравнений.Чтобы быть более конкретным - я не могу рассчитать даже аналитический якобиан, поскольку он не будет постоянным во времени, поэтому выбор потенциальных решателей ограничен.