【问题标题】:Solving Lotka–Volterra equations with math.js用 math.js 求解 Lotka–Volterra 方程
【发布时间】:2017-11-19 00:09:58
【问题描述】:

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

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 来自火箭弹道示例:http://mathjs.org/examples/browser/rocket_trajectory_optimization.html.html

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);
}

但是,运行此代码时出现错误

函数 add 中的参数类型异常(预期:数字或复数或 BigNumber 或分数,实际:单位,索引:1)

这个错误的根源是什么?我错过了正确的单位吗?

感谢任何帮助。

【问题讨论】:

  • 控制台日志的内容是什么?您还可以记录表达式的其他操作数吗?测试/证伪的假设:x.get 如果一个数组作为参数给出,则返回一个数组。
  • @LutzL 控制台日志图片:snag.gy/J3aXUV.jpg
  • 我怀疑这是一个单元问题,因为我在实现中根本没有定义任何单元。
  • 如果我从 dt 中删除了“s”单元,似乎可以“工作”。
  • 是的,通常数字代码用于无单位问题。结果、单位、尺度、形状的解释发生在这些通用算法之外。有趣的是,“1 s”实际上被解析为单位。

标签: javascript differential-equations math.js


【解决方案1】:

解决方案:删除所有单位,如“s”、“m/s”等。要么这样,要么所有单位都必须匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2012-02-26
    • 2021-12-05
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多