如何修正一个奇异点函数极限的零除法误差?



我试图避免零除错误的限制

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

正如评论中提到的,这似乎根本不是问题,因为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)。

这种语法没有意义(除非您正在使用一些库,如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'> 

最新更新