我下面的代码
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()
答案 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对象。