Javascript 解决Lotka–;带math.js的Volterra方程

Javascript 解决Lotka–;带math.js的Volterra方程,javascript,differential-equations,math.js,Javascript,Differential Equations,Math.js,在math.js主页上有一个关于在math.js中求解微分方程的例子,但它相当复杂,没有为我个人提供足够的信息,无法将math.js应用于其他类似问题。所以,我想做的是解决这个问题。系统中有两个方程式: dx/dt = ax - bxy dy/dt = cxy - y 在math.js中遇到这个,我得到了 math.import({ndsolve:ndsolve}); const sim2 = math.parser(); sim2.eval("dxdt(x, y) = x - x * y"

在math.js主页上有一个关于在math.js中求解微分方程的例子,但它相当复杂,没有为我个人提供足够的信息,无法将math.js应用于其他类似问题。所以,我想做的是解决这个问题。系统中有两个方程式:

dx/dt = ax - bxy

dy/dt = cxy - y
在math.js中遇到这个,我得到了

math.import({ndsolve:ndsolve});
const sim2 = math.parser();
sim2.eval("dxdt(x, y) = x - x * y");
sim2.eval("dydt(x, y) = x * y - y");
sim2.eval("dt = 1.0 s");                // Simulation timestep
sim2.eval("x0 = 0");
sim2.eval("y0 = 0");
sim2.eval("tfinal = 100 s");          // Simulation duration
sim2.eval("result_stage1 = ndsolve([dxdt, dydt], [x0, y0], dt, tfinal)");
其中
ndsolve
来自火箭轨迹示例:

函数ndsolve(f,x0,dt,tmax){ var n=f.size()[0];//变量数 var x=x0.clone();//变量的当前值 var dxdt=[];//保存时间导数的临时变量 var result=[];//包含整个解决方案 var nsteps=math.divide(tmax,dt);//时间步数
对于(var i=0;i解决方案:删除所有单位,如“s”、“m/s”等。要么删除这些单位,要么所有单位都必须匹配。

控制台日志的内容是什么?能否也记录表达式的其他操作数?测试/证伪的假设:
x.get
如果数组作为参数给定,则返回一个数组。@LutzL控制台日志的Pic:我得到一个suspicion这是一个单位问题,因为我在我的实现中根本没有定义任何单位。如果我从dt中删除“s”单位,似乎“起作用”。是的,通常数字代码用于无单位问题。结果、单位、比例、形状的解释发生在这些通才算法之外。有趣的是,“1 s”实际上被解析为一个单元。
function ndsolve(f, x0, dt, tmax) {
    var n = f.size()[0];  // Number of variables
    var x = x0.clone();   // Current values of variables
    var dxdt = [];        // Temporary variable to hold time-derivatives
    var result = [];      // Contains entire solution

    var nsteps = math.divide(tmax, dt);   // Number of time steps
    for(var i=0; i<nsteps; i++) {
        // Compute derivatives
        for(var j=0; j<n; j++) {
            dxdt[j] = f.get([j]).apply(null, x.toArray());
        }
        // Euler method to compute next time step
        for(var j=0; j<n; j++) {
    console.log(x.get([j]));
    console.log(dt);
            x.set([j], math.add(x.get([j]), math.multiply(dxdt[j], dt)));
        }
        result.push(x.clone());
    }

    return math.matrix(result);
}