Найти производную кусочной функции, используя определение предела - PullRequest
0 голосов
/ 07 ноября 2018

Итак, я создаю кусочную функцию, например:

x= sp.symbols('x')
f = sp.Piecewise(
        (1, x==0),
        (sp.sin(x)*(x+1)/x, True))

но если я заменю x на 0, я получу nan:

f.subs(x,0)
nan

Итак, первый вопрос: почему == плохо работает с sympy.Piecewise? Ну, я изменил это на следующее:

f = sp.Piecewise(
        (sp.sin(x)*(x+1)/x, sp.And(x < 0, x > 0)),
        (1, True))

И это работает вроде.
Следующее, что я хотел бы сделать, - это вычислить производную функции, используя ее определение в x = 0: мне нужно вычислить предел:
image
Итак, мне нужно вычислить это в x = 0, я кодирую это:

Δx = sp.symbols('Δx')
expr = f.subs(x, Δx)/Δx
sp.limit(expr, Δx, 0)

Но он выдает oo, что означает бесконечность. И это не совсем так, потому что, если я вызову функцию diff, я получу 0, что в некотором роде верно (при x = 0 производная f равна 0):

sp.diff(f, x).subs(x,0)
0

Может кто-нибудь сказать мне, что не так с моим кодом и как я могу это исправить. Спасибо.

1 Ответ

0 голосов
/ 07 ноября 2018

Равенство == - это структурное равенство, а не математическое равенство. Он сразу оценивается как True или False, нет «ждать, пока мы не узнаем значение x». Объект Symbol('x') и объект Integer(0) структурно не равны, следовательно, Symbol('x') == Integer(0) имеет значение False. См. SymPy gotchas . Вы имели в виду отношение Eq(x, 0), которое представляет отношение равенства, которое не оценивается как логическое значение, пока мы не узнаем больше о x. Итак, используйте

f = sp.Piecewise(
    (1, sp.Eq(x, 0)),
    (sp.sin(x)*(x+1)/x, True))

Во-вторых, определение производной (в 0) является пределом (f(Δx) - f(0))/Δx, и вы не вычли f(0)

expr = (f.subs(x, Δx) - f.subs(x, 0))/Δx
sp.limit(expr, Δx, 0)

результат в 1, что на самом деле правильно. (Производная 1, а не 0).

Кстати,

>>> sp.diff(f, x).subs(x, 0)
0

неверно, потому что SymPy (как и другие CAS) не очень хорош в исчислении с кусочными функциями.

...