我需要生成计算报告,其中详细介绍了逐步的计算,显示了使用的公式,然后显示了如何获得结果。
我已经看过使用sympy显示符号方程式。问题在于,sympy符号存储为变量,因此我也无法存储该符号的数值。
例如,对于公式σ= My / I,我需要显示每个符号的值,然后是符号公式,然后是替换了值的公式,最后是公式的分辨率。
M = 100
y = 25
I = 5
σ=我/我
σ= 100 * 25/5
σ= 5000
我是编程新手,这是我一直在努力的事情。我考虑过也许要建立自己的课程,但不确定如何区分这些不同的形式。在上面的示例中,σ在某一点是一个数值,是符号表达式的一半,也是数值表达式的一半。
答案 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循环,而不是一遍又一遍地编写相同的代码。