Sympy: остаются некоторые термины, которые, очевидно, исчезнут - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу вычислить производную функции, используя следующий код.

import sympy


pi = sympy.symbols("pi")
class H(sympy.Function):
    nargs = 1

    def fdiff(self, argindex=1):
        x = self.args[0]
        return - sympy.functions.exp(-sympy.Pow(x, 2) / 2) / sympy.sqrt(2 * pi)

def G(a):
    return (
        (a + 1) * H(1 / sympy.sqrt(a))
        - sympy.sqrt(a / (2 * pi)) * sympy.functions.exp(-1 / (2 * a))
    )

x = sympy.symbols("x")
sympy.simplify(sympy.diff(G(x), x))

Ожидается, что это будет G'(x) = H(1 / sqrt(x)), но я получил

Out[1]: H(1/sqrt(x)) - sqrt(2)*sqrt(x/pi)*exp(-1/(2*x))/(4*x) - sqrt(2)*sqrt(x/pi)*exp(-1/(2*x))/(4*x**2) + sqrt(2)*exp(-1/(2*x))/(4*sqrt(pi)*sqrt(x)) + sqrt(2)*exp(-1/(2*x))/(4*sqrt(pi)*x**(3/2))

Очевидно, что остальные члены быть 0 при взгляде человеческого глаза.

Затем я попытался изменить два pi s в определении H и G на sympy.pi, что возвращает H(1 / sqrt(x)), как я и ожидал.

Почему мой первый код возвращает некоторые дополнительные термины?

1 Ответ

1 голос
/ 13 февраля 2020

В SymPy есть встроенные правила, которые позволяют выполнять определенные преобразования (автоматически, иногда) или запрещаться (по умолчанию). Когда вы определили pi как Символ, вы создали общий символ c с единственным предположением, что он является коммутативным. Но число pi таково, что и это положительно. Это предположение позволяет что-то вроде sqrt(x/y) автоматически переписать как sqrt(y)*sqrt(x)/y, если y положительно:

>>> sqrt(x/y)
sqrt(x/y)
>>> sqrt(x/3)
sqrt(3)*sqrt(x)/3

Если вы берете последнее выражение и подставляете положительное значение для символа pi, вы будете получите это переписать, и тогда условия отмены будут отменены.

>>> print(sympy.simplify(sympy.diff(G(x), x))).subs(pi, 3)
H(1/sqrt(x))

Как отмечает Йохан, в этом случае лучше просто использовать SymPy S.Pi:

>>> S.Pi.n(3)
3.14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...