问题标签 [ode]
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 - 在不应该的时候,integrate.odeint 给出了两个截然不同的答案
我有以下python MWE(代码解释如下)
正如你所看到的,我正在整合一组方程 ( base_equations
),它们本质上是一个高斯脉冲。我用odeint
数值求解脉冲的两个中心点(30 和 60)的这些方程。
对于第一个中心点 (t=30),方程 y1 产生预期的行为:脉冲是可见的。
对于第二个中心点 (t=60),方程 y2 产生了意想不到的行为:根本看不到脉冲!
工作和不工作之间的切换发生在 47 和 48 之间。
图形输出如下。预期的输出是 y2a 和 y2b 行将显示 60 左右的显着变化,但事实并非如此。
关于可能发生的事情有什么想法吗?
haskell - Haskell - 优化微分方程求解器
我正在学习 Haskell,并尝试尽可能快地用 C 语言编写代码。对于这个练习,我正在为一个简单的一维物理系统编写欧拉积分器。
- C 代码使用 GCC 4.5.4 和
-O3
. 它在1.166秒内运行。 - Haskell 代码使用 GHC 7.4.1 和
-O3
. 它在21.3秒内运行。 - 如果我用 编译 Haskell
-O3 -fllvm
,它会在4.022秒内运行。
那么,我是否缺少优化 Haskell 代码的内容?
PS.:我使用了以下论点:1e-8 5
.
C代码:
哈斯克尔代码:
c++ - 无法编译 ODEINT 包中的示例
我正在尝试在 C++ 中解决一组耦合的 ODE,并且我决定尝试 odeint(可在此处获得),因为我已经阅读了很多关于它的好东西。但是,我正在编译包中包含的示例。情况如下:
到目前为止,我只下载了包并解压了它。我在 Windows XP 上运行 Visual C++ 6,并且正在编译示例“simple1d”。我收到错误消息:“无法打开包含文件:'boost/config.hpp':没有这样的文件或目录”。
我不清楚我错过了什么。我需要完整的 boost 库来完成这项工作吗?我的印象是 ODEINT 是一个“独立”包。
matlab - 更改函数内的参数以与 ODE 求解器一起使用
是否可以使用 ODE 求解器,例如 ode45,并且仍然能够“更改”被调用函数中参数的值?
例如,如果我要使用以下功能:
使用此脚本:
一切都如我所料。但是,我想要一种方法来轻松更改参数值,但仍然只使用一个函数和一个脚本运行 ODE 求解器的多次迭代。但是,我似乎无法向 ODE 求解器添加更多项,例如:
使用此脚本:
不起作用。我想我知道这不应该起作用,但我一直无法想出解决方案。我也在考虑在函数中使用 if 语句,然后硬编码几组要使用的参数(例如,当 P == 1 时使用 set 1,当 P == 2 时使用 set 2 等),但这也不起作用我不知道在哪里调用要与 ODE 一起使用的集合。任何关于如何在 ODE 求解器中使用一个函数和一个脚本同时能够更改参数值的提示或建议将不胜感激。
谢谢你,迈克
python - 通过 scipy.integrate.ode 使用自适应步长
的(简要)文档scipy.integrate.ode
说两种方法(dopri5
和dop853
)具有步长控制和密集输出。查看示例和代码本身,我只能看到一种从集成器获取输出的非常简单的方法。即,看起来您只是将积分器向前推进某个固定的 dt,获取当时的函数值,然后重复。
我的问题有相当多变的时间尺度,所以我想在需要评估的任何时间步骤获取值以达到所需的容差。也就是说,在早期,事情正在缓慢变化,因此输出时间步长可能很大。但随着事情变得有趣,输出时间步长必须更小。我实际上并不想要等间隔的密集输出,我只想要自适应函数使用的时间步长。
编辑:密集输出
一个相关的概念(几乎相反)是“密集输出”,其中所采取的步数与步进器一样大,但函数的值被插值(通常精度与步进器的精度相当)到任何你要。fortran 底层scipy.integrate.ode
显然能够做到这一点,但ode
没有接口。 odeint
另一方面,它基于不同的代码,并且显然会进行密集输出。(您可以在每次调用右侧时输出以查看何时发生,并查看它与输出时间无关。)
所以我仍然可以利用适应性,只要我可以提前决定我想要的输出时间步长。不幸的是,对于我最喜欢的系统,我什至不知道作为时间函数的大致时间尺度是什么,直到我运行集成。因此,我必须将采取积分器步骤的想法与密集输出的概念结合起来。
编辑2:再次密集输出
显然,scipy 1.0.0 通过一个新接口引入了对密集输出的支持。特别是,他们建议远离scipy.integrate.odeint
和接近scipy.integrate.solve_ivp
作为关键字的dense_output
。如果设置为True
,则返回的对象具有一个属性sol
,您可以使用时间数组调用该属性,然后返回这些时间的集成函数值。这仍然不能解决这个问题的问题,但在许多情况下它很有用。
wolfram-mathematica - 使用 GNU gsl 编写的 ODE 是否优于 Mathematica 的 NDSolve?
与 Mathematica 8.0 NDSolve 相比,用 C 语言编写的 ODE 求解器是否可能使用 GSL 库具有显着的速度优势?在准确性方面如何公平?
我的理解是编译代码原则上可以更快,但是这些天 NDSolve 本身已经以某种方式使用了很多编译代码?
还有任何选项可以使用 MathLink 或 Mathematica 的 compile 函数来加快求解 ODE 的速度吗?
r - 如何解决具有内部阈值的 ODE?
我有以下包含一些颂歌的函数:
以下是一些结果:
Y 州不同,有人可以解释一下为什么吗?
我相信我没有正确设置我的阈值。有办法吗?
谢谢!
matlab - Matlab中带有ode45的二阶差分方程
所以我需要求解 x''(t) = -x(t)^p 初始条件 x(0)= 0 和 v(0) = x'(0) = v_o = 1。参数 p 的值是 1。
这就是我所拥有的:
这是我收到的错误消息:
ode_oscillation(1) 使用 odearguments 时出错(第 91 行) ODE_OSCILLATION/OSCILATION_EQUATION 必须返回列向量。
ode45 错误(第 114 行)[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
ode_oscillation 错误(第 17 行)[t,velocity,x] = ode45(@oscilation_equation, tspan,1);
matlab - ode 求解器中时间相关参数值的 for 循环仅适用于 t 的某些值
我正在使用一个简单的 if 循环来更改我的 ode 脚本中的参数值。这是我编写的一个示例脚本,它表现出同样的问题。所以首先是有效的版本:
这可以使用
并可视化
好的,这是好的版本。现在,如果您所做的只是将 t 更改为
整个事情都爆炸了。您可能认为这只是 matlab 对图形进行平均,但这不是因为如果您查看
两种情况下的答案应该是相同的,因为代码没有改变。但是第二个版本输出 0,这是错误的!
到底是怎么回事?有人有想法吗?
非常感谢您的帮助
python - Using scipy fft and ifft to solve ordinary differential equation numerically
I have an ordinary differential equation
in time domain as follows:
where I = A*t/tau*exp^(1-t/tau)
in the freq domain:
j
being the complex number sqrt(-1)
hence i can get u(t)
by going into the freq domain using fast Fourier transform (fft
) and then back using ifft
.
the codes:
However, when I compare this u(t)
obtained with other methods such as numerical integration of the differential equation or its analytical form, it is not correct. I have tried and been unsuccessful at figuring out where my mistakes are.
please enlighten.