# 微积分

SymPy支持微分和积分操作,也支持推导极限


```python
from sympy import init_printing
init_printing(use_unicode=True)
```


```python
from sympy import symbols
x, y, z = symbols('x y z')
```

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


```python
from sympy import diff
```


```python
diff(x**3+x**2+x+1)
```

`diff(exp,var,level)`可以求多阶导数,需要指定变量和阶数


```python
diff(x**3+x**2+x+1,x,2)
```

同样的,也可以求偏导


```python
diff(x**3+x*y**2+x*y+1,x)
```

要创建未化简的的导数,需要使用导数类.它具有与diff相同的语法,但必须显式的指定是谁的微分


```python
from sympy import Derivative
```


```python
exp = diff(x**3+x**2+x+1)
exp
```


```python
Derivative(exp,x)
```

要推导导数类的实例,可以使用算式的`doit()`方法


```python
Derivative(exp,x).doit()
```

##  `integrate(exp,var)`积分


```python
from sympy import integrate
from sympy import cos
```

### 不定积分


```python
exp = cos(x)
exp
```


```python
integrate(exp, x)
```

### 定积分

定积分一般会有上下限,可以用元组(integration_variable, lower_limit, upper_limit)替换var,sympy.注意`oo`表示无穷大


```python
from sympy import oo,exp
```

$ \int _0^\infty e^{-x} dx$


```python
integrate(exp(-x), (x, 0, oo))
```

### 重积分

比如我们想求如下这个二重积分

$\int _{-\infty}^\infty \int _{-\infty}^\infty e^{-x^2-y^2} dx dy$


```python
integrate(exp(-x**2 - y**2), (x, -oo, oo), (y, -oo, oo))
```

如果积分无法求得,那么它会返回原来的样子


```python
expr = integrate(x**x, x)
expr
```

就像微分一样,积分也有对应的类型Integral,定义方式也相似


```python
from sympy import Integral,log
```


```python
expr = Integral(log(x)**2, x)
expr 
```


```python
expr.doit()
```

## 极限

SymPy可以使用limit函数计算极限。


```python
from sympy import limit,sin
```


```python
limit(sin(x)/x, x, 0)
```


```python
expr = x**2/exp(x)
expr.subs(x, oo)
```




$\displaystyle \text{NaN}$




```python
limit(expr, x, oo)
```

极限也有一个类,也和上面的微分积分差不多


```python
from sympy import Limit
```


```python
expr = Limit((cos(x) - 1)/x, x, 0)
expr
```


```python
expr.doit()
```

## 泰勒展开

泰勒公式是一个用函数在某点的信息描述其附近取值的公式.如果函数足够平滑的话,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的邻域中的值.泰勒公式还给出了这个多项式和实际的函数值之间的偏差.

SymPy可以计算围绕一个点的函数做泰勒级数展开.它使用算式的`.series(x, x0, n)`方法,就像之前在验证欧拉公式时我们做的那样


```python
expr = exp(sin(x))
expr
```


```python
expr.series(x, 0, 4)
```


```python
from sympy import symbols
x0 = symbols("x0")
```


```python
expr.series(x, x0, 4)
```

## 有限差分

到目前为止我们分别用分析导数和原始函数来研究表达式.
但是如果我们想要一个表达式来估计曲线的导数,如果我们缺少一个闭合形式表示,或者我们还不知道函数值那又怎么办呢?
一种方法是使用有限差分法.

SymPy中提供了接口`as_finite_difference()`可以在任何微分实例上来生成任意阶导数的近似:


```python
from sympy import Function,finite_diff_weights,apply_finite_diff
```


```python
f = Function('f')
dfdx =  Derivative(f(x))#.diff(x)
dfdx
```


```python
dfdx.as_finite_difference()
```

这里我们使用步长为1,等距离估计的最小点数来近似函数对x的一阶导数.我们可以使用任意的步长


```python
f = Function('f')
d2fdx2 = Derivative(f(x),x, 2)
d2fdx2
```


```python
h = symbols('h')
d2fdx2.as_finite_difference([-3*h,-h,2*h])
```

如果要评估权重,你可以手动计算


```python
finite_diff_weights(2, [-3, -1, 2], 0)[-1][-1]
```

注意,我们只需要从`finite_diff_weights`返回的最后一个子列表中取最后一个元素.这样做的原因是`finite_diff_weights`产生较低阶导数的权重,并使用较少的点.

如果使用`finite_diff_weights`直接看起来很复杂,并且觉得Derivative实例操作的`as_finite_difference`函数不够灵活,则可以使用`apply_finite_diff`,它接受order，x_list，y_list和x0作为参数


```python
x_list = [-3, 1, 2]
y_list = symbols('a b c')
apply_finite_diff(1, x_list, y_list, 0)
```

1d044a2a5206fcae0ba2dda264bab9c77c7e9ab8
ipynb
Jupyter Notebook
src/数据分析篇/工具介绍/SymPy/符号计算/.ipynb_checkpoints/微积分-checkpoint.ipynb
hsz1273327/TutorialForDataScience
1d8e72c033a264297e80f43612cd44765365b09e
MIT
src/数据分析篇/工具介绍/SymPy/符号计算/.ipynb_checkpoints/微积分-checkpoint.ipynb
hsz1273327/TutorialForDataScience
1d8e72c033a264297e80f43612cd44765365b09e
MIT
2020-03-31T03:36:05.000Z
2020-03-31T03:36:21.000Z
src/数据分析篇/工具介绍/SymPy/符号计算/.ipynb_checkpoints/微积分-checkpoint.ipynb
hsz1273327/TutorialForDataScience
1d8e72c033a264297e80f43612cd44765365b09e
MIT
Qwen/Qwen-72B
1. YES
2. YES