ホーム >  Python > Jupyter Notebook >  【matplotlib】Pythonで連立方程式を解く【高校数学】

投稿日:   |  最終更新日:

【matplotlib】Pythonで連立方程式を解く【高校数学】

Jupyter NotebookpydataPython数学

Pythonを使って連立方程式を解きます。matplotlibパッケージのpyplotモジュールを使います。

PCにおける一次関数

マウスで直線を引くと、始点と終点をクリックします。クリックという行為を行うと、その座標(x,y)がコンピュータに取り込まれます。始点と終点を結ぶとき、一次関数をグラフ化するのと同じことが行われます。

準備

①VSCodeをインストールします。

MacOSでVisual Studio Codeをインストール

②VSCodeにPython実行環境を作ります。

【MacOS】PythonをインストールしてVSCodeの実行環境をつくる【Python】

③Anacondaをインストールします。

【MacOS】Anaconda3をインストールする【Python3】

④MacPCにインストールしたVSCODEからAnaconda3を利用できる状態にします。

【MacOS】Visual Studio Code(VSCode)にAnacondaの仮想環境を指定【MacOS】

環境

PC MacBook Air (Retina, 13-inch, 2019)
CPU 1.6 GHz デュアルコアIntel Core i5
メモリ 16 GB 2133 MHz LPDDR3
OS Catalina 10.15.7
Visual Studio Code 1.50.0
Conda 4.9.2
matplotlib 3.4.2
numpy 1.20.3


2点を結ぶ直線

一次方程式の一般式は、以下のようになります。

\[
y=ax+b
\]

aは、直線の傾きです。xの変化に伴ってyがどれくらい変化するかを表したもので,yの変化量/xの変化量で表せます。bは、y軸との切片です。y軸と直線が交差するところのy座標です。

マウスの座標

マウスクリックで得られた座標が、(1,1)と(5,3)と仮定します。これに座標軸を重ねた様子です。

x座標が2つ増えるごとに、y座標が1つ増えます。このことから、

  • 直線の傾きa・・・\(\frac{1}{2}\)
  • 切片b・・・0.5 = \(\frac{1}{2}\)

この直線を一次関数であらわすと、

\[
y=\frac{1}{2}x+\frac{1}{2}
\]

ということになります。

与えられた座標から式を求める

描画されたグラフからではなく、与えられた座標から\(y=ax+b\)のaとbを求めるには、2つの座標(1,1)(3,5)を代入して以下のような連立方程式を立てます。

\begin{cases}a+b=1・・・①\\5a+b=3・・・② \end{cases}

計算1:①-②の結果・・・\(-4a = -2\)

\(a=\frac{1}{2}\)

計算2:\(\frac{1}{2}+b=1\)

\(b=\frac{1}{2}\)


連立方程式をPythonで解く

数学では、加減法と代入法で連立方程式をときますが、この方法は式によって計算の仕方が変わるためプログラミングには向きません。PythonであればSymPyで定義されている関数を使って連立方程式をとくことができます。

\begin{cases}a+b=1\\5a+b=3\end{cases}を解くプログラムは、以下の通りです。

import sympy

#式を定義
a = sympy.Symbol('a')
b = sympy.Symbol('b')
ex1 = a + b - 1
ex2 = 5*a + b - 3

#連立方程式を解く
print(sympy.solve([ex1,ex2]))

結果:

{a: 1/2, b: 1/2}

解説

import sympy

連立方程式を解くための命令をインポートします。

SymPyは代数計算(数式処理)を行うPythonのライブラリです。因数分解したり、方程式(連立方程式)を解いたり、微分積分を計算したりすることができます。

a = sympy.Symbol('a')
b = sympy.Symbol('b')

式の中で使う文字を定義します。Symbolを使って、xやyなどの変数、式を定義します。

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

それぞれの式を定義します。必ず右辺が0になるように式を整理します。

#連立方程式を解く
print(sympy.solve([ex1,ex2]))

方程式を解く(方程式の解を取得する)場合はsympy.solve()を使います。複数の式を含むリスト(またはタプル)をsympy.solve()の引数に指定します。


直交する2本の直線

以下のような直線の式が2つあるとします。

\[
y=a_{1}x+b_{1}x
\]

\[
y=a_{2}x+b_{2}x
\]

以下の条件が成立するとき、2つの直線は平行になります。これを直線の平行条件となります。

\(a_{1}=a_{2}\)

以下の条件が成立するとき、2つの直線は垂直になります。これを直線の直交条件となります。

\(a_{1}×a_{2}=-1\)

直交する直線の式を求める

ここで(1,5)を通って以下の点線\(y=\frac{1}{2}x+\frac{1}{2}\)と直交する直線の式を求めます。直線の傾きaは直線の直交条件により

\(\frac{1}{2}×a=-1\)

\(a=-2\)

求めた傾きと座標(1,5)を\(y=ax+b\)に代入すると、

\(5=-2×1+b\)

\(b=7\)

つまり、点線と直交する直線の式は\(y=-2x+7\)です。


以下のプログラムは、2直線が直交するかどうか確認するプログラムです。

元となる直線の式は\(y_{1}\)、この直線の式は\(y_{2}\)です。

import matplotlib.pyplot as plt
import numpy as np

#x軸の値
x = np.arange(-1,6)
#直線1
y = 1/2 * x + 1/2
#直線1に直交する直線
y2 = -2 * x + 7

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

解説

plt.axis('equal')

plot()関数で描画すれば良いのですが、matplotlibはグラフの全体が描画されるように目盛りの大きさを自動調整します。2直線が本当に確認するように、「plt.axis(‘equal’)」xあるいはyの上限・下限を調整して同じ座標値の増分を等しくします。

2つの直線の式の解を求める

2本の直線を引いたとき、その2直線が平行でない限りかならずどこかで1点に交わります。このときの好転は、2つの直線の式を同時に満たす点、つまり連立方程式の解になります。

2本の直線の式は、

\(y=-\frac{3}{2}x+6\)
\(y=\frac{1}{2}x+2\)

です。求める交点はこの連立方程式の解です。

これを、SymPyのSolve()関数を使って解きます。

from sympy import Symbol, solve
x = Symbol('x')
y = Symbol('y')
ex1 = -3/2*x + 6 - y
ex2 = 1/2*x + 2 - y
print(solve(ex1,ex2))

結果:

{x: 2.00000000000000, y: 3.00000000000000}

交点の座標は(2,3)です。

次回

比例式をPythonで解きます。

  • 【matplotlib】Pythonで比例式を解く【高校数学】

  • トラックバック用のURL
    プロフィール

    名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

    最近の投稿
    人気記事
    カテゴリー
    広告