问题标签 [odeint]
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.
python - 带有带状雅可比矩阵的 Scipy odeint
我正在使用 SciPy 的集成.odeint 函数集成一个僵硬的 ODE 系统。由于集成非常重要且耗时,我也在使用相应的 jacobian。通过重新排列方程,我可以将雅可比定义为带状矩阵。按照API 文档,我想用mu和ml参数定义形状。不幸的是,文档有点模棱两可,所以我无法弄清楚如何实现我的 jacobian 函数。
为了验证必须如何调用 odeint,我一直在使用以下(有点傻)代码:
使用完整的 NxN 雅可比矩阵,集成成功。仅使用对角线和mu=0和ml=0积分也成功。
为了测试带状矩阵用例,我正在使用mu=1和ml=1创建一个人工 3xN 带状雅可比矩阵,其中对角线之外的所有导数都为零。这会导致求解器出现奇怪的行为(类似于我在原始问题中看到的非对角线非零)。
将带状雅可比选项与 SciPy 的集成 odeint 一起使用的正确方法是什么?
c++ - odeint 禁止负值
我有一个使用“odeint”模拟种群动态的程序。我想设置一个 if 条件来禁止我的 ode 的结果为负。这是我的代码的摘要:
...
如所写,以下循环是无用的:
你对程序有足够的了解吗?你知道我怎样才能让它工作吗?
谢谢 !
集成自适应的代码
scipy - 如何使用 scipy odeint 获得多种解决方案?
我正在学习如何使用odeint
inScipy
来解决 ODE。现在我正在尝试用半无限势阱求解薛定谔方程:
所以确切的解决方案应该是
我在 x<0 区域(给定)中设置了一个起点f(x0),f'(x0),x0<0
,但我获得的解决方案始终是 x>0 区域中的 exp(x)。但是 exp(-x) 在物理学中更有意义。如何通过使用获得此解决方案odeint
?
python - 使用 Scipy/Numpy-NDSolve 等效求解 Python 中的矩阵微分方程?
我有两个 numpy 数组:9x9 和 9x1。我想在离散时间点求解微分方程,但无法让 ODEInt 工作。我不确定我是否在做正确的事情。
使用 Mathematica,方程为:
其中 Ab 是 9x9 矩阵,A0 是 9x1 矩阵(初始)。在这里,我解决了时间和生活是美好的。
在 Python 实现中,我有以下代码,它给了我错误的答案:
输出是:
但正确的答案应该是:
谁能指出我可能做错了什么?
python - 在 PYTHON 中求解矩阵耦合微分方程时如何绘制特征值?
假设我们有三个复数矩阵和一个带有这些矩阵的耦合微分方程系统。
我基本上有两个问题:
如何减少我的代码?通过减少我的意思是,有没有办法通过不单独写下所有组件来做到这一点,而是在解决 ODE 系统时处理矩阵?
我如何绘制特征值(绝对值)(假设矩阵 A 的特征值的绝对值作为 t 的函数),而不是相对于t(我的代码的最后 2 行)绘制矩阵的元素?
thrust - 使用嵌套的 zip_iterators 时,odeint 推力会大大减慢
我正在 odeint 和推力之上构建一个分析工具。该工具解决了大量的初始条件问题。我在 odeint 和推力教程/演示之后取得了成功。到目前为止,我一直在使用的系统只有不到 5 个状态变量,但现在我需要扩展系统以能够处理更多。
正如教程中提到的,有一个小问题,thrust 的元组最多只能有 10 个项目。这个问题可以通过使用嵌套的 zip_iterators 来解决。
从其中一个教程的底部附近引用:
“Thrust 元组的最大元数为 10 是一个小问题。但这只是一个小问题,因为我们可以创建一个包含 zip 迭代器的 zip 迭代器。因此,顶级 zip 迭代器包含一个用于状态的 zip 迭代器,一个普通迭代器用于参数,一个 zip 迭代器用于导数。”
我已经实现了这个解决方案,它可以工作,但不幸的是速度大大降低。对于同一个系统(一个双变量系统,同时求解 8192 个初始条件),最初的、简单但不可扩展为超过 5 个变量的解决方案只需要一秒钟多一点的时间:
而更复杂但可扩展的嵌套解决方案需要大约 2000 倍的时间!
这两个程序之间的唯一区别是
在仿函数的内部
operator()
,我指的是状态变量和导数,以及在仿函数的构造函数中,特别是
for_each
在我创建 zip_iterators 和元组的命令中。
下面我为每个程序摘录了这些部分的摘录。我希望我在这里做错了什么,因为这种速度损失是毁灭性的!任何帮助将非常感激。
“简单”代码的摘录(非嵌套迭代器)
“EXTENSIBLE”代码(嵌套迭代器)的摘录
c++ - 安装 odeint 时出错
我正在尝试安装odeint
,但每次编译代码时,都会出现此错误。
我已经包含了包含路径。我检查了这个文件boost/config.hpp
,这不是一个完整的路径<config.hpp>
,所以我把它改成了<boost/numeric/odeint/config.hpp>
. 现在,我在相同情况下的其他文件出现错误。有没有办法解决这个问题?
python - 同步两组微分方程
我正在使用 Python odeint 来同步两组洛伦兹方程。我正在获取一个系统 (Xi) 的 X 值并使用它来驱动第二个系统,因此第二个系统的 X 值 (Xr) 将与第一个系统同步,这非常有效。当噪声被添加到第一个系统的 X 值的输出时,我想尝试测试同步性的限制。当我在方程中添加一个高斯随机数时,我收到以下错误,在这个调用上完成了额外的工作(可能是错误的 Dfun 类型)。以 full_output = 1 运行以获取定量信息。
如何向 Xi 添加噪声,以使 Xr 的解开始偏离 Xi?
这是代码:
c++ - odeint 的 runge_kutta4 与 Matlab 的 ode45 对比
我想使用odeint C++ 库runge_kutta4
中的方法。我已经在 Matlab 中解决了这个问题。我在 Matlab中用初始值求解的以下代码如下x'' = -x - g*x'
x1 = 1
x2 = 0
main.m
ODESolver.m
我已经安装了 odeint 库。我的使用代码runge_kutta4
如下
结果如下图
我的问题是为什么结果会有所不同?我的 C++ 代码有问题吗?
这些是这两种方法的第一个值
更新:
问题是我忘记在我的 C++ 代码中包含初始值。感谢@horchler 注意到它。在包含正确的值并runge_kutta_dopri5
按照@horchler 的建议使用后,结果是
我更新了代码以反映这些修改。
python - 重写 python scipy.integrate.odeint 以模仿 matlab ode15s
我是 python 新手,想模仿在 python 中使用 matlab ode15s 而不是 scipy 的内置 odeint。
代码最初是这样写的:
其中 PSP 定义为:
通过阅读 scipy.integrate.odeint() 上的说明,此函数采用以下格式的参数:
这意味着func=PSP, y0=Rphi, t=t, args=(b,k,f)
So Rphi 进入 PSP 函数,并被整合并成为 yy 并出来,并且该函数对 t 的每个元素重复执行此操作。
现在我想把它翻译成可以模仿 matlab 中的 ode15s 的东西。通过阅读其他一些踏板,我发现我可以使用
现在问题变成了,我如何将原始参数传递给这个积分器?
我想它可能看起来像这样:
我知道 f 是我的 PSP 函数,y0 仍然是相同的:Rphi,这是我的问题:
- t0 的初始值是多少,是否只是 t[0]?
- 如何将变量 (b,k,f) 传递给函数 f=PSP?
- 当我调用这个 ode15s 时,如何通过 t 的向量大小进行积分并收集 yy 的最终值?
任何帮助将不胜感激。谢谢你。