x = symbols('x')
ch = 'exp(cos(cos(exp((sin(-0.06792841536110628))**(-6.045461643745118)))))'
f = lambdify(x, ch, "numpy")
print(float(f(2)))
它不起作用,程序正在运行并且永远不会结束(没有发出错误)。我的目标是通过尝试/除外来避免这种情况(在多种情况下),但我不能因为没有错误为什么没有错误被释放?我怎样才能避免这些情况?
谢谢你帮助我!
lambdify
是一个词法翻译器,将 sympy 表达式转换为 python/numpy 函数。
用符号创建一个字符串:
In [27]: ch = 'exp(cos(cos(exp((sin(x))**(-6.045461643745118)))))'
sympify(ch)
没有问题,因为它不需要做任何数值计算。所以lambdify
也有效:
In [28]: f=lambdify(x,ch)
In [29]: f?
Signature: f(x)
Docstring:
Created with lambdify. Signature:
func(x)
Expression:
exp(cos(cos(exp((sin(x))**(-6.045461643745118)))))
Source code:
def _lambdifygenerated(x):
return (exp(cos(cos(exp(sin(x)**(-6.045461643745118))))))
等价物mpmath
:
def _lambdifygenerated(x):
return (exp(cos(cos(exp(sin(x)**(mpf((1, 54452677612106279, -53, 56))))))))
和一个有效的数字评估:
In [33]: f(0j)
Out[33]: mpc(real='nan', imag='0.0')
一般来说,我不确定你能做到。SymPy 或 NumPy 将继续尝试计算数字,直到精度耗尽。但是您可以创建一个函数,如果数字超出您的兴趣范围,该函数将引发错误:
>>> from sympy import cos as _cos, I, exp
>>> def cos(x):
... if abs(x) > 10**20: raise ValueError
... return _cos(x)
>>> exp(cos(cos(exp(5*(1+I)))))
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "<string>", line 2, in cos
ValueError
>>> f = lambda x: exp(cos(cos(exp(x))))
>>> f(sin(-0.06792841536110628)**-6.045461643745118)
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "<string>", line 1, in <lambda>
File "<string>", line 2, in cos
ValueError
但是您必须仔细考虑何时要引发此类错误。例如,SymPy 计算没有问题,f(100)
或者f(100*I)
如果使用了非错误捕获cos
。因此,请考虑一下您实际上希望错误上升的时间。