介绍
有些ODE集不能解析解在这种情况下,有很多众所周知的方法,特别是在典型的科学软件,如MATLAB中只要你坚持下去,一切都会好的。但如果您尝试将此功能移植到其他环境中,问题就开始了。在我的情况下,我需要它在C。
一些细节
当然,有一些C#LIB的奥德,但在大多数情况下(至少在这一点我很熟悉),有相当有限的让我们看看奥斯陆图书馆,这里有一个查询示例:

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++中,我用Booost使用ODENT库。我可以定义这样的结构:
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委托定义的长形式,即使用thatx => x*xx => { return x*x; }的缩写,它是delegate(x) { return x*x; }的缩写,依此类推。

关于c# - C#-解决复杂的ODE集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54609747/

10-12 16:41