我有一个字符串格式的函数f(t,u,v)
;例如't^2 * sint + u*(20 + t) + v*t'
。
如何解决这个问题?
我尝试这样做:
t = Symbol('t')
u = mu
v = mv
sol = eval(f)
但我收到错误消息 name 'sint' is not Defined
最佳答案
使用eval
并不是最好的方法。
SymPy parser具有允许使用 t^2
(称为 convert_xor
)和 sin t
(称为 implicit_application
)等内容解析字符串的选项>)。这是一个例子:
from sympy.parsing.sympy_parser import parse_expr, standard_transformations, implicit_application, convert_xor
transformations = standard_transformations + (implicit_application, convert_xor)
f = parse_expr('t^2 * sin t + u*(20 + t) + v*t', transformations=transformations)
现在 f
是 t**2*sin(t) + t*v + u*(t + 20)
并且您可以正常使用它,例如示例
solve(f.subs({Symbol('u'): 4}), Symbol('v')) # returns [-t*sin(t) - 4 - 80/t]
您可能需要引入 u, v, t = Symbols('u v t')
以便更轻松地访问这些符号。
不幸的是,sint
不会被识别为 sin(t)
;空间的缺乏是致命的。这必须进行预处理,可能使用正则表达式。例如,
import re
s = re.sub(r'\bsin', 'sin ', 't^2 * sint + u*(20 + t) + v*t')
在每个“sin”之后留一个空格(额外的空格不会造成伤害)。
关于python - 将字符串转换为数学函数: "name sint is not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49987329/