我试图避免零除错误的限制
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)
- 对于较大的u值,这是完全正常的。
- 唯一的问题是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'>