ここ最近、改めて数学を勉強しており、今は線形代数に取り組んでいます。
参考書で学んだことをプログラミング言語のJuliaを使って視覚化すると、楽しく勉強できたので導入方法を紹介します。
デモ
この記事では、プログラミング言語のJuliaを使って、下図のように平面の方程式を視覚化します。
前半はJuliaの導入方法を説明し、後半で、プロット機能を使って図を作ります。
すべて無料ですので、経済的な負担はなく試せます。
動画
この記事の内容の動画版も作りました。時間は、7分12秒です。
※音声あり
Juliaとは
Juliaは2012年にリリースされた、科学計算に適した無料でオープンソースのプログラミング言語です。
詳しい特徴や仕様は、公式ドキュメントのIntroductionをご覧ください。
では、初めに導入方法を書いていきます。
インストールするもの
この記事では、下記の2つをインストールします。
1.のJuliaはプログラミング言語です。
2.のJupyter Notebookは、Juliaで計算したりドキュメントを作成するための計算環境です。
ブラウザで動くので、書類を作る感覚で、対話的に計算したりメモをかいたりできます。
前提環境
主に以下の環境で、動作を確認しました。
- OS:Windows 10 Pro ver.2004
- ブラウザ:Chrome
- Julia:Version 1.5.3 (2020-11-09)
1.Juliaをインストール
公式サイトからダウンロードして、インストールします。
各自、環境に合わせて選んでください。私はWindowsユーザーなので、Current stable release: v1.5.3 (Nov 9, 2020)の「Windows 64-bit (installer)」を選びました。
ダウンロードしたら、実行して画面の指示通りにインストールを進めます。
完了したらスタートメニューかデスクトップに「Julia」が追加されているはずなので、それを立ち上げてみて下さい。
すると、Julia REPLと呼ばれる、端末が立ち上がります。
1行ずつコマンドを打ち込むと、答えが返ってきます。下図のように試しに1+1と入力してみると、2が返ります。

外部のライブラリーを追加したり、電卓がわりにさっと計算したりする際はこの端末を使います。
2.Jupyter Notebook(IJulia)を導入
先ほどのREPLだと画像を扱ったりメモを残したりはできないので、勉強に使うには少々不便です。
そこでグラフィカルな計算環境であるJupyter Notebook(IJulia)を導入します。
デモ
▼ 使っている様子はこんな感じ。

▼ 数式や、マークダウンでメモも残せます。
数式やマークダウンについては、後述しています。

インストール
Julia用のJupyter Notebookは、Julia REPLから導入できます。
簡単にあらましを書くと、以下の通りです。
※ 正式な手順は、GithubのReadmeをご覧ください。
juliaの端末(REPL)で]キーを押してパッケージモードに入り、add IJulia
と入力し実行します。
julia> ]
(v1.5) pkg> add IJulia

インストールが済んだら、次のコマンドを入力して、notebookを立ち上げます。
※ パッケージモードから抜ける際は、Ctrl+Cを押します。
julia> using IJulia
julia> notebook()
初回はこんな回答が返ってきます。
install Jupyter via Conda, y/n? [y]:
yを入力して実行すると、Jupyter Notebookの実行に最低限必要なpythonがインストールされます。
- IJulia GitHubのReadme(クイックスタート)
https://github.com/JuliaLang/IJulia.jl - ドキュメント
https://julialang.github.io/IJulia.jl/stable/
既にPythonでJupyter Notebookを導入済の場合
私はPythonのAnacondaを以前にインストールしていたので、既にJupyter Notebookが入っていました。
その場合は、上記手順は必要ありません。
Jupyter Notebookを立ち上げ、右上からカーネルの変更をすればOKでした。

上のgif画像のように簡単な計算が実行されることを確認したら、ひとまず完了です。
コードを実行する(動作確認)
インストールが済んだら、とりあえず簡単なコードを実行して動作を確認しておきます。
使い方
Inと書かれた横のボックスに何かコード、例えばprint("Hello World!")
を書き、実行します。
実行は、上のRunボタンか、Shift+enterを押せばOKです。
すると、ボックスの下に実行結果が表示されます。コードに間違いがあると、エラーが表示されます。

3.Plotsをインストール
今回の記事の目的は数式の視覚化なので、プロット(グラフ)に関するパッケージを追加します。
今回インストールする主なパッケージは、以下の通りです。
- Plots
- GR
- PyPlot
1.のPlotsは視覚化に関するツールセットで、2.や3.はプロットツールです。3D表現や処理速度など、それぞれ特徴や強みを持っています。
Plotsを介して、バックエンドであるGRやPyPlotを制御することができます。
ちなみに、今回使うバックエンドはPyplotだけです。3DグラフはPyplotが一番思い通りの結果になったので使っています。GRも使い勝手が良いのでとりあえず導入しておきました。
インストール方法
juliaの端末(REPL)で、インストールを進めます。
例えば、Plotsをインストールするなら、端末で以下のように入力します。
]キーを押してパッケージモードに入り、add Plots
と入力し実行します。
julia> ]
(v1.5) pkg> add Plots
GR、PyPlotについても、同様に実行します。
※ パッケージモードから抜ける際は、Ctrl+Cを押します。
詳しくは、公式ドキュメントをご覧ください。
- インストール方法について
https://docs.juliaplots.org/latest/install/ - バックエンドの種類や特徴について
https://docs.juliaplots.org/latest/backends/
導入が済んだら、早速使ってみましょう!
プロットのテスト
まず、正常にインストールされているかを確認するため、簡単なグラフを描いてみます。
# Plotsの動作確認を行うコード
# バックエンドを起動、初期化
using Plots
pyplot()
# プロットのテスト
x = 0:5
y = 0:1:5;
plot(x, y)

平面の方程式を視覚化する
次は、平面の方程式をプロットしていきます。
平面は、以下の式で表されます。

上図の通り、今回は2x+y+z-6=0
をプロットしてみます。
今回は、書いたコードは、以下の通りです。
# 平面の方程式を視覚化する。
# 使用する公式:ax+by+cz-(ax_1+by_1+cz_1)=0
# プロットする式:2x+y+z-6=0
using LinearAlgebra
# 法線ベクトルを定義
normal = [2,1,1]
# 通る点(x1,y2,z3)を定義
point =[1,1,3]
# カッコ内(ax1+by2+cz3)を、定数dとし、内積を求めるコマンドで算出
d=dot(normal,point)
# xとyに-1から3(step 0.1)の値を与える
x = -1:0.1:3;
y = -1:0.1:3;
# 方程式を変形し、zの値を求める
z1(x,y) = (d-normal[1]*x-normal[2]*y)/normal[3]
# x,y,zをプロットする
plot(x,y,z1,xlim = (-5, 5),ylim = (-5, 5),zlim = (-3, 5),st=:surface,camera = (30, 0),fmt=:png,colorbar=false,size = (700, 700))
# 原点Oに点を打つ
scatter!(zeros(1),zeros(1),zeros(1),markersize = 7,label = "Origin")
# 通る点に点を打つ
scatter!([point[1]],[point[2]],[point[3]],markersize = 7, label="Point")
#法線ベクトルを表示する。
nv=point+normal
nx=[point[1],nv[1]]
ny=[point[2],nv[2]]
nz=[point[3],nv[3]]
plot!(nx,ny,nz, label="normal vector")
コードを実行すると、こうなります。
Shift+enterか、上部のRunボタンで実行されます。

アニメーションを作る
先ほど表示された図は、角度のせいで平面に見えづらいかもしれません。
そこで、カメラを回してみましょう。

コード
アニメーションのためのマクロが用意されており、簡単なコードでアニメ化ができます。
# カメラを回して、アニメーションとして表示する
# 平面の方程式を視覚化する。
# 使用する公式:ax+by+cz-(ax_1+by_1+cz_1)=0
# カメラを回して、アニメーションとして表示する
using LinearAlgebra
# 法線ベクトルを定義
normal = [2,1,1]
# 通る点(x1,y2,z3)を定義
point =[1,1,3]
# カッコ内(ax1+by2+cz3)を、定数dとし、内積を求めるコマンドで算出
d=dot(normal,point)
# xとyに-1から3(step 0.1)の値を与える
x = -1:0.1:3;
y = -1:0.1:3;
# 方程式を変形し、zの値を求める
z1(x,y) = (d-normal[1]*x-normal[2]*y)/normal[3]
# アニメーションを表示するためのマクロ" @gif"を実行する。
@gif for i in range(0, stop = 360, length = 60)
# x,y,zをプロットする
plot(x,y,z1, xlim = (-5, 5), ylim = (-5, 5), zlim = (-3, 5), st=:surface, camera = (i, 0), fmt=:png, colorbar=false, size = (700, 700))
# 原点Oに点を打つ
scatter!(zeros(1),zeros(1),zeros(1),markersize = 7,label = "Origin")
# 通る点に点を打つ
scatter!([point[1]],[point[2]],[point[3]],markersize = 7, label="Point")
#法線ベクトルを表示する。
nv=point+normal
nx=[point[1],nv[1]]
ny=[point[2],nv[2]]
nz=[point[3],nv[3]]
plot!(nx,ny,nz, label="normal vector")
end
▼ 詳しい仕様は、公式ドキュメントをご覧ください。
カメラを回すスライダーを作る
次に、カメラ角度を設定するスライダーを作ります。
逐一、角度を振るたびにコードの数字を書き換えるのは面倒ですが、マウスで可変できれば便利ですよね。
Interactというパッケージを使うと、Jupyter上で手軽に操作ボタンやスライダーなどのインターフェースを作れます。

コード
こちらもスライダーを作るためのマクロが用意されているので、コードは最小限で済みます。
# カメラを回して、アニメーションとして表示する
# 平面の方程式を視覚化する。
# 使用する公式:ax+by+cz-(ax_1+by_1+cz_1)=0
# カメラの角度を可変する、スライダーを作る
using LinearAlgebra
# 法線ベクトルを定義
normal = [2,1,1]
# 通る点(x1,y2,z3)を定義
point =[1,1,3]
# カッコ内(ax1+by2+cz3)を、定数dとし、内積を求めるコマンドで算出
d=dot(normal,point)
# xとyに-1から3(step 0.1)の値を与える
x = -1:0.1:3;
y = -1:0.1:3;
# 方程式を変形し、zの値を求める
z1(x,y) = (d-normal[1]*x-normal[2]*y)/normal[3]
# カメラの角度を可変する、スライダーを作る
@manipulate for i in -180:15:180
# x,y,zをプロットする
plot(x,y,z1, xlim = (-5, 5), ylim = (-5, 5 ), zlim = (-3, 5), st=:surface, camera = (i, 0), fmt=:png, colorbar=false, size = (700, 800))
# 原点Oに点を打つ
scatter!(zeros(1),zeros(1),zeros(1),markersize = 7,label = "Origin")
# 通る点に点を打つ
scatter!([point[1]],[point[2]],[point[3]],markersize = 7, label="Point")
#法線ベクトルを表示する。
nv=point+normal
nx=[point[1],nv[1]]
ny=[point[2],nv[2]]
nz=[point[3],nv[3]]
#plot!(nx,ny,nz, label="normal vector")
plot!(nx,ny,nz, label="normal vector")
end
インストール方法
juliaの端末(REPL)で、インストールを進めます。
以下のパッケージのインストールが必要です。
- WebIO
- Interact
例えば、WebIOをインストールするなら、端末で以下のように入力します。
julia> ]
(v1.5) pkg> add WebIO
▼ 詳しくは、公式ドキュメントをご覧ください。
Markdownや数式を書く方法
Jupyter Notebookで、Markdownの書式でメモを書いたり数式を表記する方法は、以下の通りです。
- 上部のメニューからMarkdownを選ぶ
※ Codeのままだとエラーが出る - ボックス内に内容を書く
- Runボタンで実行する

デモ
実行している様子は、こんな感じです。

書式のルール
数式
数式は、MathjaxというLatex表記用の表示エンジンを使って表記できます。
- インライン(文中):始まりと終わりに
$
を付ける。$ここに数式が入る$ - 独立して書く:始まりと終わりに
$$
を付ける。$$ここに数式が入る$$
▼ 数式の詳しい書き方は、以下の資料をご覧ください。数式のサンプルも見られます。
Markdown
マークダウンの書式は、適宜ネットの資料をご覧ください。

参考資料へのリンク一覧
julia
- 公式サイト
https://julialang.org/ - ドキュメント
https://docs.julialang.org/en/v1/ - チートシート
https://juliadocs.github.io/Julia-Cheat-Sheet/
Jupyter Notebook (IJulia)
Plots
- インストール方法について
https://docs.juliaplots.org/latest/install/ - バックエンドの種類や特徴について
https://docs.juliaplots.org/latest/backends/ - バックエンド別のプロット例(リンク先はPyPlot)
https://docs.juliaplots.org/latest/generated/pyplot/
Interact
数式表記
- LaTeXの数学表記ルール
https://en.wikibooks.org/wiki/LaTeX/Mathematics - MathJaxのデモ(”View Demo”で見本を見られる)
https://mathjax.github.io/MathJax-demos-web/
数学
- 平面の方程式について
大学の数学講義受講者のための、チートシートです。学生以外も見られるように公開されていて、とてもわかりやすいです。
さいごに
参考書を読むだけだと集中力が続かず投げてしまいがちでした。そこでJuliaで計算したりグラフを描いたりすると、何より分かりやすいですし、勉強に変化が出て面白くなりました。
また視覚化するには自分でコードを書かねばならないので、公式を咀嚼して、処理の流れを考えられる機会ができるのも良かったです。
▼ この記事の内容の動画版も作りました。時間は、7分12秒です。
※音声あり
▼ 関連記事