convolve 或fft 解决方案将获得离散结果,而不是您在cfg 中定义的函数。他们可以在一些常规的离散输入上为您提供cfg 的数值解。
fft 仅用于周期性函数,因此无济于事。但是,convolve 有一种称为“打开”的操作模式,它模拟了 cfg 正在执行的操作。
请注意,使用type="open",您必须反转第二个序列(请参阅?convolve,“详细信息”)。您还必须只使用结果的前半部分。这是c(2,3,5) 与c(7,11,13) 卷积结果的图示示例,由convolve(c(2,3,5), rev(c(7,11,13)), type='open') 执行:
2 3 5 2 3 5 2 3 5 2 3 5 2 3 5
13 11 7 13 11 7 13 11 7 13 11 7 13 11 7
Sum: 14 43 94 94 65
请注意,评估前三个元素与您的集成结果相似。最后三个将用于反向卷积。
这是与您的功能的比较。你的函数,矢量化,用
绘制
y <- seq(0,10,by=.01)
plot(y, Vectorize(cfg)(y), type='l')
并使用以下代码绘制convolve 的应用程序。请注意,y 中每个单位间隔有 100 个点,因此除以 100 是合适的。
plot(y, convolve(f(y), rev(g(y)), type='open')[1:1001]/100, type='l')
这些不太一致,但卷积要快得多:
max(abs(Vectorize(cfg)(y) - convolve(f(y), rev(g(y)), type='open')[1:1001]/100))
## [1] 0.007474999
benchmark(Vectorize(cfg)(y), convolve(f(y), rev(g(y)), type='open')[1:1001]/100, columns=c('test', 'elapsed', 'relative'))
## test elapsed relative
## 2 convolve(f(y), rev(g(y)), type = "open")[1:1001]/100 0.056 1
## 1 Vectorize(cfg)(y) 5.824 104