我嘗試使用下面的代碼(不相關的部分去掉)來解決積分方程方程scipy.optimize.fsolve精度:改善與涉及集成
def _pdf(self, a, b, c, t):
pdf = some_pdf(a,b,c,t)
return pdf
def _result(self, a, b, c, flag):
return fsolve(lambda t: flag - 1 + quad(lambda tau: self._pdf(a, b, c, tau), 0, t)[0], x0)[0]
這需要一個概率密度函數,並找到了結果tau
使得從tau到無窮大的pdf的積分等於flag
。請注意,x0
是腳本中其他位置定義的根(浮點)估計值。還請注意,flag
是一個非常小的數字,大小爲1e-9
。
在我的應用程序中,fsolve只能成功找到約50%的時間。它通常只會返回x0
,顯着偏向我的結果。對於pdf的積分沒有封閉的形式,所以我不得不用數字的方式進行積分,並認爲這可能會導致一些不準確的情況?
編輯:
這已經被使用比下面描述的其它的方法來解決,但我想獲得quadpy工作,看看結果在所有提高。我試圖去工作的具體代碼如下:
import quadpy
import numpy as np
from scipy.optimize import *
from scipy.special import gammaln, kv, gammaincinv, gamma
from scipy.integrate import quad, simps
l = 226.02453163
mu = 0.00212571582056
nu = 4.86569872444
flag = 2.5e-09
estimate = 3 * mu
def pdf(l, mu, nu, t):
return np.exp(np.log(2) + (l + nu - 1 + 1)/2 * np.log(l * nu/mu) + (l + nu - 1 - 1)/2 * np.log(t) + np.log(
kv(nu - l, 2 * np.sqrt(l * nu/mu * t))) - gammaln(l) - gammaln(nu))
def tail_cdf(l, mu, nu, tau):
i, error = quadpy.line_segment.adaptive_integrate(
lambda t: pdf(l, mu, nu, t), [tau, 10000], 1.0e-10
)
return i
result = fsolve(lambda tau: flag - tail_cdf(l, mu, nu, tau[0]), estimate)
當我運行此我從assert all(lengths > minimum_interval_length)
得到一個斷言錯誤。我不太確定如何解決這個問題。任何幫助將非常感謝!
如果我正確地讀取了您的代碼,您設置它的方式會浪費9位數的精度;難怪scipy正在掙扎。你不能從_t_到+ infinity執行積分嗎? –
@PaulPanzer對不起,但9位數字從哪裏來? – oirectine
如果我正確理解你,你最終希望匹配_flag_,這是1e-9的順序。但是你在1 - _flag_上做了實際的根發現,這意味着如果你用相對精度爲1e-12(這是相當苛刻的並且不總是可能的)然後從1 - _S_變回到_S_,然後_S_將會有1e-12階的絕對誤差,所以相對誤差爲1e-3階。如果你可以從_tau_到+ infinity集成,那麼你可以直接與_flag_比較,這個問題就會消失。 –