<jupyter_start><jupyter_text>初始化环境<jupyter_code>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('计算前:','计算后:')<jupyter_output><empty_output><jupyter_text>微积分这部分设计如何进行基本的微积分操作，比如微分，积分，求极限，级数展开。  微分用```diff()```求微分 基本的微分传入表达式和应用微分的符号变量。<jupyter_code>expr = sin(x)

expr_diff = diff(expr,x)

comparator(expr, diff, x)<jupyter_output>使用diff()前:<jupyter_text>也可以用方法调用的方式计算微分<jupyter_code>expr = sin(x)

method_comparator(expr, 'diff', x)<jupyter_output>调用diff()前:<jupyter_text>如果要创建一个未执行计算的微分， 可以使用```Derivative```类。 初始化的语法和```diff()```是一样的。<jupyter_code>expr = sin(x)

diff_expr = Derivative(expr,x)

print('Before evaluation:')
display(diff_expr)<jupyter_output>Before evaluation:<jupyter_text>然后调用```doit()```方法执行计算。<jupyter_code>print('After evaluation:')
display(diff_expr.doit())<jupyter_output>After evaluation:<jupyter_text>为了避免冗余代码， 后面的笔记我们使用```eval_comparator```来进行比较。  高阶微分如果要计算n次高阶微分， 传入符号n次或者在符号后面传入n。<jupyter_code>expr = Derivative(x**4,x,x,x)

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>用第二种方式达到同样的效果。<jupyter_code>expr = Derivative(x**4,x,3)

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>高阶偏微分 只要按照顺序传入符号就可以， 语法和一阶微分一样。<jupyter_code>expr = Derivative(exp(x*y*z),x, y, y, z, z, z, z)

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>或者通过数字控制每个符号的微分阶数<jupyter_code>expr = Derivative(exp(x*y*z),x, y, 2, z, 4)

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>积分  不定积分和微分类似，积分可以通过```integral()```函数或者方法来实现。 如果要创建未计算的积分表达式，初始化一个```Integral```类然后调用```doit()```进行计算。<jupyter_code>expr = Integral(cos(x),x)

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>定积分 传入一个包含符号，积分下限， 积分上线的tuple去进行定积分。<jupyter_code>expr = Integral(exp(-x),(x,0,oo))

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>注意，在Sympy中$\infty$用oo表示(两个小写的'O')  多重积分传入多个包含符号和积分限的tuple进行多重积分。<jupyter_code>expr = Integral(exp(-x**2 - y**2), (x, -oo, oo), (y, -oo, oo))

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>如果Sympy无法计算一个表达式的积分，机会返回未计算的积分式。<jupyter_code>expr = Integral(x**x)

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>极限 和微分一样， 极限可以用过```limit()```函数或者方法进行微分计算。 如果要创建未计算的表达式，初始化一个```Limit```类， 然后通过调用```doit()```方法完成计算。 默认情况下， ```dir = '+'```， 极限从右侧计算。<jupyter_code>expr = Limit(sin(x)/x, x, 0)

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>如果要计算左侧极限， 可以传入```dir='-'```<jupyter_code>expr = Limit(sin(x)/x, x, 0, dir = '-')

eval_comparator(expr)<jupyter_output>计算前:<jupyter_text>级数展开 通过调用```series()```方法， Sympy可以计算误差关于$O(x-x_0)^n$， 在点$x_0$处的渐进级数展开。<jupyter_code>expr = sin(x)

method_comparator(expr, 'series', x,0,6)<jupyter_output>调用series()前:<jupyter_text>如果要去掉误差项，可以调用```removeO()```方法。<jupyter_code>print('Expanded expression without order term:')
expr.series(x,0,6).removeO()<jupyter_output>Expanded expression without order term:
{'fraction_non_alphanumeric': 0.17588102166181702, 'fraction_numerical': 0.005172971225347559, 'mean_word_length': 15.37037037037037, 'pattern_counts': {'":': 0, '<': 53, '<?xml version=': 0, '>': 53, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '73111', 'license': 'MIT', 'n_tokens_mistral': 1732, 'n_tokens_neox': 1820, 'n_words': 125, 'path': '0011_sympy/0027_sympy_intro_2_ch.ipynb', 'repo_name': 'junjiecai/jupyter_demos', 'size': '3093'}