2014-09-24 5 views
0

Я пытаюсь реализовать периодический гауссовский язык в C, MATLAB или Python.реализация периодического gaussian

Что такое правильный способ оценки периодической функции Гаусса, как определено ниже

Я в настоящее время оценивают по формуле ниже, чтобы избежать суммирование по минус до плюс бесконечности:

Заранее спасибо.

+0

Этот вопрос касается конкретного языка или инструмента программирования? –

+0

Нет, это не касается какого-либо языка, я задаю вопрос о том, как программно реализовать периодический гауссовский язык на любом языке, сложность заключается в том, как решить задачу суммирования от минус бесконечности до плюс бесконечности. Было бы полезно для меня, если вы можете предоставить ответ в C, Matlab или Python. – user3657953

+0

@ user3657953 Лучше спросите свой вопрос [здесь] (http://stats.stackexchange.com/). – Dalek

ответ

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; 

Надеюсь, это полезно!

EDIT: Отсутствует коэффициент 4 в знаменателе аргумента экспоненте и обновляется код, чтобы при необходимости взять вектор x.

+0

спасибо, но эта функция возвращает тот же результат для любого заданного L – user3657953

+0

Я не знаю, какие значения L вы тестировали, но это не должно, если только я не сделал ошибку при его копировании: ' Periodic_Gaussian (11, 2, 1) = 0,2821, Periodic_Gaussian (11, 8, 1) = 0,0171', например. – KevinMc

+0

Я имел в виду тот же результат для фиксированного L и переменных x и sigma, в вашем примере вы сохраняете x constant (= 11) Btw, это то, что я получаю для Periodic_Gaussian (11, 8, 1) = 1.9641e-05 и PeriodicGaussian (11, 2, 1) = 0.1171 .... и для L = 1, я получаю PeriodicGaussian (11, 1, 5) = PeriodicGaussian (0, 1, 5) = 0.2821 – user3657953

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                                                            
Смежные вопросы