簡體   English   中英

如何修復具有奇異點的函數極限的零除法誤差?

[英]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)
  1. 對於較大的 u 值,這完全表現良好。
  2. 唯一的問題會出現在 u -> 1 時,在這種情況下,分母會 -> 0 並且 f 會變成無窮大。

這將是唯一需要處理的情況 (u=1)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM