建议从这里下载这篇文章对应的.ipynb文件和相关资源。这样你就能在Jupyter中边阅读,边测试文中的代码。
from IPython.display import display, Math
from sympy import *
init_printing()
from helper import comparator_factory, comparator_eval_factory, comparator_method_factory
x,y,z = symbols('x y z')
comparator = comparator_factory('使用{}前:','使用后:')
method_comparator = comparator_method_factory('调用{}前:','调用后:')
eval_comparator = comparator_eval_factory('计算前:','计算后:')
expr = sin(x)
expr_diff = diff(expr,x)
comparator(expr, diff, x)
也可以用方法调用的方式计算微分
expr = sin(x)
method_comparator(expr, 'diff', x)
如果要创建一个未执行计算的微分, 可以使用Derivative
类。 初始化的语法和diff()
是一样的。
expr = sin(x)
diff_expr = Derivative(expr,x)
print('Before evaluation:')
display(diff_expr)
然后调用doit()
方法执行计算。
print('After evaluation:')
display(diff_expr.doit())
为了避免冗余代码, 后面的笔记我们使用eval_comparator
来进行比较。
expr = Derivative(x**4,x,x,x)
eval_comparator(expr)
用第二种方式达到同样的效果。
expr = Derivative(x**4,x,3)
eval_comparator(expr)
只要按照顺序传入符号就可以, 语法和一阶微分一样。
expr = Derivative(exp(x*y*z),x, y, y, z, z, z, z)
eval_comparator(expr)
或者通过数字控制每个符号的微分阶数
expr = Derivative(exp(x*y*z),x, y, 2, z, 4)
eval_comparator(expr)
expr = Integral(cos(x),x)
eval_comparator(expr)
传入一个包含符号,积分下限, 积分上线的tuple去进行定积分。
expr = Integral(exp(-x),(x,0,oo))
eval_comparator(expr)
注意,在Sympy中$\infty$用oo表示(两个小写的'O')
expr = Integral(exp(-x**2 - y**2), (x, -oo, oo), (y, -oo, oo))
eval_comparator(expr)
如果Sympy无法计算一个表达式的积分,机会返回未计算的积分式。
expr = Integral(x**x)
eval_comparator(expr)
和微分一样, 极限可以用过limit()
函数或者方法进行微分计算。 如果要创建未计算的表达式,初始化一个Limit
类, 然后通过调用doit()
方法完成计算。
默认情况下, dir = '+'
, 极限从右侧计算。
expr = Limit(sin(x)/x, x, 0)
eval_comparator(expr)
如果要计算左侧极限, 可以传入dir='-'
expr = Limit(sin(x)/x, x, 0, dir = '-')
eval_comparator(expr)
通过调用series()
方法, Sympy可以计算误差关于$O(x-x_0)^n$, 在点$x_0$处的渐进级数展开。
expr = sin(x)
method_comparator(expr, 'series', x,0,6)
如果要去掉误差项,可以调用removeO()
方法。
print('Expanded expression without order term:')
expr.series(x,0,6).removeO()