# Chapter 7 Solvers


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

## 7.1 方程式についての注意

`Sympy`での方程式は`Eq`関数を使う


```python
Eq(x,y)
```


```python
solveset(Eq(x**2, 1), x) #Eq(左辺, 右辺)
```


```python
solveset(Eq(x**2 - 1, 0), x)
```


```python
solveset(x**2 - 1, x) #式 = 0　とした「式」が第一引数
```

--->`Sympy`では、式はすべて`=0`とみなされる. `Eq`関数を使わなくても、差で表現してやればよい.

## 7.2 代数的に方程式を解く

代数方程式を解く基本的な関数は`solveset(equation, variable=None, domain=S.Complexes)`. 

他に関数`solve()`があるが、基本的には関数`solveset()`を用いる.


```python
solveset(x**2-x, x)
```


```python
solveset(x - x, x, domain=S.Reals)
```


```python
solveset(sin(x) - 1, x, domain=S.Reals)
```

--->勝手に`n`を導入して解いてくれる.

#### 解がないときは空集合を返す:


```python
solveset(exp(x),x)
```


```python
solveset(cos(x) - x, x)
```

#### 連立方程式: `linsolve関数`


```python
linsolve([x + y + z - 1, x + y + 2*z -3], (x, y, z))
```


```python
linsolve(Matrix((
    [1, 1, 1, 1],
    [1, 1, 2, 3])), (x, y, z)) #Matrix関数についてはChapter 8
```


```python
M = Matrix(((
1, 1, 1, 1),
 (1, 1, 2, 3)   
))
```


```python
system = A, b = M[:,:-1], M[:,-1]
```


```python
linsolve(system, x, y, z)
```

ただし高次の式になると,


```python
solveset(x**3 - 6*x**2 + 9*x, x)
```

となって、解の重根の有無と縮退度がわからない. そこで


```python
roots(x**3 - 6*x**2 + 9*x, x)
```

とすれば、解`0`が1個、解`3`が2個出てくるとわかる.　実際


```python
factor(x**3 - 6*x**2 + 9*x)
```

**注意**: `solveset`の使えない方程式
    - 非線形多変数系
    - LambertWで解ける方程式

こういう場合は`solve()`関数で解ける:


```python
solve([x*y - 1, x -2], x, y)
```

オプション`dict ='True'`を付けると結果がリストの要素としての辞書型で得られる.


```python
solve([x*y - 1, x -2], x, y, dict ='True')
```


```python
solve(x*exp(x) - 1, x)
```

## 7.3 微分方程式を解く

関数の設定: SymPyオブジェクトへ。


```python
f, g = symbols('f g', cls=Function) #解きたいものが関数なので、cls=Function オプションを付ける.
```


```python
f(x)
```

☆導関数は、Chapter 6 でやったように、関数Derivative()を使ってもできるし、


```python
Derivative(f(x),x,1)
```

未知関数 `f(x)` に対するメソッド `diff` を用いても良い:


```python
f(x).diff(x)
```

**コメント**

ここでdiffメソッドが使えたのは、未知関数f(x)に対して用いているため。

==> 今、微分方程式$$f''(x)-2f'(x)+f(x)=\sin(x)$$を解くことを考える. これは


```python
diffeq = Eq(f(x).diff(x, 2) - 2*f(x).diff(x) + f(x),  sin(x))
```


```python
diffeq #微分方程式
```

微分方程式は`dsolve`関数で解ける！


```python
dsolve(diffeq, f(x)) #第二引数で解きたい関数を指定
```


```python
dsolve(f(x).diff(x)*(1-sin(f(x))),f(x))
```

次が最後！ [Chapter8 Matrices](https://hiroyuki827.github.io/SymPy_tutorial/Chapter8_Matrices.html)へ!

909de5c25a0de570454605cadb2a0ba1c783c4d7
ipynb
Jupyter Notebook
Chapter7_Solvers.ipynb
hiroyuki827/SymPy_tutorial
8423ceab49482dc83c90c4cb1d388cad100ced84
BSD-3-Clause
2018-01-02T16:53:11.000Z
2021-05-05T13:48:49.000Z
Chapter7_Solvers.ipynb
hiroyuki827/SymPy_tutorial
8423ceab49482dc83c90c4cb1d388cad100ced84
BSD-3-Clause
2018-06-12T03:51:09.000Z
2018-06-13T08:15:45.000Z
Chapter7_Solvers.ipynb
hiroyuki827/SymPy_tutorial
8423ceab49482dc83c90c4cb1d388cad100ced84
BSD-3-Clause
Qwen/Qwen-72B
1. YES
2. YES