</>
Тема 4 из 5

Интегралы и дифференциальные уравнения

Интегралы: integrate

Неопределённый интеграл (первообразная):

from sympy import symbols, integrate, sin, exp, log

x = symbols("x")
print(integrate(x ** 2, x))           # x**3/3
print(integrate(sin(x), x))           # -cos(x)
print(integrate(1 / x, x))            # log(x)
print(integrate(x * exp(x), x))       # (x - 1)*exp(x)

SymPy возвращает одну первообразную, без константы C. Проверить ответ легко — продифференцировать его.

Определённый интеграл — кортеж (переменная, нижний, верхний):

from sympy import Rational, oo
print(integrate(x ** 2, (x, 0, 3)))               # 9
print(integrate(x, (x, 0, Rational(1, 2))))       # 1/8
print(integrate(exp(-x), (x, 0, oo)))             # 1

Пределы лучше задавать точными числами (Rational), тогда и ответ точный. С дробными числами 0.5 ответ тоже будет дробным числом с погрешностью.

Если нижний предел больше верхнего, результат меняет знак — так устроено определение интеграла.

Когда первообразной нет даже через специальные функции, integrate возвращает невычисленный Integral(...). Его численное значение даёт .evalf().

Площадь и модуль

Определённый интеграл — это площадь со знаком: части графика под осью дают отрицательный вклад. Чтобы найти настоящую площадь между кривыми f и g, отрезок разбивают точками, где f - g меняет знак (корнями разности), и складывают модули интегралов по кускам:

d = x ** 2 - 1                    # разность функций
print(integrate(d, (x, -2, 2)))   # 4/3 — площадь со знаком
# корни на отрезке: -1 и 1
parts = [(-2, -1), (-1, 1), (1, 2)]
print(sum(abs(integrate(d, (x, l, r))) for l, r in parts))   # 4

Дифференциальные уравнения: dsolve

Неизвестную функцию объявляют через Function, производные — методом diff:

from sympy import Function, Eq, dsolve

t = symbols("t")
y = Function("y")

eq = Eq(y(t).diff(t), -2 * y(t))      # y' = −2y
print(dsolve(eq, y(t)))               # Eq(y(t), C1*exp(-2*t))

C1, C2 — произвольные постоянные. Их находят из начальных условий, параметр ics:

sol = dsolve(eq, y(t), ics={y(0): 5})
print(sol.rhs)                        # 5*exp(-2*t) — правая часть равенства
print(sol.rhs.subs(t, 1).evalf())     # значение при t = 1

Для уравнения второго порядка нужны два условия — значение и производная в начальный момент:

eq = Eq(y(t).diff(t, 2) + y(t), 0)    # y'' + y = 0
sol = dsolve(eq, y(t), ics={y(0): 0, y(t).diff(t).subs(t, 0): 1})
print(sol.rhs)                        # sin(t)

Запись y(t).diff(t).subs(t, 0) означает y'(0).

Итог

  • integrate(f, x) — первообразная без C; integrate(f, (x, a, b)) — определённый интеграл;
  • точные пределы → точный ответ; oo — бесконечный предел;
  • площадь между кривыми — сумма модулей интегралов между корнями разности;
  • Function("y"), Eq(...), dsolve(eq, y(t), ics={...}).rhs — решение дифференциального уравнения.