Python sympy 符号

标签 python sympy

当我使用“x”和“z”作为符号时,这段代码没有问题:

from sympy import *
x, z = symbols('x z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))
y.subs({x: 5, z: 25})

但是当我使用“q”和“a”时,solve 没有给我任何解决方案。

q, a = symbols('q a')
y = -6*q**2 + 2*q*a**0.5 + 50*q - a
solve((diff(y, q), diff(y, a)))
y.subs({q: 5, a: 25})

如您所见,我使用“subs”来检查目标函数中是否有拼写错误。

更新:我使用“Symbol”单独设置每个变量,但再次使用“q”和“a”不起作用。

# This works
x = Symbol('x')
z = Symbol('z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))

# This does not work
q = Symbol('q')
a = Symbol('a')
y = -6*q**2 + 2*q*a**0.5 + 50*q-a
solve((diff(y, q), diff(y, a)))

谢谢。

最佳答案

知道了!

这完全取决于变量的字母顺序。

如果您在第一个示例中将 x 替换为 z 并将 z 替换为 x 它也会停止工作.

内部 solve 将表达式发送到 sympy.solvers 中的函数 _solve,然后它会尝试求解您的方程,但多次失败。

最后,作为最后的努力,它尝试通过从中选取符号来解决 -sqrt(a) + qx - sqrt(z)一个内部函数 _ok_syms,带有一个按字母顺序排序的参数(即使没有这个参数它仍然会,但如果用 reversed 包装它神奇地使你的例子完全相反方式)。

因此它确实将 x - sqrt(z) 求解为 x: sqrt(z)-sqrt(a) + q作为 a: q**2

虽然在第一种情况下它以易于求解的 50 - 10*sqrt(z) 结束,但在第二种情况下它在 -12*q + 2*sqrt 上丢失(q**2) + 50 因为它无法简化 sqrt(q**2)

来源: 大量测试: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py

关于Python sympy 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64637807/

相关文章:

python - 常量类实例是 PEP8 命名约定的异常(exception)吗?

python - os.system 不工作,但在命令提示符下输入同样的东西可以工作

参数大小向量的python符号求和与微分

python - 在Python中求解非线性方程: the answer is the same as initial guess

python - 无法使用 sympy 和 markdown 显示计算步骤

c++ - 在 Linux 中搜索用户定义的文件

python - 用Python和OpenCV合并这两张裁剪过的皮肤和原始自拍的图像?

python - multiprocessing.cpu_count 和 os.cpu_count 的区别

python - 同情集 : iterate over intervals

python - (1,2) 是 (0, 3) 的子集,但如何在 sympy 中表示它?