Pythonで方程式の解を求めグラフで可視化する

数学
Sponsored Link

方程式をグラフ化してみることで、一体自分らは高校数学で何を習っていたのかを再確認しようと思います。

データをグラフ化することは最終的にプログラムがやってくれるので、それほど難しくはないです。

ここでは、文系プログラマーのためのPythonで学び直す高校数学という本をテキスト代わりに進めてみることにします。

この記事はこんな人におすすめ。

  • 一次方程式や二次方程式などをグラフ化する方法を知りたい。
  • 連立方程式をグラフ化する方法を知りたい。

プログラミング無料体験はこちら↓↓↓


Python を使ったグラフの描写

Pythonを使ってグラフの描写を行う際に一般的に必要なのがグラフの描写モジュール、今回は「matplotlib」を使います。

まずは「matplotlib」を使って、山形県の高校生、年代別平均身長のグラフを作ってみました。

以下のコードを実行すると、

import matplotlib.pyplot as plt 

x = [1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,
1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,
2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,
2016,2017,2018,2019] 

y=[168.60,168.90,168.80,169.10,169.00,169.50,169.80,169.60,169.80,
169.70,170.10,169.60,170.40,169.70,170.60,170.20,170.40,170.60,
170.40,170.90,171.10,171.00,171.00,170.90,170.70,171.00,171.00,171.10,
170.00,170.50,170.60,170.90,170.40,170.60,170.40,170.30,170.20,170.40,
170.10,170.60,170.40,170.30,170.30,170.10,170.10] 

plt.plot(x, y) 
plt.grid(color = '0.8') plt.show()

 

 

こんなグラフが描けました。

方程式のグラフを描く

方程式のグラフといっても、なんとなくピンときませんが、関数を可視化するというとわかるのではないでしょうか。

実際のところ方程式も関数なので、グラフ化することで方程式が何を表しているのかが視覚的に分かると思います。

ではさっそく方程式をグラフ化してみましょう。

一次方程式のグラフを描く

ではさっそく、一次方程式のグラフを描画してみましょう。

以下のプログラムは、xに1から10を代入した場合の  のグラフになります。

import matplotlib.pyplot as plt  # 描画モジュールのインポート

x = list(range(1, 11))  # xの値 1 ~ 10

y = []
for i in range(10):
    y.append(3 * x[i] - 24)  # y = 3x - 24
    
plt.plot(x, y)
plt.grid(color = '0.8')
plt.show()

正の一次方程式でしたので予想通りの結果になりましたね。

では次に負の一次方程式を書いてみますが、基本的な手順は同じです。

import matplotlib.pyplot as plt # 描画モジュールのインポート 

x = list(range(1, 11)) # xの値 1 ~ 10

y = []
for i in range(10):
    y.append(-5*x[i] + 3) # y = -5x + 3

plt.plot(x, y)
plt.grid(color = '0.8')
plt.show()

 

一次方程式 のグラフは以下のように、右肩下がりのグラフになります。

2次方程式のグラフを描く

次に2次方程式のグラフを描いてみます。

2次方程式は「xの2乗までを含む方程式」を言います。

ここでは、xの値が0.025刻みで-10から10までの値をとった場合の2次方程式 を描いてみます。

import matplotlib.pyplot as plt # 描画モジュールのインポート 
import numpy as np # 数値計算モジュールのインポート

x = np.arange(-10,10,0.025) # xの値 0.025刻みで -10 ~ 10 までに設定

y =x**2 - 3 # y=x**2−3

plt.plot(x, y)
plt.grid(color = '0.8')
plt.show()

2次方程式  の場合、グラフは以下のようになります。

ではもう一つやってみます。

xの値が -10 から 10 までで、0.01刻み、 のグラフを描いてみます。

import matplotlib.pyplot as plt # 描画モジュールのインポート 
import numpy as np # 数値計算モジュールのインポート 
x = np.arange(-10,10,0.01) # xの値 -10 ~ 10 0.01刻み。 
y = 2*x**2 + 12*x +13 # y = 2x^2+12x+13 
plt.plot(x, y) 
plt.show()

プログラムを実行すると、以下のようなグラフが描けました。

連立方程式を解く

次に連立方程式を解き、方程式を完成させます。

まず求める方程式は  。

この方程式に当てはまる、a と b を求める場合、 x と y に 座標(1, 1) と (5, 3) を代入して

という連立方程式を立て、その解を求めてみます。

Python を使って連立方程式の解を求めるために必要なのが「Sympy」ライブラリーの「Symbol」モジュール。

Symbol モジュールを使って、xとyに代入し解を求めます。

from sympy import Symbol, solve # 記号計算を行うためのライブラリからSymbol をインポート

# 式を定義する
a = Symbol('a')
b = Symbol('b')

ex1 = a + b -1
ex2 = 5*a + b -3

print(solve((ex1, ex2)))
{a: 1/2, b: 1/2}

連立方程式を解くと、a : 1/2、 b: 1/2、つまり方程式は   になります。

ではこの方程式をグラフで可視化してみましょう。

import matplotlib.pyplot as plt # 描画モジュールのインポート 
import numpy as np # 数値計算モジュールのインポート

# データ
x = np.arange(1, 10, 1)
y = 0.5 * x + 0.5

# グラフを描画
plt.plot(x, y)
plt.grid(color = '0.8')
plt.show()

xに1から10までを1刻みで代入したときのグラフが以下になります。

連立方程式のx と y を求める

先ほどは方程式を完成させるために、連立方程式を使いましたが今回は実際に連立方程式そのものを解いてみましょう。

解いてみる連立方程式は以下になります。

ではさっそく解いていきましょう。

from sympy import Symbol, solve # 記号計算を行うためのライブラリからSymbol をインポート 

# x と y を定義
x = Symbol('x')
y = Symbol('y')

ex1 = 3*x +5*y -14 # 3x + 5y = 14
ex2 = -3*x + 2*y + 7 # -3x + 2y = -7

print(solve((ex1, ex2)))

{x: 3, y: 1} 連立方程式の解

連立方程式の解は簡単に求められましたが、この解が何を意味するのかを可視化してみましょう。

import matplotlib.pyplot as plt # 描画モジュールのインポート  
import numpy as np # 数値計算モジュールのインポート

x = np.arange(-10, 20)  # xの値 -10 ~ 20
y = -3/5*x + 14/5 # y の値を求めるために、3*x +5*y -14 を5で割り両辺をそろえる。
y2 = 3/2*x - 7/2 # y の値を求めるために、-3*x + 2*y + 7 を2で割り両辺をそろえる。

# グラフの描画
plt.plot(x, y)
plt.plot(x, y2)
plt.axis('equal')
plt.grid(color = '0.8')
plt.show()

以下がグラフになりますが、二つの線が交わっているのが見えますね。

青い線が負の一次方程式でオレンジの線が正の一次方程式になります。

そして二つの線が交わっている点、つまり交点の座標が連立方程式の解の部分 (x: 3, y:1)になるのです。

プログラミング無料体験はこちら↓↓↓



Sponsored Link

コメント

タイトルとURLをコピーしました