问题标签 [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.
c++ - 使用 boost:odeint 的简单 C++ 程序中的断言错误
如果这很明显,我很抱歉,但我对来自 Python / MATLAB / Mathematica 背景的 C++ 非常陌生。我使用有限差分空间离散化为经典的一维热方程编写了一个简单的求解器,以便使用Odeint库的功能并将性能与其他库进行比较。代码应该是不言自明的:
这在 Ubuntu 14.04 上使用 g++ 4.8.2 和来自 Ubuntu 存储库的最新 boost 库编译得很好。但是,当我运行生成的可执行文件时,出现以下错误:
不幸的是,这对我的新手大脑并不是特别有帮助,我不知道如何解决这个问题。是什么导致了错误?
c++ - odeint 隐式欧拉简单示例
我有兴趣使用隐式方案使用 odeint 库解决 ODE 系统,但我很难实现一个简单的implicit_euler
示例。
查看文档,我设法使工作显式步进器、自适应步进器以及rosenbrock4
步进器。前者似乎是半隐式的。因此,我有兴趣实现一个完全隐式的方案(同时在每个时间步检索雅可比矩阵)。但是我没有找到这个步进器的文档和工作示例。我所拥有的是
错误如下:
C:\boost_1_55_0\boost\numeric\odeint\stepper\implicit_euler.hpp:94
: 错误: C2064: 术语不评估为采用 3 个参数的函数类未定义“operator()
”或用户定义的转换运算符到采用适当数量参数的函数指针或函数引用
我现在的问题是:有人知道如何使它工作,或者有人可以向我指出比这个更详细的文档:
或者这个:
谢谢
python - 如何提高此代码的速度?(使用 scipy.integrate.odeint 求解 ODE)
我正在尝试使用scipy.integrate.odeint
模块解决相对较大的 ODE 系统。我已经实现了代码,我可以正确解方程。但是这个过程非常缓慢。我分析了代码,我意识到几乎大部分计算时间都花在计算或生成 ODE 系统本身上,sigmoid 函数也很昂贵,但我想我必须接受它。这是我正在使用的一段代码:
正如您在每次迭代中看到的那样,我应该生成 nCells*nGenes (100*3=300) 方程并将其传递给odeint
. 虽然我不确定,但我想生成方程与求解它们相比非常昂贵。在我的实验中,解决整个系统需要 7 秒,其中包括 1 秒odeint
和 6秒__ConnectionistModel
。
我想知道是否有办法可以改善这一点?我尝试使用 SymPy 定义一个符号 ODE 系统并将符号方程传递给 ,odeint
但它不能正常工作,因为你不能真正定义一个符号数组,以后你可以像数组一样访问它。
在最坏的情况下,我必须处理它或使用 Cython 来加快求解过程,但我想确保我做对了,没有办法改进它。
提前感谢您的帮助。
[更新]:分析结果,
[更新 2]:我公开了代码:pyStGRN
segmentation-fault - 结合推力和助推器的odeint;错误的指针传递被认为会导致段错误
我正在尝试从boost::odeint修改 lorenz_parameters.cu 示例,以解决许多初始条件的初始值问题。程序段错误,我相信这是由于我错误地将指针传递给 的调用造成的integrate_adaptive()
,因为当我尝试打印出用于存储导数的向量的大小时,它是 0。
作为参考,这里是示例的文档,以及相同示例的代码(由于某种原因,原始文档中的代码链接不起作用)。
我在下面附上了该程序的完整源代码。有一条标记为 的线UNEXPECTED OUTPUT!
,我尝试在其中打印导数向量的大小,它出现为 0,它应该与状态向量 (512) 的大小相同。还有一行标记为LINE I DO NOT UNDERSTAND
,这是我认为我可能做错了什么的地方。这一行是对 intergrate_adaptive() 调用的一部分,我认为这个参数是(最终/通过 odeint 包)传递给operator()
. parallel_initial_condition_problem
但我正在尝试做与示例中相同的操作,但它不起作用。任何帮助是极大的赞赏!
运行它的输出是:
python - bz 反应的 Odeint 图表未给出正确的图表结果
我认为问题可能出在“功能”中,但我找不到。我得到的图表只是 0 处的一条红线。我正在尝试获取 Belousov-Zhabotinsky 反应的 z 和 y 浓度随时间变化的图。
c++ - 在 ODEINT + THRUST 观察者中,接收到表达式必须是可修改的左值的错误
我一直在努力扩展/修改推力 + odeint 示例 [代码,文档],它系统地改变一个参数,并观察效果。
我遇到了一个奇怪的错误,当我尝试修改某些应该修改的变量(并且在示例中被修改)时,我收到以下错误。
下面是我尝试运行的观察者结构的源代码,其中的注释显示了导致错误的行。
我理解这个错误意味着赋值运算符左边的表达式=
不是可修改的值。但在我看来,它与上面示例源中具有相同名称的变量完全相同(运行良好)。
...这是运行积分器和此观察者的 main() 代码,以防万一。
我试图将我的代码缩减为最简单的情况。注释掉上面第 3 到最后一行会导致程序运行良好。
我到底做错了什么?我的 m_count 和上面链接的示例代码中的 m_count 有什么不同?非常感谢!
c++ - 使用 odeint 时出现 Boost lib 错误
我在一个名为 C++ 的文件夹中下载了 odeint-v2。我创建了一个名为 HARMONIC.cpp 的新 cpp 文件。
在 ubuntu g++ HARMONIC.cpp -o har.output 中编译时
错误如下`
HARMONIC.cpp:4:36:致命错误:boost/numeric/odeint.hpp:没有此类文件或目录编译终止。
但是我在同一个文件夹中下载了所有 odeint-v2。
请帮我
scipy - Python odeint,解决方案返回初始条件数组
请参阅下面的代码
当我执行这段代码时,我得到了一个初始条件数组
[[ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [310. 0.]]
对此的任何想法将不胜感激。
c++ - 如何将向量传递给基于推力的 odeint 观察者的构造函数,以便可以在函子中读取它
我正在从 boost 与推力一起使用的 odeint 扩展参数研究示例,并且我不知道如何将值向量传递给观察者的构造函数,以便可以从观察者的函子中访问(只读)这些值.
以下是仅用于观察者的代码。
我已经尝试过制作 m_unchangVectorstatic
或const
,但这是不正确的,因为它需要在观察者实例化时进行设置。
或者,也许最好的方法是将 unchangedVector 作为另一个参数传递thrust::make_zip_iterator( thrust::make_tuple(...
,但我觉得这些项目将按照状态变量的方式进行索引(这不是我想要的)。一个可能有帮助的答案是解释 (T t) 在仿函数声明中的含义,以及我如何将 unchangedVector 作为同一个对象传递给正在评估运算符的每个线程。
我认为这可能只是选择正确的关键字变量描述符的问题,但我不知道要使用哪个(S),我不知道如何查找/弄清楚。
我为上面的代码得到的错误是error: a nonstatic member reference must be relative to a specific object
. 当我尝试访问仿函数中的 m_unchangVector 时抛出。
经过进一步探索,我觉得我已经确定了完成这项任务的正确方法,但我仍然卡住了。
我在函子中添加了一个构造函数。
警告:不允许从主机设备函数("minimum_perturbation_observer::minPerturbFunctor::operator () > ")调用主机函数("thrust::detail::vector_base > ::operator []")
错误消息/usr/local/cuda/bin/..//include/thrust/detail/function.h(104):错误:从设备函数调用主机函数(“thrust::device_vector > ::device_vector”)("thrust::detail::device_function ::device_function") 是不允许的
我究竟做错了什么?
thrust - 当参数向量的大小不同时,带有 make_tuple 的推力 odeint make_zip_iterator 的行为
当使用带推力的 odeint 时,我正在开发一个观察器,它将生成状态变量的直方图,同时并行解决许多初始条件问题。
初始条件问题并行运行,用这样的数据填充 device_vector。
或者,更简洁地说,数组的索引将根据以下公式计算:
...稍后,该向量将减少为每个变量的一个直方图。
我在 odeint + 推力中看到的范式是使用推力的make_zip_iterator
and调用运算符函子make_tuple
,因此:
当函子的参数长度相同时,这很有效。但在我的情况下,如上所述要填充的直方图数据 device_vector 的大小不同,并且需要与提供给函子的其他参数(例如状态变量)不同的索引。
环顾四周后,我认为最好的方法是传递一个thrust::counting_iterator,它为函子提供填充直方图矩阵所需的轨迹索引。然后,我还(显然)必须以某种方式提供指向直方图矩阵的指针,以便可以填充它。也许为observer_functor 提供指向直方图向量的指针的最佳解决方案是将其作为参数提供给观察者的构造函数(类似于我在此处发布的另一个问题的解决方案)。
当传递的参数指示不同长度的向量时,所有这些都引起了关于make_zip_iterator
/范式中的数组如何工作的一些困惑。make_tuple
问题:
我建议使用
thrust::counting_iterator
并通过仿函数对象的构造函数传递指向输出数组的指针是推荐的方法吗?更一般地说,当传递的参数指示不同长度的向量时,上面的
make_zip_iterator
/范例如何工作?make_tuple