简介 某些ODE集无法用解析法求解。在这种情况下,有很多众所周知的方法,尤其是在像MATLAB这样的典型科学软件中。只要您坚持使用,一切都很好。但是,如果您尝试将此功能移植到其他环境,则问题就开始了。就我而言,我在C#中需要它。
一些细节 当然,有一些ODE的C#库,但是在大多数情况下(至少在我所熟悉的情况下),它的功能非常有限。让我们看一下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
在上述情况下,lib似乎无效。在C ++中,我通过boost使用odeint库。我可以这样定义一个结构:
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));
问题
问题是, 除了解决严格的ode集外, 我还将为C#的哪个库提供此功能?由于ode集可能包含25个以上的方程+许多支持代数方程,因此性能非常重要。更具体地说- 我什至无法计算分析雅可比行列式,因为它在时间上不是恒定的,因此潜在求解器的选择受到限制。
您应该可以使用
var sol = Ode.RK547M(0, new Vector(5.0, 1.0), (t, u) => { double x=u[0], y=u[1]; double a=x*2+7, b=y*x+3; double c = additional_solve(b, x); return new Vector( x - x*y + a + c, -y +x*y + b ); });
作为lambda委托定义的长格式,即使用x => x*xshort表示x => { return x*x; },short表示delegate(x) { return x*x; }等等。
x => x*x
x => { return x*x; }
delegate(x) { return x*x; }