2017-02-02 2 views
2

Excusez-moi, je suis nouveau à Wolfram. J'ai vu des gens poser des questions sur la façon de faire la convolution d'une fonction avec elle-même dans Wolfram. Cependant, je me demande comment le faire plusieurs fois dans une boucle. C'est-à-dire que je veux faire 20%, c'est-à-dire 20%. Comment l'implémenter?Comment calculer la convolution d'une fonction avec elle-même plusieurs fois dans Wolfram?

Voici ma pensée. Bien sûr, ne fonctionne pas ....

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] 

Quelqu'un peut-il m'aider?

Mon nouveau code après la révision du code de 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 devrait être 19 .... –

+0

Existe-t-il une méthode pour surmonter la précision de la machine lorsque n est grand = 19? –

Répondre

2

peut-être cela?

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

enter image description here

Si ce n'est pas montrer juste peut-être ce que vous obtenez à la main pour n = 2 ou 3.

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

enter image description here

cela devient très lent avec n, je N'avez pas la patience de l'exécuter à 20.

+0

Très bien! Merci beaucoup! –

+0

J'ai un bug quand je cours avec n = 20 .... Quand n = 20 Le graphique devient bizarre. –

+0

Vous rencontrez probablement des problèmes de précision. Essayez de faire '0.1' exact' 1/10' pour obtenir des coefficients rationnels exacts pour les polynômes. (Le tracé fonctionne toujours à la précision de la machine, donc vous pouvez toujours avoir des problèmes) – agentp

1

Votre approche ch fonctionne presque. Vous avez juste à

  1. assurez-vous de copier f en valeur avant d'entrer dans la boucle, car sinon vous faites face à une récursion infinie.

  2. Affectez le résultat Convolve à une fonction qui prend un paramètre.

Ce code avec les changements mentionnés:

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: Bien que cela fonctionne, la réponse de agentp est plus concise et je soupçonne aussi plus rapide.

+0

Très bien! Cela fonctionne vraiment! Merci! –