# Chapter 6 Calculus


```python
from sympy import *
x, y, z = symbols('x y z')
init_printing(use_unicode=True)
```

## 6.1 微分

微分するには


```python
diff(cos(x),x)
```


```python
diff(exp(x**2),x)
```

とする。これらの関数はその場で微分操作を評価するので、未知関数には使えない。(微分方程式については後述)。

2階以上の微分をするには


```python
diff(x**4, x, x, x)
```

もしくは


```python
diff(x**4, x, 3) #xの3階微分.
```

とすればよい. 

予想されるように、微分不可能になると


```python
diff(x**4, x, 5)
```

と0を返す. 

多変数関数、たとえば$$e^{xyz}$$に対しても同様に


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


```python
diff(expr,x, y, y, z, z, z, z)
```


```python
diff(expr, x, y, 2, z, 4) #x,y:2階, z: 4階
```


```python
diff(expr, x, y, y, z, 4) #x, y, z: 4階
```

**コメント** `diff`は`Sympy`オブジェクトに対するメソッドとしても呼べる:


```python
expr.diff(x, y, y, z, 4)
```

#### 微分操作を行いたくないとき

上で述べたように、`diff`関数はその場で式を微分してしまうので、微分方程式には使えない.
その代わりに評価する前の微分を作るには`Derivative`を使えばよい。


```python
deriv = Derivative(expr, x, y, y, z, 4)
```


```python
deriv
```

これを評価するには`doit`メソッドを使う:


```python
deriv.doit() #diff関数で評価するものと同じ.
```

**コメント**: `Derivative()`は微分方程式などに使える.

## 6.2 積分


```python
integrate(cos(x), x)
```

**注意**: 不定積分であっても、未定定数は出力されない.

**例**: 定積分$$\int_{0}^{\infty}e^{-x} \, dx$$は


```python
integrate(exp(-x), (x, 0, oo)) #無限大は'o'２つ
```

と計算できる. 

**例:** 2重積分$$\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))
```

と計算できる.

#### 積分が評価できないとき

もし積分が評価できないときは, `Integral`で返す:


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


```python
print(expr)
```

    Integral(x**x, x)



```python
expr
```

**コメント** 積分方程式に使える.

#### Integralの表式から積分値を評価したいとき


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


```python
expr
```


```python
expr.doit() #doit()をつければ評価される.
```

**コメント**: `integrate()`は合成関数とか、特殊関数に対しても使える!


```python
integ = Integral(x**y*exp(-x), (x, 0, oo))
```


```python
integ
```


```python
integ.doit()
```

収束性の場合分けまでやってくれる!!!

## 6.3 極限

極限$$\lim_{x \rightarrow 0}\frac{\sin(x)}{x}$$は


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

と評価できる.


```python
expr = x**2 / exp(x)
```


```python
expr.subs(x, oo) #oo/ooになる.
```


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

*極限操作と代入操作は厳密に区別すべき！*

#### 極限を評価したくないとき


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


```python
expr
```


```python
expr.doit() #極限値を評価
```

#### 極限の方向を決めたいとき(正方向, 負方向)

$$\lim_{x\rightarrow 0^{+}}\frac{1}{x}$$


```python
limit(1/x, x, 0, '+') #第四引数に'+'のオプション
```

$$\lim_{x \rightarrow 0^{-}}\frac{1}{x}$$


```python
limit(1/x, x, 0, '-') #第四引数に'-'のオプション
```

## 6.4 べき級数

関数`f(x)`を`x0`周りで`n`次まで展開: `f(x).series(x, x0, n)` (`x0`, `n`は省ける)


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


```python
expr.series(x, 0, 4) #最高次はオーダー記号として出力
```


```python
x + x**3 + x**6 + O(x**4) #大文字のO(オー)でオーダー記号を表せる.
```


```python
x*O(1) 
```

**コメント** オーダータームを除去するには


```python
expr.series(x, 0, 4).removeO() #こちらも大文字のO(オー)
```

とすればよい. なお、オーダータームは原点以外の点の周りの展開でも現れる.


```python
exp(x - 6).series(x, x0=6) #パラメータ引数?
```

## 6.5 有限差分

省略
http://docs.sympy.org/latest/tutorial/calculus.html#derivatives参照

次は[Chapter7 Solvers](https://hiroyuki827.github.io/SymPy_tutorial/Chapter7_Solvers.html)へ!
