Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中正支撑函数的卷积_R_Integration_Convolution_Numerical - Fatal编程技术网

R中正支撑函数的卷积

R中正支撑函数的卷积,r,integration,convolution,numerical,R,Integration,Convolution,Numerical,我想要在[0,Inf)上定义的两个函数的卷积,比如 f=function(x) (1+0.5*cos(2*pi*x))*(x>=0) 及 使用R的积分函数,我可以做到这一点 cfg=function(x) integrate(function(y) f(y)*g(x-y),0,x)$value 通过搜索网络,似乎有更有效(更准确)的方法(比如使用fft()或convalve())来实现这一点。有这样经验的人能解释一下吗? 谢谢!卷积或fft解决方案是获得离散结果,而不是

我想要在
[0,Inf)
上定义的两个函数的卷积,比如

f=function(x)
    (1+0.5*cos(2*pi*x))*(x>=0)

使用R的积分函数,我可以做到这一点

cfg=function(x)
    integrate(function(y) f(y)*g(x-y),0,x)$value
通过搜索网络,似乎有更有效(更准确)的方法(比如使用
fft()
convalve()
)来实现这一点。有这样经验的人能解释一下吗?
谢谢!

卷积
fft
解决方案是获得离散结果,而不是您在
cfg
中定义的函数。它们可以为您提供一些常规离散输入的
cfg
数值解

fft
用于周期函数(仅限),因此没有任何帮助。但是,
convolve
有一种称为“open”的操作模式,它模拟由
cfg
执行的操作

请注意,使用
type=“open”
,您必须反转第二个序列(请参见
?convolve
,“Details”)。您还必须只使用结果的前半部分。以下是
c(2,3,5)
c(7,11,13)
的卷积结果的图示示例,如
convolve(c(2,3,5),rev(c)所执行(7,11,13),键入“打开”

请注意,前三个元素的计算结果与积分结果类似。后三个元素将用于反向卷积

这是与函数的比较。你的函数,矢量化,用

y <- seq(0,10,by=.01)
plot(y, Vectorize(cfg)(y), 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

这完美地回答了我的问题,对Convalve(with type='open')的图形解释非常精彩。非常感谢,Matthew!
y <- seq(0,10,by=.01)
plot(y, Vectorize(cfg)(y), type='l')
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