Pythonで２次方程式を解いてみた

### 前置き
2次方程式とは、$x$の次数が2次、つまり$x$の２乗が出てくる方程式のことである。
基本形は、$ax^2 + bx+ c = 0$である。
今日は、Pythonを使って2次方程式の頂点を求め、方程式を解いてみました。

### 2次方程式の頂点を求めるプログラムコード
``` python
def find_vertex(a, b, c):
  # x座標の頂点を計算する
  vertex_x = -b / (2 * a)
  # y座標の頂点を計算する
  vertex_y = a * vertex_x**2 + b * vertex_x + c
  return vertex_x, vertex_y

# 2次方程式の係数を入力として受け取る
a = float(input("2次の係数(a)を入力してください: "))
b = float(input("1次の係数(b)を入力してください: "))
c = float(input("定数項(c)を入力してください: "))

# 頂点の座標を計算する
vertex_x, vertex_y = find_vertex(a, b, c)

# 結果を出力する
print(f"2次方程式 {a}x^2 + {b}x + {c} の頂点は ({vertex_x}, {vertex_y}) です。")
```
### プログラムコードの説明
ここでは、$a$を2次の係数、$b$を1次の係数、$c$を定数項として定義している。
頂点は、英語でvertexであり、2次関数のグラフと軸の交点である。

### 出力結果
``` python
2次の係数(a)を入力してください: 2
1次の係数(b)を入力してください: 5
定数項(c)を入力してください: 6
2次方程式 2.0x^2 + 5.0x + 6.0 の頂点は (-1.25, 2.875) です。

2次の係数(a)を入力してください: 3
1次の係数(b)を入力してください: 4
定数項(c)を入力してください: 6
2次方程式 3.0x^2 + 4.0x + 6.0 の頂点は (-0.6666666666666666, 4.666666666666667) です。

2次の係数(a)を入力してください: 5
1次の係数(b)を入力してください: 6
定数項(c)を入力してください: 8
2次方程式 5.0x^2 + 6.0x + 8.0 の頂点は (-0.6, 6.2) です。
```
### 平方完成とは
$y = $$ax^2 + bx + c$ を、$y=(x+p)^2 + q$という形に変えるというのが平方完成です。
引用元：https://www.try-it.jp/chapters-5954/sections-5955/lessons-6004/

### 出力結果の検証（まずは平方完成を用いて検証）
1つ目：*$2x^2+5x+6$*

この場合、$a= 2, b = 5, c = 6$ になる。
頂点を求めるには、$2(x+5/4)^2 + 23/8 = 0$
$x = -5/4$, $y = 23/8$となり、頂点は、($-1.25, 2.875$)になる。

2つ目：*$3x^2+4x+6$*
この場合、$a= 3, b = 4, c = 6$ になる。
頂点を求めるには、　$3(x+4/6)^2 + 56/12 = 0$
$x = -4/6$, $y = 56/12$となり、頂点は(**$-0.6666...$, $4.66666...$**)になる。
（注意）この場合、頂点は(**$-2/3$**, **$14/3$**)が正解ではあるが、循環小数になっている。

3つ目：*$5x^2+6x+8$*
この場合、$a= 5, b = 6, c = 8$ になる。
頂点を求めるには、$5(x+6/10)^2 + 124/20 = 0$
$x = -6/10, y = 124/20$となり、頂点は(**-$0.6, 6.2$**)になる。

しかし、平方完成を用いて、頂点を求めると計算ミスを起こしやすい。
そこで、頂点を求める公式を使って3つの方程式を解いてみた。

### 2次方程式の頂点を求める公式
引用元：https://juken-mikata.net/how-to/mathematics/quadratic-function-vertex.html
![Screenshot 2024-07-11 at 13.32.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/985f5488-1694-9098-3d5e-218fbd1f032e.png)

1つ目の式：**$2x^2 + 5x + 6$**
公式に当てはめると、
$-5$/($2$ x $2$ ), - ($5^2$ - $4$ x $2$ x $6$)/($4$ x $2$)
= $-5/4 , -(25 - 48)/ 8$
= $-5/4 , 23/8$
よって、頂点が（**$-1.25, 2.875$**）になり、答えが一致する。

2つ目の式: **$3x^2+4x+6$**
公式に当てはめると、
$-4$ / ($2$ x $3$) , -($4^2$- $4$ x $3$ x $6$) / ($4$ x $3$)
= $-4 / 6 , -(16-72) / 12$
= $-2/3 , 56/12$
よって、頂点が(**$-2/3, 14/3$**)になり、答えが一致する。

3つ目の式: **$5x^2+6x+8$**
公式に当てはめると、
$-6$ / $2$ x $5$ , -($6^2$ - $4$ x $5$ x $8$) / ($4$ x $5$)
= $-6/10$ , $-(36-160) / 20$
= $-3/5$ , $124/20$
よって、頂点が(**$0.6, 6.2$**)になり、答えが一致する。

これで頂点を求めることができましたが、次は実際に2次方程式を解いてみましょう。

### 2次方程式を解くプログラムコード
``` python
import math

def solve_quadratic_equation(a, b, c):
    # 判別式を計算する
    discriminant = b**2 - 4 * a * c

    # 判別式が負の場合、実数解が存在しない
    if discriminant < 0:
        return None

    # 解の公式を用いて解を計算する
    sqrt_discriminant = math.sqrt(discriminant)
    x1 = (-b + sqrt_discriminant) / (2 * a)
    x2 = (-b - sqrt_discriminant) / (2 * a)

    return x1, x2

# 2次方程式の係数を入力として受け取る
a = float(input("2次の係数(a)を入力してください: "))
b = float(input("1次の係数(b)を入力してください: "))
c = float(input("定数項(c)を入力してください: "))

# 2次方程式の解を計算する
solutions = solve_quadratic_equation(a, b, c)

# 解が存在する場合、それを出力する
if solutions:
    x1, x2 = solutions
    print(f"2次方程式 {a}x^2 + {b}x + {c} の解は x1 = {x1}, x2 = {x2} です。")
else:
    print("この2次方程式には実数解が存在しません。")
```
### プログラムコードの説明
このプログラムコードにおいては、$ax^2 + bx+ c$ という2次方程式の判別式である、
**$b^2 - 4ac$** を用いて実数解があるのかないのかを判別している。

$b^2 - 4ac$ の結果がマイナスの場合は、実数解($x$の解）は存在しない。
$b^2 - 4ac$ の結果が0の場合は、実数解($x$の解)は$1$つになる。
$b^2 - 4ac$ の結果がプラスの数の場合は、実数解($x$の解）は$2$つある。

### 出力結果
ここでは、実数解が存在しない方程式、$1$つ存在する方程式、$2$つ存在する方程式を$1$つずつ出力し、その後結果の検証を行う。

``` python
2次の係数(a)を入力してください: 3
1次の係数(b)を入力してください: 7
定数項(c)を入力してください: 8
この2次方程式には実数解が存在しません。
2次の係数(a)を入力してください: 4
1次の係数(b)を入力してください: 12
定数項(c)を入力してください: 9
2次方程式 4.0x^2 + 12.0x + 9.0 の解は x1 = -1.5, x2 = -1.5 です。
2次の係数(a)を入力してください: 4
1次の係数(b)を入力してください: 7
定数項(c)を入力してください: 3
2次方程式 4.0x^2 + 7.0x + 3.0 の解は x1 = -0.75, x2 = -1.0 です。
```
### 公式を用いた出力結果の検証
$1$つ目の方程式: **$3x^2 + 7x + 8$**
**$a = 3 , b = 7 , c = 8$**
判別式　$b^2 - 4ac$を使って、代入

$7^2$ - $4$ x $3$ x $8$ = $49 - 96 = -47$
判別式の結果がマイナスの数のため、**$実数解は存在しない。$**
よって、出力結果と公式を用いた検証結果が一致した。

$2$つ目の方程式: **$4x^2 + 12x + 9$**
**$a = 4 , b = 12, c = 9$**
判別式　$b^2 - 4ac$を使って、代入
$12^2$ - $4$ x $4$ x $9$ = $144 - 144 = 0$

判別式の結果が$0$のため、実数解は$1$つしか存在しない。
この場合、$(2x+3)^2$になり、解は$x = -1.5$になる。
よって、出力結果と公式を用いた検証結果が一致した。

$3$つ目の方程式: **$4x^2 + 7x + 3$**
**$a = 4 , b = 7, c = 3$**
判別式　$b^2 - 4ac$を使って、代入 
$7^2$ - $4$ x $4$ x $3$ = $1$

判別式の結果が$1$のため、実数解は$2$つ存在する。
この場合、$(x+1)(4x+3)$ になり、解は$x = -1, -3/4$になる。
よって、出力結果と公式を用いた検証結果が一致した。

### 終わりに
2次方程式は、日常生活においていろんな方法で使われている。
例えば、ボールを地面に落としたら、重力で跳ね返る。
この跳ね返りをグラフにできたりする。

皆さんも、このプログラムコードを参考にして、時間のある時に、2次方程式の頂点と解を求めてみてはいかがでしょうか。