Производная функции с разными формулами на разных интервалах - PullRequest
0 голосов
/ 28 августа 2018

Есть ли канонический способ объявления функции по частям в Sympy ? Я пытался

import sympy
import sympy.functions.special.delta_functions as special

sympy.init_printing()
x = sympy.symbols('x', real=True)
V = x*x * (special.Heaviside(x + 1) - special.Heaviside(x - 1)) \
    + (1 + 2*sympy.log(x)) * special.Heaviside(x - 1) \
    + (1 + 2*sympy.log(-x)) * special.Heaviside(-x - 1)

, который определяет дифференцируемую функцию, но

print(V.diff(x).simplify())
# Prints: (x*(x**2*(-DiracDelta(x - 1) + DiracDelta(x + 1)) - 2*x*(Heaviside(x - 1) - Heaviside(x + 1)) - (2*log(-x) + 1)*DiracDelta(x + 1) + (2*log(x) + 1)*DiracDelta(x - 1)) + 2*Heaviside(-x - 1) + 2*Heaviside(x - 1))/x

Есть ли способ как-то сказать Sympy об упрощении DiracDelta(x - a)*f(x) до DiracDelta(x - a)*f(a)?

1 Ответ

0 голосов
/ 28 августа 2018

Кусочно-определенные функции реализуются классом Piecewise . Ваша функция будет выражена как

V = sympy.Piecewise((1 + 2*sympy.log(-x), x < -1),
                    (x**2, x < 1),
                    (1 + 2*sympy.log(x), True))
print(V.diff(x)) 

который печатает Piecewise((2/x, x < -1), (2*x, x < 1), (2/x, True))

Пары (expr, cond) в Piecewise обрабатываются в указанном порядке: первое значение cond, которое оценивается как True (если предыдущее значение равно False), приводит к возвращению соответствующего expr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...