2017-02-02 17 views
2

Извините, что я новичок в Вольфраме. Я видел, как люди задавали вопросы о том, как сделать свертку функции с собой в Вольфраме. Однако мне интересно, как это сделать несколько раз в цикле. То есть я хочу сделать f20 * i.e. f * f * f * f * .... f всего 20 f. Как его реализовать?Как рассчитать свертку функции с собой несколько раз в Вольфраме?

Вот мое мышление. Конечно, не работают ....

f[x_] := Piecewise[{{0.1`, x >= 0 && x <= 10}, {0, x < 0}, {0, x > 10}}]; 
g = f; 
n = 19; 
For[i = 1, i <= n, i++, g = Convolve[f[x], g, x, y]]; Plot[ 
    g[x], {x, -10, n*10 + 10}, PlotRange -> All] 

Может ли кто-нибудь мне помочь?

Мой новый код после пересмотра кода agentp в

f[x_] := Piecewise[{{0.1, x >= 0 && x <= 10}, {0, x < 0}, {0,x > 10}}]; 
n = 19; 
res = NestList[Convolve[#, f[x], x, y] /. y -> x &, f[x], n]; 
Plot[res, {x, -10, (n + 1)*10 + 10}, PlotRange -> All,PlotPoints -> 1000] 

My buggy image

+0

n должно быть 19 .... –

+0

Есть ли способ преодолеть точность машины, когда n велико = 19? –

ответ

2

возможно это?

Nest[ Convolve[#, f[x], x, y] /. y -> x &, f[x] , 3] 

enter image description here

Если это не так, возможно, показать, что вы получите вручную при п = 2 или 3.

res = NestList[ Convolve[#, f[x], x, y] /. y -> x &, f[x] , 10]; 
Plot[res, {x, 0, 100}, PlotRange -> All] 

enter image description here

это становится очень медленно с п, I не имеют терпения, чтобы запустить его до 20.

+0

Очень приятно! Большое спасибо! –

+0

Я получаю ошибку при запуске с n = 20 .... Когда n = 20 График становится странным. –

+0

Вероятно, вы столкнулись с проблемами точности. Попробуйте сделать '0,1' точный' 1/10', чтобы получить точные рациональные коэффициенты для многочленов. (Участок все еще работает на точности машины, поэтому у вас все еще могут быть проблемы) – agentp

1

Ваш подход ch почти работает. Вы просто должны

  1. убедитесь, чтобы скопировать f по значению перед входом в цикл, так как в противном случае вы сталкиваетесь с бесконечной рекурсии.

  2. Назначить результат Convolve функции, которая принимает параметр.

Это код с указанными изменениями:

f[x_] := Piecewise[{{0.1, x >= 0 && x <= 10}, {0, x < 0}, {0, x > 10}}]; 
g[x_] = f[x]; 
n = 20; 
For[i = 1, i <= n, i++, g[y_] = Convolve[f[x], g[x], x, y]]; 
Plot[g[x], {x, -10, n*10 + 10}, PlotRange -> All] 

Edit: В то время как это работает, ответ agentp является более consise и я подозреваю, что и быстрее.

+0

Очень приятно! Это действительно работает! Спасибо! –