问题标签 [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 发出 lsoda 警告
我对编码完全陌生,我想用数字求解这 5 个微分方程。我拿了一个python 模板并将其应用到我的案例中。这是我写的简化版本:
我收到以下错误:
对于某些参数集,在使用mxstep
odeint (也尝试过hmin
但hmax
没有发现任何区别)时,虽然错误仍然存在,但我的图表看起来不错并且没有受到影响,但大多数时候它们是。有时我得到的错误要求我使用 odeint 选项运行,full_output=1
这样做我得到:
搜索时我不明白这意味着什么。
我想了解问题出在哪里以及如何解决。odeint 是否适合我正在尝试做的事情?
c++ - “受控龙骨库塔”不是类模板
这是以下代码中的一个已知错误:
“受控龙骨库塔”不是类模板
在以下代码中:
我知道为什么会出现此错误。但我的问题是,它在第 146 行来自github的原始 boost 库中是如何工作的?
谢谢你。
python - 在 python odeint 中传递一个数组
我对 Python 很陌生,所以如果以下问题有一个“duh”的答案,请原谅。
所以,我正在尝试使用 odeint 解决 ODE 并希望传递一个数组。但是,TypeError: can't multiply sequence by non-int of type 'float' 不断出现,在行中:
所以,代码是:
请帮忙?
c++ - static_cast 会影响简单类型浮点数的 Boost 吗?
在Boost ODEINT库中,您可以找到很多static_cast
关键字,例如:
哪里value_type
由模板决定。
我的问题是,如果value_type
是一个简单的类型,和double
之间有什么区别 吗?我想知道他们为什么使用这种铸造方式。if is or一样吗?static_cast<value_type> ( 5 )
(double)5
value_type
double&
double&&
python - 试图改变 odeint 的容差但得到“检测到非法输入”和“无限循环”
我得到以下微分方程 y'' + a y' - y + by^3 = c cos(kx) 初始条件 y(0) = y'(0) = 0 和参数值 a = 0.05, b = k = 1 和 c = 0.5。
现在,我要做的是降低求解器的相对容差,直到数值解 y(t) 与前一次迭代的变化在 x = x_max 时小于 10^−8。
这是我的代码:
我得到了输出:
以不同的 R1 值重复...
我不明白为什么我得到“检测到非法输入”和“明显的无限循环”。后者是新的,我不确定为什么会这样。
任何帮助将不胜感激。
PS我很抱歉格式。我是新手,我不知道如何更改它以使问题看起来不错。
-编辑-
我尝试了建议的“full_output = 1”并将 Ydiff 的第 5 行更改为
我会得到类似的东西
或者
这很奇怪。今天我没有收到无限循环错误,但我仍然收到这些消息。为了查看发生了什么,我再次将同一行编辑为:
我得到了输出(除了'nje'的一次出现为0):
我想知道如果可能的话如何解决这个问题。
python - odeint 中的波特洛伦兹参数
我正在尝试创建一个洛伦兹解决方案,其中一个参数被调制。
在创建一组简单的 Lorenz 方程时,使用 odeint 很简单:
上面的代码完美地创建了一个简单的 Lorenz 系统。我现在想创建一个调制参数 Lorenz 系统来研究它在通信中的有效性。这可以通过调制参数 Beta 来完成。Beta(t) 可以采用两个值之一,4.0 或 4.4 来表示“0”或“1”。
为了调制 beta,我选择了随机的 1 和 0,并将它们分配给 beta 的两个值,4.0 和 4.4,每个“1”或“0”有 500 个样本。
然后,我将对 odeint 参数集的调用更改为:param = [Sigma, Rho, Bauded_Beta]
当我运行它时,我收到以下错误消息,“检测到非法输入(内部错误)。以 full_output = 1 运行以获取定量信息。ValueError:使用序列设置数组元素。odepack.error:函数调用的结果是不是正确的浮点数组。ValueError:使用序列设置数组元素。odepack.error:函数调用的结果不是正确的浮点数组。”
我知道这个错误来自 beta 不再是恒定的。但是,如何将调制参数传递给 odeint?
c++ - 使用 std::vector作为 odeint 中的状态类型
我目前正在尝试使用 odeint 和 Eigen3 来集成 nBody 系统(目标是一个库,提供用于行星形成的高级例程,例如 MVS 的混合变量辛或钱伯斯混合变体)。在尝试使用不同的步进器时,我发现使用普通步进器时 state_typestd::vector<Eigen::Vector3d>
工作正常,但使用受控步进器(例如burlisch_stoer
)编译失败,第一条错误消息是:
这是否意味着norm_result_type 推导不正确?这个规范到底是做什么的?它应该是在 x_err 中找到的最高 value_type 吗?
第二个:
我必须提供自己的代数才能以这种方式使用它吗?我宁愿不切换到 astd::vector<double>
或 Eigen::VectorNd,因为将坐标分组对 ODE 右侧的可读性非常有益。
这是我使用的代码的简化示例。
Headmyshoulders 解决方案有效。我创建了一个继承自的代数range_algebra
:
range_algebra
我认为应该可以使用and来创建这样的代数vector_space_algebra
,但我还没有尝试过。
c++ - Rcpp NumericalMatrix 数据类型,全局声明
我对 C++ 很陌生,我正在尝试通过 Rcpp 使用它来加速我的 R 代码。
下面的代码从 t0 集成到 t1 - 这是在“lorenz”函数中完成的。Test4 使用“lorenz”“counts”次数进行积分。然而,在时间“t1”,系统状态在系统重新运行之前在“write_lorenz”中被修改,这就是问题所在。如果我通过从 R 调用 test4 一遍又一遍地运行相同的程序,打印到屏幕上总是会产生相同的结果,但是,我返回的矩阵“u”不会,并且似乎最终会收敛到任何“t1”是问题。
我的输入值没有改变,所以我想知道是否存在内存泄漏,或者是否发生了其他事情,如何解决它。另外我想知道我对“u”的初始化是否不正确,我应该使用“new”命令。
我尝试的是 NumericMatrix* u = NULL; *u = 新数值矩阵;然后我尝试以 *u(1,2) 的形式访问矩阵的元素,但是以这种方式访问元素会导致错误说 u 不是函数。
任何帮助将不胜感激
我从以下站点修改了此代码
http://headmyshoulder.github.io/odeint-v2/examples.html
所以我可以将它与 Rcpp 一起使用
python - 我可以将 scipy.integrate.odeint 限制为边界条件吗?
我想要一个自由落体的物体“反弹”。在一个简单的例子中,一个物体从一个初始高度自由落体。当它撞到“地面”时,我希望它“弹跳”。
在这个例子中,一个物体以 0 的初始速度下落并以 1 g 的速度加速。有没有办法强制 odeint 从其“x”位置而不是经过一段时间后终止其“积分”?
还是 scipy 提供了更好的解决问题的方法?