Python 使用用户定义函数绘制导数
我想画函数x^-x及其导数。然而,衍生品的编写变得单调乏味。因此,我想让Python为我找到衍生工具,然后绘制它们,但我一直会遇到语法错误。这就是我目前所拥有的Python 使用用户定义函数绘制导数,python,python-3.x,sympy,Python,Python 3.x,Sympy,我想画函数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
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)
SyntaxError回溯(最近一次调用)
C:\Users\Nathaniel\Anaconda3\lib\site packages\sympy\core\sympify.py in
同构(a,局部变量,convert\u xor,strict,rational,evaluate)
321 a=a.replace('\n','')
-->322 expr=parse_expr(a,local_dict=locals,
转换=转换,评估=评估)
323除作为exc的(令牌错误、语法错误)外:
C:\Users\Nathaniel\Anaconda3\lib\site packages\sympy\parser\sympy\u parser.py
在parse_expr(s、local_dict、transformations、global_dict、evaluate)中
893
-->894返回评估表达式(代码、本地命令、全局命令)
895
C:\Users\Nathaniel\Anaconda3\lib\site packages\sympy\parser\sympy\u parser.py
在评估中(代码、本地命令、全局命令)
806 expr=eval(
-->807代码,全局(局部,局部)#接收局部对象
偏爱
808
SyntaxError:无效语法(,第1行)
在处理上述异常期间,发生了另一个异常:
SympifyError回溯(最近一次呼叫上次)
在()
13
14 x1=np.arange(0,5,0.5)
--->15 plt.图(x1,f(x1))
16 plt.show()
在f(x)中
9 g=z**(-z)
10 h=标度差(g,z,n)
--->11 q=h.subs(z,x)
12返回q
13
C:\Users\Nathaniel\Anaconda3\lib\site packages\sympy\core\basic.py in
潜艇(自我,*args,**kwargs)
851对于范围内的i(len(序列)):
852o,n=序列[i]
-->853so,sn=sympify(o),sympify(n)
854如果不存在(因此,基本):
855如果类型(o)为str:
C:\Users\Nathaniel\Anaconda3\lib\site packages\sympy\core\sympify.py in
同构(a,局部变量,convert\u xor,strict,rational,evaluate)
322 expr=parse_expr(a,local_dict=locals,
转换=转换,评估=评估)
323除作为exc的(令牌错误、语法错误)外:
-->324 raise SYMBIFYERROR('无法分析%r'%a,exc)
325
326返回表达式
SympifyError:表达式“的Sympify无法分析”[0.0.5 1.1.5
2.2.5 3.3.5 4.4.5]“”失败,因为引发了异常:
SyntaxError:无效语法(,第1行)
我如何让Python以一种快速有效的方式绘制这张图 似乎
sympy
中的微分函数是相同的。或许还有其他方法,经验丰富的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()
每个函数的线条样式都可以定义,例如,通过使用其他方法来控制线条
输出:
我建议您提供错误消息的完整回溯。我包括了回溯,但它似乎不是很有用。我对Python相当陌生,但是我所做的并不特别困难。我只是没有足够的经验来知道如何正确地将数组输入函数。这才是真正的美。非常感谢。您可能已经注意到,我排除了零,因为这一点的计算未定义或复杂。如果图形开始时足够接近零,它是不可见的,这可能是我将要做的。有没有办法控制每条曲线的颜色?可以使用cycler对象控制线条的外观。请参阅更新。为什么mpmath quad不能使用相同的功能
defint_f(xrange):为xrange中的xr返回[quad(lambda x:fl(x),[-1,1],xr,method='tanh-sinh')
对我不起作用?我错过了什么?