# 初始化环境


```python
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('计算前:','计算后:')
```

# 微积分

这部分设计如何进行基本的微积分操作，比如微分，积分，求极限，级数展开。

## 微分
用```diff()```求微分

### 基本的微分
传入表达式和应用微分的符号变量。


```python
expr = sin(x)

expr_diff = diff(expr,x)

comparator(expr, diff, x)
```

也可以用方法调用的方式计算微分


```python
expr = sin(x)

method_comparator(expr, 'diff', x)
```

如果要创建一个未执行计算的微分， 可以使用```Derivative```类。 初始化的语法和```diff()```是一样的。


```python
expr = sin(x)

diff_expr = Derivative(expr,x)

print('Before evaluation:')
display(diff_expr)
```

然后调用```doit()```方法执行计算。


```python
print('After evaluation:')
display(diff_expr.doit())
```

为了避免冗余代码， 后面的笔记我们使用```eval_comparator```来进行比较。

### 高阶微分
如果要计算n次高阶微分， 传入符号n次或者在符号后面传入n。


```python
expr = Derivative(x**4,x,x,x)

eval_comparator(expr)
```

用第二种方式达到同样的效果。


```python
expr = Derivative(x**4,x,3)

eval_comparator(expr)
```

### 高阶偏微分

只要按照顺序传入符号就可以， 语法和一阶微分一样。


```python
expr = Derivative(exp(x*y*z),x, y, y, z, z, z, z)

eval_comparator(expr)
```

或者通过数字控制每个符号的微分阶数


```python
expr = Derivative(exp(x*y*z),x, y, 2, z, 4)

eval_comparator(expr)
```

# 积分

## 不定积分
和微分类似，积分可以通过```integral()```函数或者方法来实现。 如果要创建未计算的积分表达式，初始化一个```Integral```类然后调用```doit()```进行计算。


```python
expr = Integral(cos(x),x)

eval_comparator(expr)
```

### 定积分

传入一个包含符号，积分下限， 积分上线的tuple去进行定积分。


```python
expr = Integral(exp(-x),(x,0,oo))

eval_comparator(expr)
```

注意，在Sympy中$\infty$用oo表示(两个小写的'O')

### 多重积分
传入多个包含符号和积分限的tuple进行多重积分。


```python
expr = Integral(exp(-x**2 - y**2), (x, -oo, oo), (y, -oo, oo))

eval_comparator(expr)
```

如果Sympy无法计算一个表达式的积分，机会返回未计算的积分式。


```python
expr = Integral(x**x)

eval_comparator(expr)
```

# 极限

和微分一样， 极限可以用过```limit()```函数或者方法进行微分计算。 如果要创建未计算的表达式，初始化一个```Limit```类， 然后通过调用```doit()```方法完成计算。

默认情况下， ```dir = '+'```， 极限从右侧计算。


```python
expr = Limit(sin(x)/x, x, 0)

eval_comparator(expr)
```

如果要计算左侧极限， 可以传入```dir='-'```


```python
expr = Limit(sin(x)/x, x, 0, dir = '-')

eval_comparator(expr)
```

# 级数展开

通过调用```series()```方法， Sympy可以计算误差关于$O(x-x_0)^n$， 在点$x_0$处的渐进级数展开。


```python
expr = sin(x)

method_comparator(expr, 'series', x,0,6)
```

如果要去掉误差项，可以调用```removeO()```方法。


```python
print('Expanded expression without order term:')
expr.series(x,0,6).removeO()
```

# 参考资料
[Sympy Documentation](http://docs.sympy.org/latest/index.html)

# 相关文章
* [Sympy笔记I]({filename}0026_sympy_intro_1_ch.ipynb)
* [Sympy笔记II]({filename}0027_sympy_intro_2_ch.ipynb)
* [Sympy笔记III]({filename}0028_sympy_intro_3_ch.ipynb)
* [Sympy笔记IV]({filename}0029_sympy_intro_4_ch.ipynb)

31d82313ec6398e16b7022a7918cc627c103ea94
ipynb
Jupyter Notebook
0011_sympy/0027_sympy_intro_2_ch.ipynb
junjiecai/jupyter_demos
8aa8a0320545c0ea09e05e94aea82bc8aa537750
MIT
2019-09-16T10:44:39.000Z
2021-09-04T18:55:52.000Z
0011_sympy/0027_sympy_intro_2_ch.ipynb
junjiecai/jupyter_demos
8aa8a0320545c0ea09e05e94aea82bc8aa537750
MIT
0011_sympy/0027_sympy_intro_2_ch.ipynb
junjiecai/jupyter_demos
8aa8a0320545c0ea09e05e94aea82bc8aa537750
MIT
2020-10-24T16:19:29.000Z
2021-09-04T18:55:57.000Z
Qwen/Qwen-72B
1. YES
2. YES