周期高斯的实现

时间:2014-09-24 16:57:44

标签: python c matlab numeric numerical-methods

我正在尝试在C,MATLAB或Python中实现周期性Gaussian。

评估下面定义的周期性高斯函数的正确方法是什么

我目前正在根据下面的公式进行评估,以避免在负数加上无穷大的总和:

提前致谢。

2 个答案:

答案 0 :(得分:0)

好吧,你不应该评估无限和,因为一旦你到达(x-kL)>> 2sigma,你将达到浮点精度的极限。

所以你应该能够从找到x - kL的最小值开始(即,只设置x = x mod L和k = 0,这是合法的,因为这是一个无穷大的总和),然后在k处添加项= +/- 1,+ / - 2,......直到达到浮点极限。这里有一些示例MATLAB代码说明了这个想法 - 我只是掀起了这个想法,所以我不能保证它没有错误,但它确实表现出一些基本的预期行为。

    function [result] = Periodic_Gaussian(x, L, sigma)

    gaussian = @(y) 1/(2*pi*sigma)*exp(-y.^2 ./ 4 ./sigma^2);

    x = mod(x, L);

    oldresult = NaN;
    newresult = gaussian(x);
    k = 1;
    while any(newresult ~= oldresult)
        oldresult = newresult;
        newresult = oldresult + gaussian(x-k*L) + gaussian(x+k*L);
        k = k+1;
    end
    result = newresult;

希望这有用!

编辑:在指数的参数的分母中错过了4倍,并根据需要更新了代码以获取x的向量。

答案 1 :(得分:0)

function [result] = PeriodicGaussian(x, L, sigma)                                                                                                                                                                                             



    gaussian = @(y, sigma) 1/(2*pi*sigma)*exp(-y.^2 ./ 2 ./sigma^2);                                                                                                                                                                           


    x0 = mod(x, L)                                                                                                                                                                                                                             
    x1 = mod(x, -1 * L)                                                                                                                                                                                                                        
    result = gaussian(x0, sigma) + gaussian(x1, sigma);                                                                                                                                                                                        
    correctionIdx = (x0 == 0 & x1 == 0);                                                                                                                                                                                                       
    result(correctionIdx) = 0.5 * result(correctionIdx);                                                                                                                                                                                       

end