Javascript 解决Lotka–;带math.js的Volterra方程
在math.js主页上有一个关于在math.js中求解微分方程的例子,但它相当复杂,没有为我个人提供足够的信息,无法将math.js应用于其他类似问题。所以,我想做的是解决这个问题。系统中有两个方程式: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"
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);
}