Sympy производная с не-символом - PullRequest
0 голосов
/ 29 февраля 2020

Для проекта, над которым я работаю, мне нужна производная функции от wrt cos (theta), но при использовании Sympy v1.5.1 получить сообщение об ошибке, указывающее, что не-символы не могут быть использованы в качестве производной. Это не было проблемой до Sympy v1.3, но более поздние версии дают эту ошибку.

>>> l=1
>>> theta = symbols('theta')
>>> eq=diff((cos(theta)**2-1)**l,cos(theta),l)
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/base/data/home/apps/s~sympy-live- 
hrd/20200105t193609.423659059328302322/sympy/sympy/core/function.py", line 2446, in diff
return f.diff(*symbols, **kwargs)
File "/base/data/home/apps/s~sympy-live- 
hrd/20200105t193609.423659059328302322/sympy/sympy/core/expr.py", line 3352, in diff
return Derivative(self, *symbols, **assumptions)
File "/base/data/home/apps/s~sympy-live- 
hrd/20200105t193609.423659059328302322/sympy/sympy/core/function.py", line 1343, in __new__
__)))
ValueError: 
Can't calculate derivative wrt cos(theta).

Согласно документации Sympy (https://docs.sympy.org/latest/modules/core.html#sympy .core.function.Derivative ) я могу решить эту проблему, используя:

>>> from sympy.abc import t
>>> F = Function('F')
>>> U = f(t)
>>> V = U.diff(t)
>>> direct = F(t, U, V).diff(U)

К сожалению я не могу заставить это работать с этим уравнением в Sympy v1.5.1. Предложения / помощь очень ценятся.

Ответы [ 2 ]

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

производная функции от wrt cos (theta)

Работало ли это раньше в sympy? то есть вы были в состоянии дифференцировать WRT cos(theta)? Это не должно работать, поскольку дифференцирование по отношению к символу. Например, Maple также выдает ошибку

diff( 1+cos(theta)^2,cos(theta))
Error, invalid input: diff received cos(theta), which is not valid for its 2nd argument

Странно, что Mathematica разрешает это. Но я думаю, что это не хорошее поведение. Может быть, поэтому sympy больше не позволяет это.

Но вы можете сделать это в sympy

from sympy import *
theta,x = symbols('theta x')
eq      = (cos(theta)**2-1)**2

result  = diff( eq.subs(cos(theta),x) ,x)

result.subs(x,cos(theta))

, что дает

 4*(cos(theta)**2 - 1)*cos(theta)

в Mathematica (которая позволяет это )

 D[(Cos[theta]^2 - 1)^2, Cos[theta]]

т

 4 Cos[theta] (-1 + Cos[theta]^2)
0 голосов
/ 01 марта 2020

Возможно, SymPy чрезмерно исправлен. Если выражение имеет единственный генератор, соответствующий интересующей функции, тогда может иметь место эквивалентно-замещающее дифференцирование. Случаи, которые (вероятно) не должны быть разрешены: (x + 1).diff(cos(x)), sin(x).diff(cos(x)), et c ... Но (cos(x)**2 - 1).diff(cos(x)) должно (вероятно) быть в порядке. Как указал @Nasser, будет работать простая замена / дифференцирование / обратная замена.

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