[英]How can I fix the Zero Division Error for a limit of a function with a singular point?
我試圖避免極限的零除法錯誤
f(u) = 1/(1-u) as u tends to 1^{-}
,然后f(u) tends to +oo (inf)
我的目標是讓函數 u 接近但不達到零。 我會將滿足上述極限條件的1/(1-u)
函數添加到另一個 Python 函數中描述的方程中。 我用兩種不同的方式對這個限制進行了編碼,但它給出了以下錯誤。
我怎樣才能避免這個錯誤並仍然將這個函數添加到我的方程式中?
我定義限制的第一種方法:
class F():
def source(self):
self.f = 1 / (1 - self.u)
self.limit_f = limit(self.f, self.u, 1, '-')
錯誤:
<ipython-input-13-c16795f88d58>:18: RuntimeWarning: divide by zero encountered in true_divide
self.f = 1 / (1 - self.u)
第二種方式:
class F():
def source(self):
self.f = 1 / (1 - self.u)
if (self.u < 1).all():
self.limit_f == limit(self.f, self.u, 1, '-')
if (self.u == 1).all():
self.f == oo
錯誤:
<ipython-input-13-c16795f88d58>:18: RuntimeWarning: divide by zero encountered in true_divide
self.f = 1 / (1 - self.u)
<ipython-input-13-c16795f88d58>:29: RuntimeWarning: divide by zero encountered in true_divide
self.f = 1 / (1 - self.u)
先感謝您!
在您嘗試在第二行中捕獲它之前,第一行執行錯誤。 解決這個問題的一種變體是使用掩碼
f = np.ones_like(u)*np.inf # default to infinite value
singular = u==1 # find out where infinity occurs
f[~singular] = 1/(1-u[~singular]) # compute value where not infinity
這種語法沒有意義(除非你使用一些庫,比如numpy
或者你沒有提到的其他東西):
if (self.u < 1).all():
在布爾條件下調用all()
將導致AttributeError: 'bool' object has no attribute 'all'
如果您正在使用浮點數,則與 0 的比較也沒有太大意義(由於浮點表示錯誤)。 您應該定義一個epsilon
,您將為其定義條件,以“接近”您允許的 0。
關於“限制”,我建議采用這種方法(這是一種矯枉過正,請參閱代碼中的注釋......但是因為你沒有非常清楚地解釋你的目標是什么):
u
的價值f
將保留先前的(有效)值try:
self.f = 1 / (1 - self.u)
except ZeroDivisionError:
self.limit = self.u # This is the "first" value of `u` which causes the error, but it boils down to u being 1 or 1.0, otherwise it won't happen
看看這個例子(在 python 3.11 中):
x = 1 / (1-10e1000000) # 10e1000000 is quite a big number
print(x) # -0.0 <class 'float'>
如評論中所述,這似乎根本不是問題,因為 u-> 無窮大。
采用這個簡單的功能(不需要上課)。
def f(u):
f = 1 / (1-u)
return f
u = 10000000000000000
y = f(u)
print(y)
這將是唯一需要處理的情況 (u=1)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.