Pythonで学び直す数学【関数とグラフ／微分と積分編】～Matplotlibを使ってグラフを描画してみよう

仕事や趣味でPythonのコードを書いている方であれば、「JupyterNotebookを使ってグラフを描画」といってピンとくる方も多いと思いますが、実際に興味はあるけれど、どう使ってみればよいのかわからないという方も多いと思います。Pythonのライブラリの基本的な書き方を含め、学生時代に習った数学の問題を通して、グラフを描画するという形で演習をしていきたいと思います。

<b>「数学的な問題をPythonで簡単なスクリプトを作って動作を確認する」こと通して、Pythonに触れる機会をつくっていきたいと考えています。</b>Pythonに慣れるという点でも手を動かして考える機会にして頂ければ幸いです。

 

今回は、Pythonで学び直す数学【関数とグラフ・微分積分編】の確認をしていきたいと思います。
<a href="http://semi3del.xsrv.jp/dis/PythonMathBasic2.zip" target="_blank">演習問題のダウンロードはこちらから</a>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/ecdf9179-84c8-eeb2-fccb-cd29acefca5e.png)
数学の授業で、方程式を習った際に、方眼紙を用いて作図をした、という方もいらっしゃるかもしれません。<b>Pythonでは「matplotlib」というライブラリでグラフや図形を描画することができます。</b>

実際に、今回のテーマである「関数とグラフ／微分積分」について、以下の例題のPythonのコードを考えていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/09fd67db-d536-b349-400b-815afe8ce106.png)
それでは、「Maplotlibでグラフを描画」する方法からみていきましょう。

<h3>Matplotlibとは</h3>


Matplotlibとは、<b>Pythonで主に２次元のグラフを描画するためのライブラリ</b>のこと。

Matplotlibを利用するには、以下のようにインポートを行います。Asキーワードを使用してpltで呼び出せるようにします。

In
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/c716d3c8-339a-dbb3-a6de-e5129908e882.png)
まずは折れ線グラフの書き方から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/edf5bc03-be88-2334-e6fc-59ad2e16e511.png)
上図の折れ線グラフは以下のコードを記述することで表現できます。

In
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/f8657437-3990-4184-3de7-386efa54a361.png)
<b>x座標とy座標を与えてplot関数に引数として渡すことで、折れ線グラフを描画することができる</b>のですね。

(x, y)が1つあれば点を描画でき、もう1つ(x2, y2) あれば、2点を結ぶ直線ができ、
細かく座標を取っていけば、関数のグラフも描画できる、といった具合に応用して考えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/37d0952d-c625-1e9c-7229-dc706faebbcd.png)
以下のような一次方程式のグラフを描画する例を考えてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/a35ed44a-842d-3959-3512-119547163a37.png)
Xを1～10の整数値で取得する方法として、<b>range関数</b>を利用することで開始値から終了までの連続した値を要素を生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/1a77339e-0a21-4f7e-a33e-4db67ad39c09.png)

y = 3x – 15 のグラフ　を描くには、上のようにxの値（リスト）を取得し、それに対応するyの値（リスト）をplot関数に引数として渡します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/3590a5f4-b65a-aff8-afba-5c7de271464c.png)
また、<b>配列や行列を効率よく扱うことができるパッケージである「numpy」 をインポートしてから利用することで、より簡易的に直線の方程式を「yにxを代入する式」として記述することができます。</b>

xを1～10の整数値で取得する方法として、<b>arange関数</b>を利用することで開始値から終了までの連続した値を要素を生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/ac32f780-bb4f-40a1-ee26-20003aec6ede.png)



⇒ ここで類題として、添付資料「直交する直線」シートにある演習問題を解いてみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/d2253319-a211-5333-c158-b9f922a5a540.png)

<h3>連立方程式</h3>

Pythonのライブラリを使った連立方程式の解き方をみていきましょう。
具体的には、<b>SymPyの中からSymbolクラスのオブジェクトを生成して、solve関数を実行</b>して求めます。
例をみていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/69548057-fd0c-87d2-549e-078b7a40574b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/1e23c049-30ed-5df5-ca58-e91771f5fcc6.png)
⇒ ここで類題として、添付資料「2直線の交点」シートにある演習問題を解いてみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/2f64e8b8-8509-b100-890b-2a6a1b48437a.png)


matplotlibを使って、関数とグラフを描画する方法とPythonのライブラリを利用して直線の交点を求める方法について紹介しました。

これまでの知識をもとに、方程式のグラフを描画する以下の演習を解いてみましょう。

<h3>関数と導関数</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/f5ffc825-f6e0-727d-5575-2cdbe38ffc96.png)
<h3>接線を描画</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/e4add0a8-31ad-7db7-0723-e52d1928a060.png)

<h3>定積分</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/c7236d12-a6b4-3b47-9d42-97662e476d90.png)
<hr>
以前学校で学んできた内容をもとに<b>Pythonでスクリプトを実行しながら確認できる</b>のは面白いなと感じる方もいらっしゃるかもしれません。<b>自分にできる範囲のものから少しずつPythonにも挑戦してみようかな</b>と思っていただければ幸いです。

以上となります。



参考文献：
・谷尻かおり『文系プログラマーのためのPythonで学び直す高校数学』日経BP社（2021年）