在python中显示数字和符号表达式的最佳方法是什么?

时间:2020-07-17 21:23:07

标签: python sympy

我需要生成计算报告,其中详细介绍了逐步的计算,显示了使用的公式,然后显示了如何获得结果。

我已经看过使用sympy显示符号方程式。问题在于,sympy符号存储为变量,因此我也无法存储该符号的数值。

例如,对于公式σ= My / I,我需要显示每个符号的值,然后是符号公式,然后是替换了值的公式,最后是公式的分辨率。


M = 100

y = 25

I = 5

σ=我/我

σ= 100 * 25/5

σ= 5000


我是编程新手,这是我一直在努力的事情。我考虑过也许要建立自己的课程,但不确定如何区分这些不同的形式。在上面的示例中,σ在某一点是一个数值,是符号表达式的一半,也是数值表达式的一半。

1 个答案:

答案 0 :(得分:0)

希望以下帮助。这或多或少产生了您想要的东西。您将无法在代码中轻松看到第五行的工作。

from sympy import *

# define all variables needed
# trying to keep things clear that symbols are different from their numeric values
M_label, y_label, l_label = ("M", "y", "l")
M_symbol, y_symbol, l_symbol = symbols(f"{M_label} {y_label} {l_label}", real=True)
M_value, y_value, l_value = (100, 25, 5)
# define the dictionary whose keys are string names
# and whose values are a tuple of symbols and numerical values
symbols_values = {M_label: (M_symbol, M_value),
                  y_label: (y_symbol, y_value),
                  l_label: (l_symbol, l_value)}

for name, symbol_value in symbols_values.items():
    print(f"{name} = {symbol_value[1]}")  # an f-string or formatted string

sigma = M_symbol * y_symbol / l_symbol
print(f"sigma = {sigma}")

# option 1
# changes `/5` to 5**(-1) since this is exactly how sympy views division
# credit for UnevaluatedExpr
# https://stackoverflow.com/questions/49842196/substitute-in-sympy-wihout-evaluating-or-simplifying-the-expression
sigma_substituted = sigma\
    .subs(M_symbol, UnevaluatedExpr(M_value))\
    .subs(y_symbol, UnevaluatedExpr(y_value))\
    .subs(l_symbol, UnevaluatedExpr(l_value))
print(f"sigma = {sigma_substituted}")

# option 2
# using string substitution
# note this could replace words like `log`, `cos` or `exp` to something completely different
# this is why it is unadvised. The code above is far better for that purpose
sigma_substituted = str(sigma)\
    .replace(M_label, str(M_value))\
    .replace(y_label, str(y_value))\
    .replace(l_label, str(l_value))
print(f"sigma = {sigma_substituted}")

sigma_simplified = sigma\
    .subs(M_symbol, M_value)\
    .subs(y_symbol, y_value)\
    .subs(l_symbol, l_value)
print(f"sigma = {sigma_simplified}")

还请注意,如果您想将symbols_values词典更改为以键为符号,将值更改为数字值,则使用键时会遇到困难或看似错误的体验。那是因为如果您有x1 = Symbol("x")x2 = Symbol("x"),即使它们以相同的方式定义,SymPy有时也会将以上内容视为2个完全不同的变量。使用字符串作为键要容易得多。

如果您开始使用更多变量并选择以这种方式工作,我建议您使用列表和for循环,而不是一遍又一遍地编写相同的代码。

相关问题