- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在时域中有一个ordinary differential equation
,如下所示:
C*du/dt = -g*u + I
I = A*t/tau*exp^(1-t/tau)
u(w) = I(w)/(g*(1+C/g*j*w))
j
是复数
sqrt(-1)
u(t)
)进入freq域,然后再使用
fft
来获取
ifft
。
t = np.linspace(0.,499.9,5000)
I = q*t*np.exp(1-t/Tau_ca)/Tau_ca
u1 = np.fft.ifft(np.fft.fft(I)/(G_l*(1.+1.j*(C_m/G_l)*np.fft.fftfreq(t.shape[-1]))))
u(t)
与其他方法(例如微分方程的数值积分或其解析形式)进行比较时,这是不正确的。我已经尝试过并且未能弄清楚我的错误在哪里。
最佳答案
正弦波或复指数的导数与频率成正比,并通过π/2
相移。对于复杂的指数,相移等效于j
的乘积。例如,d/dt exp(j*Ω*t)
== j*Ω * exp(j*Ω*t)
== Ω * exp(j*π/2) * exp(j*Ω*t)
== Ω * exp(j*(Ω*t + π/2))
。因此,如果您具有傅立叶变换对u(t) <=> U(Ω)
,则为du/dt <=> jΩ * U(Ω)
。积分几乎是逆运算,但如果有直流分量,则可能会增加一个脉冲:∫udt <=> U(Ω) / jΩ + π*U(0)*δ(Ω)
为了使用采样序列近似导数,您必须按采样率fs
缩放离散时间角频率ω(范围为0到2π,或-π到π)。例如,假设离散时间频率为π/2弧度/样本,例如序列[1, 0, -1, 0, ...]
。在原始信号中,这对应于fs/4
。派生词是d/dt cos(2*π*fs/4*t) == d/dt cos(π/2*fs*t)
== -π/2*fs*sin(π/2*fs*t)
== π/2*fs*cos(π/2*fs*t + π/2)
。
您必须以大于信号带宽两倍的fs
进行采样。确切的fs/2
处的采样组件不可靠。具体而言,每个周期只有2个样本,fs/2
分量的振幅会交替显示序列中第一个样本的符号。因此,对于实值信号,fs/2
DFT分量是实数值,其相位为0或π弧度,即a*cos(π*fs*t + {0, π})
。给定后者,fs/2
分量的导数为-a*π*fs*cos(π*fs*t + {π/2, 3*π/2})
,对于采样时间t == n/fs
,该值为0。
(关于后者,DFT的标准三角插值使用余弦,在这种情况下,导数在采样点处为零。如果同时对信号及其导数进行采样,则不一定是正确的。采样会丢失相位相对于信号,而不是相对于其导数,fs/2
分量的比率。取决于您开始采样的时间,fs/2
分量及其导数在采样点上可能都非零。采样时间,另一个将达到峰值,因为它们的π/2
弧度分开。)
鉴于fs/2
DFT分量始终是实值信号的实值,因此在计算导数或积分的过程中将其乘以j
时,这会在结果中引入虚值分量。有一个简单的解决方法。如果N
是偶数,则将索引fs/2
的N/2
组件置零。另一个问题是用jΩ
除以进行积分时除以零。这可以通过向Ω
向量的索引0添加一个较小的值来解决(例如finfo(float64).tiny
是最小的 double 浮点数)。
给定Ω = fs * ω
,问题中显示的系统在频域中具有以下形式:
H(Ω) = 1 / (g + j*Ω*C)
U(Ω) = I(Ω) * H(Ω)
w
缩放频率变量fs
。 fftfreq
,它的范围是-0.5到0.5。您需要-π到π。i(t)
是实值。在这个rfft
和irfft
用于实值信号,from pylab import *
fs = 1024
t = arange(2*fs, dtype=float64) / fs
N = len(t) // 2 + 1 # non-negative frequencies
w = 2 * pi / len(t) * arange(N)
Omega = w * fs
x0 = cos(2*pi*t) # w0 == 2*pi/fs
X0 = rfft(x0);
# Zero the fs/2 component. It's zero here anyway.
X0[-1] = 0
dx0 = irfft(X0 * 1j*Omega)
plot(t, x0, 'r', t, dx0, 'b')
show()
t2 = t[:fs]
m = len(t) // (2*len(t2))
x1 = hstack([t2, 1.0 - t2] * m)
X1 = rfft(x1)
X1[-1] = 0
dx1 = irfft(X1 * 1j*Omega)
plot(t, x1, 'r', t, dx1, 'b')
show()
odeint
和DFT的相关系统的解决方案(
tau
设置为0.5s;
g
和
C
设置为1 Hz转折频率):
from scipy.integrate import odeint
a = 1.0; tau = 0.5
g = 1.0; C = 1.0 / (2 * pi)
i = lambda t: a * t / tau * exp(1 - t / tau)
f = lambda u, t: (-g*u + i(t)) / C
H = 1 / (g + 1j*Omega*C) # system function
I = rfft(i(t))
I[-1] = 0
U_DFT = I * H
u_dft = irfft(U_DFT)
u_ode = odeint(f, u_dft[0], t)[:,0]
td = t[:-1] + 0.5/fs
subplot('221'); title('odeint u(t)');
plot(t, u_ode)
subplot('222'); title('DFT u(t)');
plot(t, u_dft)
subplot('223'); title('odeint du/dt')
plot(td, diff(u_ode)*fs, 'r',
t, (-g*u_ode + i(t)) / C, 'b')
subplot('224'); title('DFT du/dt')
plot(td, diff(u_dft)*fs, 'r',
t, (-g*u_dft + i(t)) / C, 'b')
show()
du/dt
图覆盖了由
diff
估计的导数(红色)与根据微分方程计算得到的值(蓝色)的重叠。它们在两种情况下大致相等。我将
odeint
的初始值设置为
u_dft[0]
,以显示它为相同的初始值返回DFT解决方案。不同之处在于
odeint
解决方案将继续衰减为零,但DFT解决方案是周期性的,周期为2s。在这种情况下,如果对i(t)进行更多采样,DFT结果将看起来更好,因为i(t)从零开始衰减到零。
scipy.signal
具有分析LTI系统的工具,包括以多项式,零极点增益和状态空间形式映射连续时间到离散时间。
关于python - 使用scipy fft和ifft数值求解常微分方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13570828/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!