gpt4 book ai didi

sympy - sympy 中的一般表达式替换

转载 作者:行者123 更新时间:2023-12-01 00:25:17 28 4
gpt4 key购买 nike

我有两个单变量函数,f(x)g(x) ,我想替换 g(x) = y重写 f(x)正如一些 f2(y) .

这是一个有效的简单示例:

In [240]: x = Symbol('x')

In [241]: y = Symbol('y')

In [242]: f = abs(x)**2 + 6*abs(x) + 5

In [243]: g = abs(x)

In [244]: f.subs({g: y})
Out[244]: y**2 + 6*y + 5

但是现在,如果我尝试一个稍微复杂一点的例子,它就会失败:
In [245]: h = abs(x) + 1

In [246]: f.subs({h: y})
Out[246]: Abs(x)**2 + 6*Abs(x) + 5

是否有适用于此问题的通用方法?

最佳答案

表达式 abs(x)**2 + 6*abs(x) + 5实际上不包含 abs(x) + 1任何地方,所以没有什么可以替代的。
可以想象把它改成abs(x)**2 + 5*(abs(x) + 1) + abs(x) ,替换结果为 abs(x)**2 + 5*y + abs(x) .或者将其更改为 abs(x)**2 + 6*(abs(x) + 1) - 1 ,结果为 abs(x)**2 + 6*y - 1 .还有其他选择。结果应该是什么?
这个任务没有通用的方法,因为它不是一个明确定义的任务。
相比之下,替换f.subs(abs(x), y-1)是用 y-1 替换表达式树中所有出现的 abs(x) 的明确指令.它返回 6*y + (y - 1)**2 - 1 .abs(x) + 1上面的替换在 abs(x)**2 + 6*abs(x) + 5也是一个明确的说明:找到表达式 abs(x) + 1 的确切出现次数在表达式的语法树中 abs(x)**2 + 6*abs(x) + 5 ,并将这些子树替换为表达式 abs(x) + 1 的语法树.关于 heuristics though 有一个警告.
旁白:除了subs SymPy 有一个方法 .replace 它支持通配符,但我不希望它在这里有所帮助。根据我的经验,急于更换:

>>> a = Wild('a')
>>> b = Wild('b')
>>> f.replace(a*(abs(x) + 1) + b, a*y + b)
5*y/(Abs(x) + 1) + 6*y*Abs(x*y)/(Abs(x) + 1)**2 + (Abs(x*y)/(Abs(x) + 1))**(2*y/(Abs(x) + 1))
消除一个变量
SymPy 中没有“消除”。可以尝试使用 solve 来模拟它通过引入另一个变量,例如,
fn = Symbol('fn')
solve([Eq(fn, f), Eq(abs(x) + 1, y)], [fn, x])
它试图求解“fn”和“x”,因此“fn”的解是一个没有 x 的表达式。 如果这有效
事实上,它不适用于 abs() ;在 SymPy 中没有实现解决绝对值内的东西。这是一个解决方法。
fn, ax = symbols('fn ax')
solve([Eq(fn, f.subs(abs(x), ax)), Eq(ax + 1, y)], [fn, ax])
这输出 [(y*(y + 4), y - 1)]第一个术语是你想要的; fn 的解决方案.

关于sympy - sympy 中的一般表达式替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45382498/

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