Создание производных с пользовательской функцией - PullRequest
0 голосов
/ 26 мая 2018

Я хочу построить функцию x ^ -x вместе с ее производными.Однако, производные становятся утомительными, чтобы написать.Поэтому я хочу, чтобы Python нашел для меня производные, а затем изобразил их, однако я получаю синтаксическую ошибку.Это то, что у меня есть до сих пор.

import math 
import sympy as sp
import numpy as np 
import matplotlib.pyplot as plt
x,y,z = sp.symbols('x y z')

n=1 # order of derivative
def f(x):
   g=z**(-z)
   h=sp.diff(g,z,n)
   q=h.subs(z,x)
   return q

x1=np.arange(0,5,0.5)
plt.plot(x1,f(x1))
plt.show()

Полный трекбэк сообщения об ошибке выглядит следующим образом:

SyntaxError                               Traceback (most recent call last)
C:\Users\Nathaniel\Anaconda3\lib\site-packages\sympy\core\sympify.py in 
sympify(a, locals, convert_xor, strict, rational, evaluate)
    321         a = a.replace('\n', '')
--> 322         expr = parse_expr(a, local_dict=locals, 
transformations=transformations, evaluate=evaluate)
    323     except (TokenError, SyntaxError) as exc:

C:\Users\Nathaniel\Anaconda3\lib\site-packages\sympy\parsing\sympy_parser.py 
in parse_expr(s, local_dict, transformations, global_dict, evaluate)
    893 
--> 894     return eval_expr(code, local_dict, global_dict)
    895 

C:\Users\Nathaniel\Anaconda3\lib\site-packages\sympy\parsing\sympy_parser.py 
in eval_expr(code, local_dict, global_dict)
    806     expr = eval(
--> 807         code, global_dict, local_dict)  # take local objects in 
    preference
    808 

SyntaxError: invalid syntax (<string>, line 1)

During handling of the above exception, another exception occurred:

SympifyError                              Traceback (most recent call last)
<ipython-input-2-13b1385304a2> in <module>()
     13 
     14 x1=np.arange(0,5,0.5)
---> 15 plt.plot(x1,f(x1))
     16 plt.show()

<ipython-input-2-13b1385304a2> in f(x)
      9     g=z**(-z)
     10     h=sp.diff(g,z,n)
---> 11     q=h.subs(z,x)
     12     return q
     13 

C:\Users\Nathaniel\Anaconda3\lib\site-packages\sympy\core\basic.py in 
subs(self, *args, **kwargs)
    851         for i in range(len(sequence)):
    852             o, n = sequence[i]
--> 853             so, sn = sympify(o), sympify(n)
    854             if not isinstance(so, Basic):
    855                 if type(o) is str:

C:\Users\Nathaniel\Anaconda3\lib\site-packages\sympy\core\sympify.py in 
sympify(a, locals, convert_xor, strict, rational, evaluate)
    322         expr = parse_expr(a, local_dict=locals, 
    transformations=transformations, evaluate=evaluate)
    323     except (TokenError, SyntaxError) as exc:
--> 324         raise SympifyError('could not parse %r' % a, exc)
    325 
    326     return expr

SympifyError: Sympify of expression 'could not parse '[ 0.   0.5  1.   1.5  
2.   2.5  3.   3.5  4.   4.5]'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)

Как мне заставить Python построить это быстро и эффективнопуть?

1 Ответ

0 голосов
/ 26 мая 2018

Кажется, что дифференцирующие функции в sympy находятся в библиотеке mpath .Возможно, есть и другие способы, как опытные пользователи sympy могут решить проблему, но есть одно решение:

import matplotlib.pyplot as plt
from mpmath import diff
from cycler import cycler
#create cycler objects that matplotlib uses as linestyles 
col = cycler("color", ["r", "b", "g"])
styl = cycler("linestyle", ["-", "-."])
plt.rc('axes', prop_cycle =  styl * col)

#define function to differentiate
def g(z):
    return z ** (-z)
#define the differentiation function
def f(xrange):
    return [diff(lambda x: g(x), xr, n) for xr in xrange]
#I prefer linspace over arange because you don't run into float point problems
x1 = np.linspace(1, 5, 100)
#cycle through derivative order
for n in range(5):
    plt.plot(x1, f(x1), label = "Order = {}".format(n))

plt.legend()
plt.show()

Стиль линии каждой функции может быть определен, например, с помощью объектов-цикликов. Конечно, есть и другие способы управления цветом линий в matplotlib.

Выход:

enter image description here

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