作者holycity (迪兒~)
看板Python
標題[問題] integrate (-inf,inf) 實際的積分範圍
時間Mon Jan 13 11:47:37 2020
小弟要做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://webptt.com/m.aspx?n=bbs/Python/M.1578887259.A.56A.html
1F:→ as30385438: 程式沒這麼厲害好嗎, 定積分不要丟-inf到inf給他 01/13 15:31
2F:→ GeoMeTric: 1. scipy 的 quad 允許上下界為 inf。 01/13 21:48
3F:→ GeoMeTric: 2. 若上下界有其一為 inf,會轉換至 (0, 1) 區間。 01/13 21:49
4F:→ GeoMeTric: 3. QUADPACK 並不適用任何函數,尤其是過大的積分範圍 01/13 21:52
5F:→ 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
6F:→ GeoMeTric: 我不是這方面的專家,以下為個人看法。 01/14 19:59
7F:→ GeoMeTric: 1. 先尋找是否存在解析解,如回文使用的 sympy。 01/14 19:59
我要做convolution的其中一個function是不連續的函數
數學底子不好不過想不到不連續函數有什麼可能的解析解QQ
8F:→ GeoMeTric: 2. 是否能變數變化將定義域對應至 (0, 1) 區間。 01/14 20:00
G大所說的變數變化是指將兩個函數的定義域都投影到(0,1)區間的對應函數
然後做convolution時直接把積分上下界設定為(0,1)嗎?
我上述的不連續的function有明確的時間範圍,可以投影過去
不過另一個function的值則是從-oo到+oo
這個function在t非常negative或非常positive時值很接近零
有在考慮是否乾脆直接假設超出一個範圍就當作是0,去人為的抓一個上下界
不過也很擔心這是否會對convolution的結果造成影響
另外定義域要映射到另一個區間的話也要考慮單位的轉換
(小弟實際上要解決的是一個物理問題)
不過如果真的這種方法比較可行的話還是不排除試試
9F:→ GeoMeTric: 3. 逐漸增加積分範圍,看結果是否收斂。 01/14 20:01
目前已經知道別人的paper中有做出結果
小弟目前的階段是要去再現別人convolution的結果是否正確
假設對方的結果正確,那我做的積分結果應該會要是收斂的
只是差在目前自己嘗試出來的結果跟paper的不同
所以在檢查數值運算上是否哪邊有問題沒注意到
於是在檢驗數值運算的過程就開始遇到上述的一些狀況QQ
※ 編輯: holycity (1.164.168.128 臺灣), 01/17/2020 15:29:30