C#-解决复杂的ODE集

时间:2019-02-09 19:09:12

标签: c# .net algorithm numerical-methods ode

简介 某些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));

问题

问题是,除了解决僵化的颂歌集之外,我还将为哪个C#库提供此功能?由于ode集可能包含25个以上的方程+许多支持代数方程,因此性能非常重要。更具体地说-由于时间不是恒定的,我什至无法计算解析雅可比行列式,因此潜在求解器的选择受到限制。

1 个答案:

答案 0 :(得分:0)

您应该可以使用

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*x代表x => { return x*x; },而delegate(x) { return x*x; }则以此类推。依此类推。