评估系数而不是 sympy 中的指数
Evaluating coefficients but not exponents in sympy
我正在使用 sympy 对一组幂律进行非线性求解,最后得到了一堆解决方案,例如
20394*sqrt(6)*x**(2/3)*y**(1/4)
我想折叠数值系数,同时暴露指数的有理性质,即我希望我的代码输出
49954.8938143201*x**(2/3)*y**(1/4)
然而,当我使用 evalf() 时,我得到
49954.8938143201*x**0.666666666666667*y**0.25
有什么方法可以让 sympy 不计算指数,甚至只是提取答案的非符号部分,这样我就可以创建自己的打印函数,以我想要的方式格式化输出?
一种方法是选择所有 Mul 和 Add 子表达式,将它们的参数分为数字和符号(基于是否包含任何符号),然后对具有数字参数的部分进行数值计算。
expr = 20394*sqrt(6)*x**(S(2)/3) + 3*log(3)*y**(S(3)/2) - 3*sqrt(7) + (3+sqrt(2))*x*y
eval_dict = {}
for a in expr.atoms(Mul, Add):
numeric = [arg for arg in a.args if not arg.has(Symbol)]
symbolic = [arg for arg in a.args if arg.has(Symbol)]
eval_dict[a] = a.func(a.func(*numeric).evalf(), a.func(*symbolic))
print(expr.subs(eval_dict))
这会打印
49954.8938143201*x**(2/3) + 4.41421356237309*x*y + 3.29583686600433*y**(3/2) - 7.93725393319377
有理指数逃避数值计算,是 Rational 的实例。
我正在使用 sympy 对一组幂律进行非线性求解,最后得到了一堆解决方案,例如
20394*sqrt(6)*x**(2/3)*y**(1/4)
我想折叠数值系数,同时暴露指数的有理性质,即我希望我的代码输出
49954.8938143201*x**(2/3)*y**(1/4)
然而,当我使用 evalf() 时,我得到
49954.8938143201*x**0.666666666666667*y**0.25
有什么方法可以让 sympy 不计算指数,甚至只是提取答案的非符号部分,这样我就可以创建自己的打印函数,以我想要的方式格式化输出?
一种方法是选择所有 Mul 和 Add 子表达式,将它们的参数分为数字和符号(基于是否包含任何符号),然后对具有数字参数的部分进行数值计算。
expr = 20394*sqrt(6)*x**(S(2)/3) + 3*log(3)*y**(S(3)/2) - 3*sqrt(7) + (3+sqrt(2))*x*y
eval_dict = {}
for a in expr.atoms(Mul, Add):
numeric = [arg for arg in a.args if not arg.has(Symbol)]
symbolic = [arg for arg in a.args if arg.has(Symbol)]
eval_dict[a] = a.func(a.func(*numeric).evalf(), a.func(*symbolic))
print(expr.subs(eval_dict))
这会打印
49954.8938143201*x**(2/3) + 4.41421356237309*x*y + 3.29583686600433*y**(3/2) - 7.93725393319377
有理指数逃避数值计算,是 Rational 的实例。