sympy args意外的答案

时间:2018-07-26 22:14:38

标签: sympy

我下面的代码

f = lambda x: 2**(x+1)
f_sym = f(sympy.symbol.symbols('x'))
print f_sym.args

输出为(2,x + 1)。

为什么输出不是x?

我有一些函数由上一个函数组成,而最终表达式并没有简化:

f = lambda x, y: (x/y)**.5
f_sym = f(sympy.symbol.symbols('x'), sympy.symbol.symbols('y'))
symbols = f_sym.free_symbols
aux = np.asarray([sympy.derive_by_array(f_sym, symbol) for symbol in [symbols]])
uc_matrix = np.diag(sympy.symbols(','.join(['u_{%s}'%symbol for symbol in symbols])))**2
uf = ((np.dot(np.dot(aux,uc_matrix), aux.T))**.5)[0][0]
y = uf/f_sym
print (y**2).expand().simplify()

1 个答案:

答案 0 :(得分:1)

按照SymPy的说法,f_sym是表达式

Pow(Integer(2), Add(Symbol('x'), Integer(1)))

,您可以从srepr(f_sym)中找到。因此,该函数正在“上电”,并且该函数的参数为​​2和x + 1。

如果您特别想要指数,f_sym.args[1]将返回该指数。

认识到f_sym不是函数很重要。它不接受任何参数,也不返回任何东西。这是一个SymPy表达式。此表达式中的x+1没有特殊含义:它只是它的一部分,就像数字2一样。


要回答您的后续问题:表达式将简化为

u_{x}**2/(4*x**2) + u_{y}**2/(4*y**2)

如果在指数中使用有理数sympy.Rational(1, 2)而不是浮点数.5。浮点数对SymPy有害。达到相同效果的其他方法,只需键入以下内容即可:

  • 使用sympy.sqrt函数而不是提高功率1/2
  • sympy.S(1)/2会创建相同的Rational对象,因为在除法之前将1变成了SymPy对象。

参考:Python numbers vs. SymPy Numbers