在 Python 中求解二次方程组

计算科学 Python 非线性方程 scipy
2021-12-25 23:37:12

我想用数值求解一个二次方程组:

A11x1+A12x2+A13x3+B12x1x2+B13x1x3=C1 A21x1+A22x2+A23x3+B21x2x1+B23x2x3=C2 A31x1+A32x2+A33x3+B31x3x1+B32x3x2=C3

在哪里Aij,Bij,Ci是实数并且xi变量(这里只有三个,但我想解决多达 50 个变量的系统)。

我已经尝试过 Newton-Krylov 方法(在 scipy 中实现),但它似乎并不稳定。我现在正在尝试使用在 sympy 中实现的例程,但我遇到了这个示例说明的问题:

from sympy import *
from sympy.abc import x,y,z
Equations = [x**2 + y + z - 1,
           x + y**2 + z - 1,
           x + y + z**2 - 1]

如果我们使用solve_poly system我们获得

solve_poly_system(Equations, x, y, z)
[(0, 0, 1), (0, 1, 0), (1, 0, 0), (-1 + sqrt(2), -1 + sqrt(2), -1 + sqrt(2)), (-sqrt(2) - 1, -sqrt(2) - 1, -sqrt(2) - 1)]

并且,如果我们使用solve_triangulated我们获得

solve_triangulated(Equations, x, y, z)
[(0, 0, 1), (0, 1, 0), (1, 0, 0)]

一些解决方案没有找到solve_triangulated是什么原因?我们可以找到什么样的解决方案 solve_triangulated

1个回答

你为什么不使用普通的牛顿?您的系统非常简单,您可以找到它的封闭式雅可比行列式并编写您自己的牛顿求解器。如果您只需要一个接近给定起点的解决方案(就像您在MO上所写的那样),那么它的效果非常好。

(正如我在 MO 上所写的,我想最多可以有2number of variables真正的解决方案,因此找到所有解决方案对于n50.)