问题标签 [differential-equations]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5192 浏览

python - 在 Python 中使用 odeint() 进行的摆锤模拟不太像摆锤一样工作

我已经使用四阶龙格-库塔微分建立了一个钟摆模拟,其中一切都是一步一步完成的:

这很好用,但我不觉得优雅,这就是为什么我决定使用 odeint() 函数重写它:

而这个新版本看起来一点也不像钟摆。谁能告诉我我做错了什么?

0 投票
1 回答
1128 浏览

matlab - 使用 ode45 时获得意外结果

我试图通过在 Matlab 中编写代码来解决微分方程组。我在这个论坛上发帖,希望有人能以某种方式帮助我。我有一个由 10 个耦合微分方程组成的系统。它是一种载体-宿主流行病模型,它捕捉了一种疾病在人群和昆虫种群之间的传播。由于它是一个简单的微分方程系统,因此我将求解器 ( ode45) 用于非刚性问题类型。

有 10 个微分方程,每个代表 10 个不同的状态变量。有两个函数具有相同的 10 个耦合 ODE 系统。一个被称为NoEffects_derivative_6_15_2012.m包含 ODE 的原始系统。调用另一个函数,OnlyLethal_derivative_6_15_2012.m它包含相同的 ODE 系统,从时间开始,提款率增加gamma=32 %days,提款率随时间呈指数衰减。

我使用ode45相同的初始条件来解决这两个系统。两个系统的时间向量也是相同的,从t0tfinal。该向量tspan包含从t0到的时间值tfinal,每个增量为 0.25 天,总共有 157 个时间值。

解值存储在矩阵ye0yeL中。这两个矩阵都包含 157 行和 10 列(对于 10 个状态变量值)。当我比较第 10 个状态变量的值时,对于time=tfinal矩阵中的ye0,并yeL通过绘制差异,我发现它在某些时间值内变为负数。(使用命令:)plot(te0,ye0(:,10)-yeL(:,10))。这不是预期的。t0对于从until开始的所有时间值tfinal,状态变量 10 的值应该更大,因为它是从 ODE 系统获得的解决方案,它没有应用增加的提款率。

我被告知我的 matlab 代码中有一个错误。我不确定如何找出那个错误。或者我正在使用的 matlab 中的求解器 ( ode45) 效率不高,确实会出现这种问题。任何人都可以帮忙。

我也尝试过ode23ode113但遇到了同样的问题。图 (2) 显示了一条曲线,该曲线对于时间值 32 和 34 变为负数,这表明了一个未预期的结果。对于所有时间值,该曲线应始终具有正值。还有其他任何人可以建议的论坛吗?

这是主要的脚本文件:

函数文件:NoEffects_derivative_6_15_2012

函数文件:OnlyLethal_derivative_6_15_2012

函数文件:artificialdeathrate1

函数文件:iOFt

函数文件:oOFt

0 投票
1 回答
295 浏览

matlab - 常微分方程表示中的错误

更新 我试图找到链接LE中给出的 Lyapunov 指数。我试图通过为我的案例采用以下 eqs 来弄清楚并理解它。这些是一组常微分方程(这些仅用于测试如何使用 cos 和 sin 作为 ODE)

x=X(1); y=X(2); cos(y)=X(3);

f1 表示dx/dt;f2dy/dt和 f3 在这种情况下是-10sinx. 但是,当表示为 x=X(1);y=X(2);时,我不确定如何表示 cos。这只是一个试验示例,我这样做是为了了解如何处理我们有cos,sin 等术语作为另一个变量的函数。

使用 ode45 求解这些方程时

它引发以下错误

???尝试访问 (2);index 必须是正整数或逻辑整数。

  1. 我的代表x=X(1); y=X(2); cos(y)=X(3);还好吗?
  2. 如何解决错误?谢谢
0 投票
1 回答
1896 浏览

genetic-algorithm - matlab ode15s 在 GA 中调用时不起作用

我有一个套管的数学(参数)模型。模型的输入是位移(正弦波),以力为输出(在各个时间步长)。

模型的参数将使用 GA 进行识别,力方程将使用 ode15s 求解器求解。

当假设一组参数(不使用 GA)时,求解器给出输出,但是当从 GA 调用时,我得到以下错误n次数:

警告:矩阵是奇异的,接近奇异的或严重缩放的。结果可能不准确。RCOND = NaN。

最后

警告:在 t=1.570796e+000 时失败。如果不将步长减小到低于时间 t 允许的最小值 (3.552714e-015),则无法满足积分容差。

我有点困惑,因为代码在不使用 GA 而不是 GA 的情况下可以正常工作。我将非常感谢您的投入。

提前非常感谢。

代码:主调用

GA_test 函数:

my_force_Curve计算单个模型的力:

differential_BW解方程:

抱歉,如果它太长了。

再次感谢。

0 投票
4 回答
14599 浏览

python - 通过 Scipy 和 Numpy 使用 Python 将数据拟合到 ODE 系统

我在通过 Scipy 和 Numpy 将我的 MATLAB 代码翻译成 Python 时遇到了一些麻烦。我被困在如何为我的 ODE 系统找到最佳参数值(k0 和 k1)以适应我观察到的十个数据点。我目前对 k0 和 k1 有一个初步的猜测。在 MATLAB 中,我可以使用名为“fminsearch”的函数,该函数采用 ODE 系统、观察到的数据点和 ODE 系统的初始值。然后它将计算一对新的参数 k0 和 k1 将适合观察到的数据。我已经包含了我的代码,看看您是否可以帮助我实现某种“fminsearch”来找到适合我的数据的最佳参数值 k0 和 k1。我想将任何代码添加到我的 lsqtest.py 文件中。

我有三个 .py 文件 - ode.py、lsq.py 和 lsqtest.py

ode.py:

lsq.py:

lsqtest.py:

0 投票
1 回答
307 浏览

python - 将数据拟合到 ODE 系统 - 使用带有 Scipy/Numpy/Python 的 lambda 函数键入错误

运行代码时出现以下错误:

类型错误:lambda() 正好需要 4 个参数(给定 3 个)

这是我的代码 - 我的错误来自我试图实现 Scipy 优化算法的最后一行代码(我认为)fmin

0 投票
1 回答
1597 浏览

matlab - 在matlab中求解两个耦合二阶微分方程的错误

我正在尝试在 matlab 上求解以下微分方程。(它们是从 yang-mills-higgs 拉格朗日方程中获得的 hoofy polyakov 单极子 ansatz 的方程)。这是我的函数文件。我有两个变量 h 和 k 以及它们对变量 t 的导数。我的 x(1)=h,x(2)=k,x(3)=dh\dt,x(4)=dk\dt。所有函数的初始值为 0。

现在,当我运行以下代码 >

我什么也得不到。图形窗口出现,但它不包含任何内容。这个方程应该有解。虚线是应该得到的曲线,从 1 开始是 k,从 0 开始是 h。

在此处输入图像描述

我的错误是什么?

0 投票
0 回答
332 浏览

probability - Fokker-Planck:两个方向的对流

我正在尝试模拟 Fokker-Planck 过程,其中粒子在方向 A 上移动时间的一小部分 x 和方向 B 上(1-x)。我如何设置方程?或者我是否有可能解决两个福克-普朗克方程,一个用于每个平流分量,然后将每个方程的乘积与其对应的分数相加?

0 投票
1 回答
1224 浏览

random - 如何在 Mathematica 中求解具有随机系数的线性微分方程

我有一个差分系统,比如

dx/dt = A x(t) + B y(t)

dy/dt = C x(t) + D y(t)

其中 A、B、C 和 D 是实常数。现在我需要探索系统的行为,如果 A 不是一个常数,而是一个均匀分布在给定范围之间的随机数。我只需要定性检查。我没有随机积分的背景,因此我不知道这是否真的与 Ito 积分有关(以及这个问题https://mathematica.stackexchange.com/questions/3141/how-can-you-compute-it -integrals-with-mathematica)。无论如何,我不知道如何求解这个微分方程。

非常感谢任何指导。

0 投票
1 回答
422 浏览

python - Python:使用 odeint 实现阈值模型

我正在处理的问题(所示示例高度简化)似乎是一个常见问题,但我还没有找到解决方案。我有三种不同的反应,v1、v2 和 v3,定义如下:

v1:R <-> A + C;v1 = k1*(R - A*C/5000.)

v2:R <-> B + C;v2 = k2*(R - B*C/5000.)

v3:A + B -> P;v3 = k3*A*B

使用资源 R,前两个反应分别产生 A 和 C 以及 B 和 C,而第三个反应将 A 和 B 转换为产物 P(k1、k2、k3 是常数,这里它们设置为 1)。

只有当 C 超过称为 Cthr(此处:Cthr = 25)的某个阈值时才会发生第三个反应,否则 v3 为 0。因此想法是 C 积累,然后一旦达到一定浓度,就会产生产品 P。

我实现如下:

模拟的输出如下所示:http: //i50.tinypic.com/apdvkj.png

所以显然它在第一次达到阈值之前一直有效(v3 为 0,不产生 P)但之后 C 未设置为 0,我不知道为什么。
我想得到的是:C一直产生到阈值,下降到0,再次产生,下降到0等等,看起来像一个锯齿波。
P 的时间过程应该看起来像楼梯(仅在超过 Cthr 时产生)。

有谁知道我必须做什么才能将 C 设置回 0 并接收预期的输出?非常感谢!