6

次のタイプの畳み込み積分があります。

畳み込み積分 \int_0^t

この積分を数値的に解くには、 を使用したいと思いますnumpy.convolve()現在、オンライン ヘルプでわかるように、たたみ込みは -infinity から +infinity に正式に行われます。これは、評価のために配列が互いに完全に移動することを意味します。これは私が必要とするものではありません。畳み込みの正しい部分を確実に選択する必要があることは明らかです-これが正しい方法であることを確認できますか、またはそれを正しく行う方法と(おそらくさらに重要な)理由を教えてください。

res = np.convolve(J_t, dF, mode="full")[:len(dF)]

J_t は分析関数であり、必要な数のポイントを評価できます。dF は測定データの導関数です。この試みのlen(J_t) = len(dF)ために私が選択したのは、私の理解ではこれ以上必要ないからです。

いつものように、あなたの考えをありがとう、あなたの助けに感謝します!


背景情報(興味のある方向け)

これらのタイプの積分は、物体の粘弾性挙動 (または、このトピックに慣れている場合は、電圧変化中の電気回路の応答) を評価するために使用できます。粘弾性の場合、J(t) はクリープ コンプライアンス関数であり、F(t) は経時的な偏差ひずみである可能性があり、この積分によって偏差応力が得られます。たとえば、次の形式の J(t) があるとします。

J_t = lambda p, t: p[0] + p[1]*N.exp(-t/p[2])

これをp = [J_elastic, J_viscous, tau]使用すると、「有名な」標準線形ソリッドになります。積分限界は、測定の開始 t_0 = 0 と対象の瞬間 t です。

4

4 に答える 4

6

それを正しくするために、次の 2 つの関数を選択しました。

a(t) = t
b(t) = t**2

数学を行うのは簡単で、あなたのケースで定義されている「畳み込み」が値を取ることを見つけるのは簡単です:

c(t) = t**4 / 12

それでは、それらを試してみましょう:

>>> delta = 0.001
>>> t = np.arange(1000) * delta
>>> a = t
>>> b = t**2
>>> c = np.convolve(a, b) * delta
>>> d = t**4 / 12
>>> plt.plot(np.arange(len(c)) * delta, c)
[<matplotlib.lines.Line2D object at 0x00000000025C37B8>]
>>> plt.plot(t[::50], d[::50], 'o')
[<matplotlib.lines.Line2D object at 0x000000000637AB38>]
>>> plt.show()

ここに画像の説明を入力

したがって、上記を実行することで、 と の両方にa要素bがある場合、 の最初の要素でn正しい畳み込み値が得られます。nc

次の説明が意味を成すかどうかはわかりませんが、ここで説明します...畳み込みをy軸に沿って関数の1つをミラーリングし、x軸に沿ってスライドさせて積の積分を計算すると考える場合各ポイントでは、定義 numpy の領域外ではゼロでパディングされているかのように処理されるため、最初の関数がゼロ未満であり、2 番目の関数がゼロであるため、0 から t までの積分間隔を効果的に設定する方法を簡単に確認できます。 t の上は 0 です。もともとは 0 の下の 0 でしたが、ミラーリングされて t を右に移動しました。

于 2013-04-12T16:46:54.243 に答える
0

アライメントの感触をつかむのに役立つ場合は、インパルスのペアを畳み込んでみてください。matplotlib を使用 (を使用ipython --pylab):

In [1]: a = numpy.zeros(20)
In [2]: b = numpy.zeros(20)
In [3]: a[0] = 1
In [4]: b[0] = 1
In [5]: c = numpy.convolve(a, b, mode='full')
In [6]: plot(c)

結果のプロットから、最初のサンプルcがオーバーラップの最初の位置に対応することがわかります。この場合、との最初のサンプルのみが重なります。残りはすべて未定義の空間に浮かんでいます。この未定義のスペースを効果的にゼロに置き換えます。これは、ゼロ以外の 2 番目の値を設定すると確認できます。abnumpy.convolve

In [9]: b[1] = 1
In [10]: plot(numpy.convolve(a, b, mode='full'))

この場合、前と同様に、プロットの最初の値は 1 です ( の 2 番目の値bがまったく寄与していないことを示しています)。

于 2013-04-12T08:29:11.960 に答える