Символьные и численные подходы к решению уравнений на Python

Раздел: Основы Python -> Математические вычисления

Решение уравнений - одна из распространенных задач в математических вычислениях. В Python доступны как символьные (аналитические) библиотеки, так и численные методы, которые позволяют находить корни уравнений разной сложности.

Символьное решение с SymPy

Как решить уравнение аналитически, получив точное значение корня?

Библиотека SymPy предоставляет функцию solve для символьного решения уравнений. Необходимо определить символьную переменную и составить выражение, равное нулю.

from sympy import symbols, solve, Eq
x = symbols('x')
equation = Eq(x**2 - 4, 0)
roots = solve(equation, x)
print(roots)  # [-2, 2]

Python квадратное уравнение (решение квадратного уравнения в python)

Пояснение: symbols('x') создает символьную переменную, Eq(expr, 0) задает уравнение (можно просто передать выражение, приравниваемое к нулю по умолчанию). solve возвращает список решений. Этот метод подходит для полиномиальных, рациональных и простых тригонометрических уравнений, когда требуется точное решение.

SymPy не может решить все уравнения - например, трансцендентные (sin(x) = x) могут не иметь символьного решения. Также при большом числе переменных время решения возрастает. В таких случаях используют численные методы.

Как найти корень численно, если аналитическое решение невозможно?

Функция fsolve из модуля scipy.optimize использует метод Ньютона для численного поиска корня. Требуется задать функцию и начальное приближение.

from scipy.optimize import fsolve
def f(x):
    return x**3 - 2*x - 5
root = fsolve(f, 2)
print(root)  # [2.09455148]

решение системы уравнений python (решить систему уравнений в python)

Пояснение: fsolve принимает функцию, возвращающую значение, и начальное приближение (скаляр или массив). Возвращает массив корней. Начальное приближение важно: если выбрать далеко от истинного корня, метод может сойтись к другому корню или разойтись.

Главная проблема - зависимость от начального приближения. Для поиска всех корней требуется многократный запуск с разными начальными значениями. Метод не гарантирует нахождение корня, если функция не имеет производной или разрывна.

Как гарантированно найти корень на заданном отрезке?

Метод половинного деления (bisect) из той же библиотеки требует, чтобы функция меняла знак на концах интервала.

from scipy.optimize import bisect
f = lambda x: x**2 - 2
root = bisect(f, 0, 2)
print(root)  # 1.414213562373095

Python вычислить строку (вычисление выражения из строки в python)

Пояснение: bisect находит корень на интервале [a, b] при условии f(a)*f(b) < 0. Метод сходится гарантированно, но медленнее.

Требуется, чтобы на концах интервала были разные знаки. Если корней несколько, будет найден только один. Для поиска нескольких корней нужно разбивать область на отрезки.

Как найти все корни многочлена?

Для полиномов эффективно использовать numpy.roots, передав список коэффициентов.

import numpy as np
coeffs = [1, 0, -4]  # x^2 + 0*x - 4
roots = np.roots(coeffs)
print(roots)  # [-2.  2.]

Python вычисление значения выражений (вычисление значения выражений в python)

Пояснение: коэффициенты располагаются от старшей степени к свободному члену. Функция возвращает массив корней (включая комплексные).

Для многочленов высокой степени вычисления могут быть численно неустойчивы. Метод не подходит для трансцендентных уравнений.

Как решить систему уравнений?

SymPy позволяет решать системы символьных уравнений с помощью solve, передав кортеж уравнений и переменных.

from sympy import symbols, solve
x, y = symbols('x y')
eq1 = x + y - 10
eq2 = x - y - 2
sol = solve((eq1, eq2), (x, y))
print(sol)  # {x: 6, y: 4}

вычисление функции в python (вычисление значения функции в python)

Для численного решения систем нелинейных уравнений применяется fsolve.

from scipy.optimize import fsolve
def equations(vars):
    x, y = vars
    return [x + y - 10, x - y - 2]
initial = [0, 0]
sol = fsolve(equations, initial)
print(sol)  # [6. 4.]

возвести в квадрат python (возведение числа в квадрат в python)

Символьное решение систем может быть очень медленным для больших систем. Численное требует хорошего начального приближения и может дать только одно из решений.

Как численно решить уравнение, заданное символьным выражением?

SymPy предоставляет функцию nsolve, которая комбинирует символьную запись и численный метод.

from sympy import symbols, nsolve
x = symbols('x')
root = nsolve(x**3 - 2*x - 5, 2)
print(root)  # 2.09455148154233

Пояснение: первый аргумент - выражение, второй - начальное приближение. Результат - численное значение с плавающей точкой.

Те же ограничения, что и у fsolve: чувствительность к начальному приближению, находит только один корень за раз.

- Python вычислить среднее арифметическое (вычисление среднего арифметического в python)
- вычислить значение функции python (вычисление значения функции в python)
- Python формула (написание математических формул в python)

Расширенные примеры решений уравнений

Ниже представлены более сложные случаи, демонстрирующие возможности библиотек.

Пример 1. Нелинейное уравнение с несколькими корнями

Пример
import numpy as np
from scipy.optimize import fsolve
def f(x):
    return np.sin(x) - 0.5 * x
# поиск корней при разных начальных приближениях
candidates = np.linspace(-5, 5, 20)
roots = set()
for guess in candidates:
    try:
        root = fsolve(f, guess)[0]
        root_rounded = round(root, 6)
        roots.add(root_rounded)
    except Exception:
        pass
print(sorted(roots))
[-4.336689, -2.010467, 0.0, 2.010467, 4.336689]

Пример 2. Система нелинейных уравнений с fsolve

Пример
from scipy.optimize import fsolve
def system(vars):
    x, y = vars
    return [
        x**2 + y**2 - 25,
        x - y - 1
    ]
initial = (1, 4)
sol = fsolve(system, initial)
print(sol)
[3. 4.]

Пример 3. Параметрическое символьное решение

Пример
from sympy import symbols, solve
a, x = symbols('a x')
eq = x**2 - a
sol = solve(eq, x)
print(sol)  # [-sqrt(a), sqrt(a)]

Пример 4. Кубическое уравнение с символьным решением

Пример
x = symbols('x')
sol = solve(x**3 - 6*x**2 + 11*x - 6, x)
print(sol)  # [1, 2, 3]

Пример 5. Численное решение системы с помощью nsolve

Пример
from sympy import nsolve, symbols
x, y = symbols('x y')
eq1 = x**2 + y**2 - 25
eq2 = x - y - 1
sol = nsolve((eq1, eq2), (x, y), (1, 4))
print(sol)
Matrix([[3.00000000000000], [4.00000000000000]])

Пример 6. Метод половинного деления с проверкой знаков

Пример
from scipy.optimize import bisect
import numpy as np
f = lambda x: np.exp(x) - 3
a, b = 0, 2
if f(a)*f(b) < 0:
    root = bisect(f, a, b)
    print(root)  # 1.098612289
else:
    print('На отрезке нет корня или корней четное количество.')
1.098612289

Пример 7. Решение дифференциального уравнения (дополнительно)

Пример
from sympy import Function, dsolve, Eq, Derivative, symbols
x = symbols('x')
f = Function('f')
eq = Derivative(f(x), x, 2) + f(x)
sol = dsolve(eq, f(x))
print(sol)
Eq(f(x), C1*sin(x) + C2*cos(x))

Пример 8. Поиск всех корней полинома высокой степени

Пример
import numpy as np
from scipy.optimize import fsolve
def func(x):
    return x**4 - 10*x**3 + 35*x**2 - 50*x + 24
roots = []
for guess in np.linspace(-2, 6, 30):
    try:
        root = fsolve(func, guess)[0]
        root_r = round(root, 4)
        if not any(abs(root_r - r) < 1e-4 for r in roots):
            roots.append(root_r)
    except:
        pass
print(sorted(roots))
[1.0, 2.0, 3.0, 4.0]

Решение уравнения в Python - comments

En
решить уравнение python (python)