Решение уравнений: 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. В Pythonx**2 = 5— синтаксическая ошибка; уравнение задают черезEq(x**2, 5)или приравнивая к нулю. - Ждать решения для любого уравнения. Трансцендентные (
x = cos(x)) и многочлены степени ≥5 часто не имеют символьного решения — нуженnsolve(численно). - Забывать список неизвестных в системах. Для систем явно указывайте, относительно чего решать:
solve([...], [x, y]).
Итог
solveнаходит точные символьные корни, включая комплексные и параметрические.- Уравнения задают через
Eq(л, п)или приравнивая выражение к нулю. - SymPy выводит даже общую формулу корней квадратного уравнения.
- Потолок: уравнения степени ≥5 не решаются в радикалах — тогда численно (
nsolve/SciPy).