Интегралы и дифференциальные уравнения
Интегралы: 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— решение дифференциального уравнения.