在 sympy 中评估系数而不是指数

Posted

技术标签:

【中文标题】在 sympy 中评估系数而不是指数【英文标题】:Evaluating coefficients but not exponents in sympy 【发布时间】:2018-02-22 16:47:49 【问题描述】:

我正在使用 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 不计算指数,甚至只是提取答案的非符号部分,以便我可以创建自己的打印函数,以我想要的方式格式化输出?

【问题讨论】:

【参考方案1】:

一种方法是选择所有 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

有理指数逃避数值计算,是有理数的实例。

【讨论】:

抱歉,我所说的问题不够笼统——除了数值系数之外,我还有多个符号因素。我试图让你的方法适应这种情况,但我想出了如何在两个符号变量上使用 as_independent。 好的,我重写了脚本并包含了一个包含两个变量的更复杂的示例。

以上是关于在 sympy 中评估系数而不是指数的主要内容,如果未能解决你的问题,请参考以下文章

sympy:如何评估绝对值的积分

sympy - 扩展时如何加法组合指数?

兰德指数函数(聚类性能评估)

为啥 SymPy 不将 (-x**3)**(2/3) 简化为 x**2?

r 添加自定义评估函数度量(matthew相关系数)以评估插入符号模型

机器学习:知道模型评估中的SSE“肘”部法SC系数和CH系数的实现原理