gpt4 book ai didi

python - sympy:使用 Wild 符号作为函数的输入

转载 作者:太空宇宙 更新时间:2023-11-04 05:29:43 25 4
gpt4 key购买 nike

考虑 python/sympy 中的以下表达式:

from sympy.abc import x, y
expression = 3*x**2*y**1 + x**2*y**3

现在我想通过使用模式匹配将 x**n*y**m 替换为 max(n,m):

from sympy import Wild
n = Wild('n')
m = Wild('m')
expression = expression.replace(x**n*y**m,max(n,m))

但是,我得到一个TypeError:

Traceback (most recent call last):
File "wild.py", line 15, in <module>
expression = expression.replace(x**n*y**m,max(n,m))
File "/usr/lib/python3/dist-packages/sympy/core/relational.py", line 103, in __nonzero__
raise TypeError("cannot determine truth value of\n%s" % self)
TypeError: cannot determine truth value of
m_ > n_

问题显然是,在匹配表达式时,sympy 在将其转发给 max 函数之前不会将 Wild 符号的值转换为匹配值。有什么方法可以使它起作用吗?

请注意,这是我遇到的更普遍问题的一个简单示例,因此不能很好概括的变通方法不是很有帮助。我特别希望有一个使用表达式匹配的解决方案。

更新:按照sandwich的建议,将max(n,m)替换为(m+n+abs(m-n))/2有效,但是,我在实际程序中使用的功能要复杂得多。关于 sandwich 提到的 replace 从表达式树底部开始执行替换的问题:如果我使用 exact=True 并定义 f = sympy.Function( 'f') 然后下面的工作(除了我必须单独处理一些情况):

expression = expression.replace(x**n*y**m,f(n,m),exact=True)

但是,它仍然不适用于 max(n,m)

最佳答案

<罢工> max是内置的 Python 函数,它会尝试立即求值,因此会出现错误(当它们是符号时,它无法确定 nm 中的哪一个更大)。您可能需要 SymPy Max功能,象征性地工作。 my_func您在答案中定义的实际上是 Max 的基本实现.

<罢工>
In [14]: expression = expression.replace(x**n*y**m, Max(n,m))

In [15]: expression
Out[15]: 4

<罢工>

这似乎不起作用(答案 4 是错误的)。问题是它匹配 x**2作为x**2*y**0 .由于替换函数的数学值取决于表达式的形式,这是有问题的,因为 SymPy 试图变得聪明。你实际上可以制作nm 0 与 Wild('n', exclude=[x, 0]) 不匹配, 但随之而来的问题是它与 x**2*y 不匹配作为x**2*y**1 .

所以我建议将您的表达式转换为多项式并准确地进行替换。希望这可以很好地概括您实际正在做的事情

In [18]: Poly(expression, x, y)
Out[18]: Poly(x**2*y**3 + 3*x**2*y, x, y, domain='ZZ')

In [19]: Poly(expression, x, y).terms()
Out[19]: [((2, 3), 1), ((2, 1), 3)]

In [20]: sum(max(pows)*coeff for pows, coeff in Poly(expression, x, y).terms())
Out[20]: 9

关于python - sympy:使用 Wild 符号作为函数的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37516481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com