Решение уравнений: solve и системы

SymPy решает уравнения как учебник: даёт точные корни «в буквах», включая комплексные и зависящие от параметров.

solve — функция SymPy, находящая точные символьные решения уравнения или системы уравнений.

Численно vs символьно

В разделе про SciPy мы искали корни численно — бисекцией, Ньютоном — и получали приближённые числа. SymPy решает символьно: для x² − 2 = 0 он вернёт не 1.41421..., а точное [-√2, √2]. И, в отличие от численных методов, находит все корни сразу, включая комплексные.

Как решать в SymPy

По умолчанию solve(expr) приравнивает выражение к нулю. Для явного уравнения используют Eq(левая, правая):

import sympy as sp
x = sp.symbols("x")

print(sp.solve(x**2 - 2, x))         # [-sqrt(2), sqrt(2)]
print(sp.solve(x**2 + 1, x))         # [-I, I] — комплексные корни
print(sp.solve(sp.Eq(x**2, 5*x - 6), x))   # [2, 3]

# квадратное уравнение в буквах:
a, b, c = sp.symbols("a b c")
print(sp.solve(a*x**2 + b*x + c, x)) # формула корней через дискриминант

Последняя строка выводит... классическую формулу корней квадратного уравнения! SymPy выводит её сам — то, что школьник заучивает наизусть.

Системы уравнений

solve решает и системы — передайте список уравнений и список неизвестных:

import sympy as sp
x, y = sp.symbols("x y")

sol = sp.solve([sp.Eq(x + y, 5),
                sp.Eq(x - y, 1)], [x, y])
print(sol)    # {x: 3, y: 2}

Проверим решение «руками»

SymPy утверждает, что корни x² − 5x + 6 = 0 — это 2 и 3. Проверим подстановкой на чистом Python (для квадратного уравнения формула корней проста):

import math

def solve_quadratic(a, b, c):
    d = b*b - 4*a*c                  # дискриминант
    if d < 0:
        return "комплексные корни"
    root_d = math.sqrt(d)
    x1 = (-b + root_d) / (2*a)
    x2 = (-b - root_d) / (2*a)
    return sorted([x1, x2])

roots = solve_quadratic(1, -5, 6)
print("Корни:", roots)
# проверка подстановкой
for r in roots:
    print(f"  x={r}: x^2-5x+6 =", r*r - 5*r + 6)

Вывод:

Корни: [2.0, 3.0]
  x=2.0: x^2-5x+6 = 0.0
  x=3.0: x^2-5x+6 = 0.0

Совпало: оба корня обращают многочлен в ноль. Разница с SymPy в том, что наш код даёт 2.0 (float), а SymPy — точную 2 (целое), и умеет то, что нам не под силу: решать в буквах и находить комплексные корни.

Как работает под капотом

Для многочленов SymPy использует точные алгебраические методы: формулы корней для степеней до 4-й (квадратное, кубическое, уравнение 4-й степени имеют формулы в радикалах), а для систем — метод исключения переменных (базисы Грёбнера для сложных случаев). Но есть фундаментальное ограничение: по теореме Абеля-Руффини общее уравнение 5-й степени и выше не решается в радикалах — для него точной формулы корней не существует в принципе. В таких случаях SymPy либо вернёт корни через специальный объект CRootOf, либо предложит решать численно. Здесь символьная математика упирается в свой потолок, и эстафету принимает SciPy.

Частые ошибки

  • Писать = вместо Eq. В Python x**2 = 5 — синтаксическая ошибка; уравнение задают через Eq(x**2, 5) или приравнивая к нулю.
  • Ждать решения для любого уравнения. Трансцендентные (x = cos(x)) и многочлены степени ≥5 часто не имеют символьного решения — нужен nsolve (численно).
  • Забывать список неизвестных в системах. Для систем явно указывайте, относительно чего решать: solve([...], [x, y]).

Итог

  • solve находит точные символьные корни, включая комплексные и параметрические.
  • Уравнения задают через Eq(л, п) или приравнивая выражение к нулю.
  • SymPy выводит даже общую формулу корней квадратного уравнения.
  • Потолок: уравнения степени ≥5 не решаются в радикалах — тогда численно (nsolve/SciPy).
Проверьте себя
1. Что вернёт solve(x**2 - 2, x) в SymPy?
A1.4142135623730951
B[-sqrt(2), sqrt(2)] — точные символьные корни
CТолько sqrt(2)
DОшибку
2. Как в SymPy задать уравнение x² = 5 для solve?
Asolve(x**2 = 5)
Bsolve(Eq(x**2, 5), x)
Csolve(x**2 == 5)
Dsolve(x**2 -> 5)
3. Почему SymPy не может символьно решить произвольное уравнение 5-й степени?
AЭто баг SymPy
BПо теореме Абеля-Руффини общее уравнение степени ≥5 не решается в радикалах — точной формулы не существует
CНе хватает памяти
DНужна лицензия