看板 Python 關於我們 聯絡資訊
小弟要做convolution 原本是用numpy.convolve但出來的結果有些問題 後來改成用scipy.integrate.quad去乖乖做convolution的積分 測試了幾個簡單的functions結果正確,但也有測到結果很奇怪的 試著print了一下scipy.integrate.quad實際做積分時用的數字 發現他只是很快的在定義域抓一些數字去做計算 尤其是積分範圍是(-inf, inf)時抓的數字範圍很小 測試的code如下: import numpy as np import math from scipy import integrate def fn_1(t): print(t) return np.power(t, 2) * math.exp(-t**2) temp_int_1 = integrate.quad(fn_1, -np.inf, np.inf) temp_int_2 = integrate.quad(fn_1, -10**10, 10**10) print(temp_int_1) print(temp_int_2) -- 積分過程讀取fn_1時會順便print當時帶入的t 有趣的是兩組不同的積分範圍帶入的t很不同 另外積分範圍為[-10**10, 10**10]時輸出的結果是0 但上面測試的函數為偶函數,計算出來的結果有矛盾 想請知道箇中問題的高手幫忙解惑QQ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.160.10.233 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1578887259.A.56A.html
as30385438: 程式沒這麼厲害好嗎, 定積分不要丟-inf到inf給他 01/13 15:31
GeoMeTric: 1. scipy 的 quad 允許上下界為 inf。 01/13 21:48
GeoMeTric: 2. 若上下界有其一為 inf,會轉換至 (0, 1) 區間。 01/13 21:49
GeoMeTric: 3. QUADPACK 並不適用任何函數,尤其是過大的積分範圍 01/13 21:52
GeoMeTric: + 相對小的範圍有顯著地的值。 01/13 21:53
想請教一下G大,目前我想做convolution的計算 function 1的定義域是(-inf, inf) function 2的定義域是(0, inf) (目前用if t<0, fun_2=0 去讓定義域延展到全實數域) 兩函數在t<10**9的範圍內都仍有不小的值(>=1) 到t~=10**10左右值才會降到很小(<0.01) 有什麼適合的module可以用嗎? 還是說python在這部分沒辦法做,得要用其他科學計算工具?QQ ※ 編輯: holycity (1.160.10.233 臺灣), 01/13/2020 23:02:03
GeoMeTric: 我不是這方面的專家,以下為個人看法。 01/14 19:59
GeoMeTric: 1. 先尋找是否存在解析解,如回文使用的 sympy。 01/14 19:59
我要做convolution的其中一個function是不連續的函數 數學底子不好不過想不到不連續函數有什麼可能的解析解QQ
GeoMeTric: 2. 是否能變數變化將定義域對應至 (0, 1) 區間。 01/14 20:00
G大所說的變數變化是指將兩個函數的定義域都投影到(0,1)區間的對應函數 然後做convolution時直接把積分上下界設定為(0,1)嗎? 我上述的不連續的function有明確的時間範圍,可以投影過去 不過另一個function的值則是從-oo到+oo 這個function在t非常negative或非常positive時值很接近零 有在考慮是否乾脆直接假設超出一個範圍就當作是0,去人為的抓一個上下界 不過也很擔心這是否會對convolution的結果造成影響 另外定義域要映射到另一個區間的話也要考慮單位的轉換 (小弟實際上要解決的是一個物理問題) 不過如果真的這種方法比較可行的話還是不排除試試
GeoMeTric: 3. 逐漸增加積分範圍,看結果是否收斂。 01/14 20:01
目前已經知道別人的paper中有做出結果 小弟目前的階段是要去再現別人convolution的結果是否正確 假設對方的結果正確,那我做的積分結果應該會要是收斂的 只是差在目前自己嘗試出來的結果跟paper的不同 所以在檢查數值運算上是否哪邊有問題沒注意到 於是在檢驗數值運算的過程就開始遇到上述的一些狀況QQ ※ 編輯: holycity (1.164.168.128 臺灣), 01/17/2020 15:29:30