【问题标题】:convolution of positively supported functions in RR中正支持函数的卷积
【发布时间】:2014-07-12 06:56:48
【问题描述】:

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

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

g=function(x)
    exp(-2*x)*(x>0)

使用R的积分功能我可以做到这一点,

cfg=function(x)
    integrate(function(y) f(y)*g(x-y),0,x)$value

通过搜索网络,似乎有更有效(和更准确)的方法(例如使用fft()convolve())。有这种经历的大神能解释一下吗? 谢谢!

【问题讨论】:

    标签: r integration convolution numerical


    【解决方案1】:

    convolvefft 解决方案将获得离散结果,而不是您在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
    

    【讨论】:

    • 这完美地回答了我的问题,并且 convolve (with type='open') 所做的图形解释非常出色。非常感谢,马修!
    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 2016-12-23
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多