python - 为什么 SymPy 无法求解具有复杂系数的二次方程

标签 python sympy solver quadratic

SymPy 可以轻松求解具有短简单系数的二次方程。 例如:

from pprint import pprint
from sympy import *
x,b,f,Lb,z = symbols('x b f Lb z')
eq31 = Eq((x*b + f)**2, 4*Lb**2*z**2*(1 - x**2))
pprint(eq31)
sol = solve(eq31, x)
pprint(sol)

但是系数稍大一点 - 它不能:

from pprint import pprint
from sympy import *
c3,b,f,Lb,z = symbols('c3 b f Lb z')
phi,Lf,r = symbols('phi Lf r')
eq23 = Eq(
    (
        c3 * (2*Lb*b - 2*Lb*f + 2*Lb*r*cos(phi + pi/6))
        + (Lb**2 - Lf**2 + b**2 - 2*b*f + 2*b*r*cos(phi + pi/6) + f**2 - 2*f*r*cos(phi + pi/6) + r**2 + z**2)
    )**2,
    4*Lb**2*z**2*(1 - c3**2)
    )
pprint(eq23)
print("\n\nSolve (23) for c3:")
solutions_23 = solve(eq23, c3)
pprint(solutions_23)

为什么?

最佳答案

这并不是 Sympy 特有的 - 其他程序(例如 Maple 或 Mathematica)也遇到同样的问题:求解方程时,solve 需要选择适当的求解策略(例如 Sympy's Solvers )。关于变量和方程结构的假设。这些选择通常是启发式的并且通常是不正确的(因此没有解决方案,或者首先尝试错误的策略)。此外,变量的假设通常过于宽泛(例如,复数而不是实数)。

因此,对于复杂的方程,求解策略通常必须由用户给出。对于您的示例,您可以使用:

sol23 = roots(eq23.lhs - eq23.rhs, c3)

关于python - 为什么 SymPy 无法求解具有复杂系数的二次方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24882720/

相关文章:

python - Pandas 没有安装在 virtualenv 中,尽管看起来是这样

Python multiprocessing.Manager 和 os.fork 产生奇怪的行为

python - 从 SymPy 表达式中删除系数

ipython - ipython 笔记本中几何代数的良好输出

z3 - 是否有可能在 Z3 中或在传递到 Z3 之前检测到不一致的方程?

optimization - 魔方遗传算法求解器?

python - 使用 Pandas 和 Regex 将文件名写入 csv

python - 什么是Python的Framework构建?

python - 如何使用 sympy 查找表达式的补集?

Python - 升级我的迷宫求解器程序