2013-04-12 35 views
4

我有類型的卷積積分:蟒numpy.convolve解決卷積從0積分限值代替到t -t到t

convolution integral \int_0^t

爲了解決這個積分數值,我想使用numpy.convolve()。現在,正如您在online help中看到的那樣,卷積形式上是從無窮大到無窮大的,這意味着數組完全相互移動以進行評估 - 這不是我所需要的。我顯然需要確保選擇卷積的正確部分 - 你能確認這是正確的方式嗎?或者告訴我該怎麼做,並且(甚至更重要)爲什麼?

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]這將是 「著名的」 standard linear solid。積分限制是測量t_0 = 0和感興趣時刻t的開始。

回答

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() 

enter image description here

因此,通過做好以上,如果同時你abn元素,你得到的c第一n元素右卷積值。

不知道下面的解釋是否有意義,但是在這裏它會變...如果您認爲卷積是沿着y軸鏡像其中一個函數,然後沿着x軸滑動並計算積分每個點的產品都很容易看到,因爲定義numpy區域以外的區域如同用零填充一樣,所以有效地設置從0到t的積分區間,因爲第一個函數的零點低於零,第二個在t之上爲零,因爲它最初在零以下爲零,但已被鏡像並移動到右側。

+0

我不認爲我們的努力是值得的:( –

+0

完美的點,謝謝海梅。 – Faultier

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第一樣本對應於重疊的第一位置所得到的曲線圖看到。在這種情況下,只有第一個樣本ab重疊。其餘的都在未定義的空間中浮動。 numpy.convolve有效地替換用零,這如果設置一個第二非零值可以看到這樣未定義空間:

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

在這種情況下,曲線圖的第一個值是1,如前(示出的是,第二價值b完全沒有貢獻)。

+0

對不起後期的答覆亨利 - 我在工作時的所有戰線都在滅火;對它的原因感到不適。 – Faultier

1

我解決這個同樣的問題,使用效率非常低,但功能上正確的算法解決了這個問題:

def Jfunk(inz,t): 

    c0 = inz[0] 
    c1 = inz[1] 
    c2 = inz[2] 

    J = c0 - c1*np.exp(-t/c2) 

    return J 

def SLS_funk(inz, t, dl_dt): 

    boltz_int = np.empty(shape=(0,)) 

    for i,v in enumerate(t, start=1): 

     t_int = t[0:i] 

     Jarg = v - t[0:i] 

     J_int = Jfunk(inz,Jarg) 

     dl_dt_int = dl_dt[0:i] 

     inter_grand = np.multiply(J_int, dl_dt_int) 

     boltz_int = np.append(boltz_int, simps (inter_grand, x=t_int)) 

    return boltz_int 

多虧了這個問題,它的答案,我基礎上,numpy的是能夠實現更好的解決方案上面提出的卷積函數。在OP很好奇的情況下,我做了兩種方法的時間比較。

對於SLS(3個參數j功能)與20000的時間點:

使用numpy的卷積:〜0.1秒

使用蠻力方法:〜7.2秒