问题标签 [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.

0 投票
2 回答
1668 浏览

c++ - 函数调用缺少参数列表

我正在尝试odeint在一个类中使用(即用于求解微分方程的库),但我不能。我真的需要把它放在一个类中,这样我就可以控制我的项目。这是我得到的错误error C3867: 'robot::sys': function call missing argument list; use '&robot::sys' to create a pointer to member

这是我的代码

当我尝试错误消息中建议的解决方案时,我收到另一个错误,即

....\odeint\stepper\base\explicit_error_stepper_fsal_base.hpp(279): error C2064: term does not evaluate to a function taking 3 arguments

0 投票
1 回答
1042 浏览

odeint - python:满足条件时中断odeint

我正在使用 scipy.integrate 包中的 odeint 函数:

r0 是一个 numpy 数组,其中包含一定数量的点的初始位置。正如预期的那样,在脚本结束时,我得到了 20 个时间步长的点位置。

现在我想在满足 r 的条件时停止 odeint 求解器。特别是当其中 2 个点比某个阈值更接近时,我想停止 odeint,对 r 向量进行一些更改,并使用新的初始位置继续 odeint 求解器。有没有办法实现这个?

我一直在考虑的一个可能的解决方案是将 odeint 运行到最后,然后再检查是否满足条件,但这当然不是很有效。

谢谢大家的帮助,尼古拉

0 投票
1 回答
1358 浏览

scipy - 在 python 中遇到 ODEINT 问题

我对 Python 比较陌生,并试图用它来求解二阶非线性微分方程,特别是电解质中的 Poisson-Boltzmann 方程。

本质上,它描述了在电解质中远离带电表面的静电势 (phi) 的衰减,衰减速率由参数 k 控制。

  • phi(r) - r 处的电位
  • dphi(r) - r 处的势导数
  • r - 到表面的距离(在这种情况下,我正在求解 r = 1 到 r = R)

和边界条件

  • φ(1) = 5
  • dphi(R) = 0

代码的问题位如下

通常,对于 k 的低值,积分可以正常工作,我可以使用 scipy.optimize 中的 root 来根据边界条件解决它,但是当我尝试使用相对较大的 k 值(0.5 和更高)时,积分会遇到问题并且输出以下错误

使用 full_output = 1 运行它并查看tcur参数后,它似乎平稳地计数直到某个点,然后从非常大的值到非常小的值剧烈振荡。在同一点nfe,函数评估的数量下降到零。正常工作时,tcur 参数从 1 到 R 平稳运行。有人能告诉我为什么会这样吗?是我的实现有问题还是等式不稳定?

提前感谢您的帮助,

戴夫

0 投票
0 回答
776 浏览

python - scipy ode求解器中的绑定解决方案

我想在 python 中解决大量的双线性 ODE 系统。导数是这样的:

我对非常准确的结果不感兴趣,而是对定性行为感兴趣,即组件是否为零。

因为我要解决如此大量的高阶系统,所以我想使用尽可能大的步长。

由于步长较大,ODE 可能会出现在零以下的一个分量中。这应该是不可能的,因为(由于特定 ODE 的结构)每个分量都以零为界。因此 - 为了防止错误的结果 - 我想在每个组件低于时手动将其设置为零。

此外,在我想要解决的系统中,解决方案可能会崩溃。我还想通过设置上限来防止这种情况发生,即如果一个值超过了界限,它会被设置回界限的值。

我希望我可以让我的目标易于理解,并为您提供以下我想要做的伪代码:

我使用 Runge-Kutta 算法实现了这一点。一切正常。只是性能很差。因此,我更喜欢使用像 scipy.integrate.odeint 这样的预实现方法。

因此,我不知道如何设置这样的界限。我尝试过的一个选项是以这种方式操纵 ODE,一旦 x 高于界限,导数变为 0,一旦 x 低于 0,则导数变为 0。此外,为了防止在一个时间步内跳得太高,我还有界导数:

虽然这个解决方案(特别是对于零界限)非常难看,但如果它有效就足够了。不幸的是,它不起作用。使用 odeint

我经常遇到以下两个错误之一:

它们可能是由于我操纵的 ODE 的不连续性。互联网上有很多关于这些错误消息的主题,但它们对我没有帮助。例如,增加允许的步数既不能阻止这个问题,也不是一个好的解决方案,因为我需要使用大步长。此外,通过雅可比也无济于事。

查看解决方案可以看到发生错误时会发生两种奇怪的行为:

  1. 该解决方案在一个时间步长内达到 +-1e250(这应该是不可能的,因为 dx/dt 是有界的)。
  2. 它首先到达边界,但又下降(这应该是不可能的,因为 x 处于边界,因此 x_ 为 0)。

我将不胜感激有关如何解决问题的所有提示-无论它是否有助于

  • 如何防止odeint中的错误
  • 如何正确或打开 ODE 操作
  • 如何编写一个非常快速的 ODE 求解器,我可以直接实现我的需求。

我提前谢谢你!

编辑

我被问到一个最小的例子:

要查看解决方案,必须绘制 x。使用给定的参数,我经常得到上述错误

0 投票
1 回答
6451 浏览

python - 使用 scipy.integrate.odeint 随叫随到完成的额外工作(可能是错误的 Dfun 类型)

我正在用 Python 编写一个代码来预测氢的能级,我将用它作为研究夸克能级的模板。我正在使用该scipy.integrate.odeint()函数来求解 Shroedinger 方程,它适用于高达n=6. 我不认为我有太多需要超越这一点,但 odeint 的回报Excess work done on this call (perhaps wrong Dfun type).只会鼓励我扩展我可以预测的内容。

我使用的薛定谔方程替换是:

然后我使用scipy.integrate.odeint()它并遍历能量并使用我定义的其他函数来评估结果中的转折点和节点。我找到能级的方法是找到可能的最低 E 值,其中转折点和节点的数量与其应该匹配;然后递增L1 并找到新的地面能量,例如,如果L=0我会找到n=1能量,如果L=3,我会找到n=2能量。

一旦代码增加到L=7它不会返回任何有用的东西。的范围r已经扩大,但我尝试保持不变以减少步骤数,但无济于事。该代码是自学的,所以在我的研究中,我读到了有关 Jacobians 的内容。恐怕我还没有弄清楚它们是什么,或者我是否需要一个。有任何想法吗?

0 投票
1 回答
339 浏览

c++ - 使用 OpenMP 在 odeint 中创建受控步进器

我尝试使用 openmp_range_algebra 构建一个带 boost::odeint 的受控步进器

但是,odeint 中不存在这样的构造函数,因此代码无法编译。

我的问题:如何创建一个受控的 runge_kutte-dopri5 步进器,以便我可以将它与 OpenMP 一起使用?

我真的很想并行化自适应步进器,因为这是我的程序中最耗时的部分,因为状态向量很长(长度:2 ^ 20)。

非常感谢你的协助

0 投票
1 回答
36590 浏览

python - 如何使用 Python 内置函数 odeint 求解微分方程?

我想用给定的初始条件求解这个微分方程:

答案应该是

y=2*exp(2*x)-x*exp(-x)

这是我的代码:

但我得到的与答案不同。我做错了什么?

0 投票
3 回答
303 浏览

c++ - 调用另一个函数重载

odeint要从c++ boost图书馆了解,我需要知道哪个部分做什么。在boost/numeric/odeint/integrate/integrate_adaptive.hpp中,有一个名为 的函数integrate_adaptive。这个函数有一些重载。我的一些操作的简化文件如下:

集成自适应最小.hpp

这两个函数的区别与参数有关start_state。在第二个函数中,它包含一个const关键字。我想知道调用了哪个重载。因此,我在每个函数中添加了一个 cout。然后我从这个测试文件中调用它们:

最小的.cpp

当我编译并运行时:

结果显示integrate_adaptive调用了第一个没有的函数const。现在,我想知道调用第二个函数的正确方法是什么?对象 x 不能是const

如果有人甚至了解boost库的机制,请告诉我第二个功能的优势。

更新:

原代码:githubdoc

0 投票
1 回答
50 浏览

c++ - odeint 在迭代时重置对象

运行以下代码:

我希望counter从 0 开始计数并cout生成以下输出:

当我得到别的东西时:

什么是重置计数器?看起来很像!

解决这个问题的正确方法是什么?我宁愿避免使用外部对象。

0 投票
0 回答
125 浏览

c++ - 使用基于迭代器的集成时出现错误 C2582 Boost ODEINT

对于我正在处理的项目,我需要使用基于迭代器的解决方案,以便在满足某些条件时停止集成。看起来下面的代码,当应用于我们的具体情况时,将起作用。使用 Visual Studio 2010 和 2013 以及 Boost 1.57 时,以下代码可以工作并编译。

问题的出现是因为我们也对使用 Bulirsch-Stoer 方法感兴趣。当我尝试如下实现 Bulirsch-Stoer 步进器时:

我收到以下编译错误。

该错误必须与 Visual Studio 有关,因为当我使用 gcc 时编译完全相同的代码。谁能帮我让 Bulirsch-Stoer 步进器在 make_adaptive_time_range 中工作?

谢谢您的帮助!