0
x = symbols('x')
ch = 'exp(cos(cos(exp((sin(-0.06792841536110628))**(-6.045461643745118)))))'
f = lambdify(x, ch, "numpy")
print(float(f(2)))

它不起作用,程序正在运行并且永远不会结束(没有发出错误)。我的目标是通过尝试/除外来避免这种情况(在多种情况下),但我不能因为没有错误为什么没有错误被释放?我怎样才能避免这些情况?

谢谢你帮助我!

4

2 回答 2

0

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')
于 2021-04-29T16:31:44.027 回答
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。因此,请考虑一下您实际上希望错误上升的时间。

于 2021-04-29T12:10:50.090 回答