2017-02-02 4 views
2

すみません、私はWolframには新しいです。私はWolframで関数自体の畳み込みを行う方法について質問する人々を見てきました。しかし、私はそれをループで何度もやり遂げる方法を知っています。すなわち、私はf20 *すなわちf * f * f * f * ... fを合計20fとしたいとします。それを実装する方法は?Wolframで複数回の関数の畳み込みを計算するにはどうすればいいですか?

ここは私の考えです。もちろんうまくいきません....

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

それがない場合は、右多分これはn個と非常に遅くなる、あなたが手で得るものを示し、N = 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

あなたのapproa 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] 

編集:これは動作しますが、agentpの答えは、よりconsiseであり、私は速くも疑います。

+0

非常に良い!それは本当に動作します!ありがとう! –

関連する問題