【问题标题】:How do I evaluate a single variable function with exponential with SymPy?如何使用 SymPy 评估具有指数的单变量函数?
【发布时间】:2019-05-18 13:05:38
【问题描述】:

我正在尝试使用 SymPy 来计算一些表达式,但有时,单独使用 .subs() 函数,或者后跟 .evalf(),不会给出任何浮点或整数值。

##--IMPORT
from mpmath import *
from sympy import *
from sympy.parsing.sympy_parser import parse_expr

x = symbols("x")

_fOfX = "e**x + x + 1"

if __name__== "__main__":
    #Function to sympy expression
    _sympyFunction = sympify(_fOfX)
    #Calcolo la derivata prima
    _dPrima = diff(_sympyFunction,x,1)
    _dPrima = _dPrima.subs(x,5)

    print(_dPrima.evalf())

对于那些想知道的人,是的,我需要解析一个字符串来获取函数。

【问题讨论】:

    标签: python python-3.x sympy


    【解决方案1】:

    问题在于 sympy 不会将e 解释为exp(1),而是将e 解释为符号,就像它将x 视为符号x 一样。如果你想让 sympy 了解你想要什么,你可以写 exp(1) 而不是 e

    请参阅下面的示例,了解 sympy 如何解释 string1 和 string2

    import sympy as sym
    
    string1 = "e"
    string2 = "exp(1)"
    
    sym_string1 = sym.sympify(string1)
    sym_string2 = sym.sympify(string2)
    
    print(type(sym_string1))
    print(type(sym_string2))
    
    e = sym.symbols('e')
    print(type(sym_string1.subs(e, sym.exp(1))))
    

    因此,您可以将字符串中的 e 替换为 exp(1) 或稍后替换。例如,您的代码可能如下所示:

    from mpmath import *
    from sympy import *
    from sympy.parsing.sympy_parser import parse_expr
    
    x = symbols("x")
    
    _fOfX = "e**x + x + 1"
    
    if __name__== "__main__":
        #Function to sympy expression
        _sympyFunction = sympify(_fOfX)
        #Calcolo la derivata prima
        _dPrima = diff(_sympyFunction,x,1)
        _dPrima = _dPrima.subs(x,5)
        #Replace e with exp(1)
        e = symbols('e')
        _dPrima = _dPrima.subs(e, exp(1))
    
        print(_dPrima.evalf())
    

    【讨论】:

    • e的定义不应该包含在'from mpath import *'中吗?
    • 它确实被导入了,但是 sympy 应该怎么知道呢? Sympy 无法处理您导入的所有其他包,因为它们太多甚至不兼容。所以它只使用它自己和它自己的定义。始终小心使用import *。想象一下你也会有from numpy import *。那么你最终会得到e 的两个独立(并且从技术角度来看是不同的)定义。
    猜你喜欢
    • 2023-01-12
    • 1970-01-01
    • 2023-01-20
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多