PR

Juliaの導入方法とプロット例。数式を視覚化すると面白かったよ

juliaの導入からプロットまで 勉強の記録

ここ最近、改めて数学を勉強しており、今は線形代数に取り組んでいます。
参考書で学んだことをプログラミング言語のJuliaを使って視覚化すると、楽しく勉強できたので導入方法を紹介します。

スポンサーリンク

デモ

この記事では、プログラミング言語のJuliaを使って、下図のように平面の方程式を視覚化します。

前半はJuliaの導入方法を説明し、後半で、プロット機能を使って図を作ります。
すべて無料ですので、経済的な負担はなく試せます。

動画

この記事の内容の動画版も作りました。時間は、7分12秒です。
※音声あり

Juliaとは

Juliaは2012年にリリースされた、科学計算に適した無料でオープンソースのプログラミング言語です。

詳しい特徴や仕様は、公式ドキュメントのIntroductionをご覧ください。

Julia Documentation · The Julia Language
Documentation for The Julia Language.

では、初めに導入方法を書いていきます。

インストールするもの

この記事では、下記の2つをインストールします。

1.のJuliaはプログラミング言語です。
2.のJupyter Notebookは、Juliaで計算したりドキュメントを作成するための計算環境です。
ブラウザで動くので、書類を作る感覚で、対話的に計算したりメモをかいたりできます。

前提環境

主に以下の環境で、動作を確認しました。

  • OS:Windows 10 Pro ver.2004
  • ブラウザ:Chrome
  • Julia:Version 1.5.3 (2020-11-09)

1.Juliaをインストール

公式サイトからダウンロードして、インストールします。

Download Julia
The official website for the Julia Language. Julia is a language that is fast, dynamic, easy to use, and open source. Cl...

各自、環境に合わせて選んでください。私はWindowsユーザーなので、Current stable release: v1.5.3 (Nov 9, 2020)の「Windows 64-bit (installer)」を選びました。
ダウンロードしたら、実行して画面の指示通りにインストールを進めます。

完了したらスタートメニューかデスクトップに「Julia」が追加されているはずなので、それを立ち上げてみて下さい。

すると、Julia REPLと呼ばれる、端末が立ち上がります。

1行ずつコマンドを打ち込むと、答えが返ってきます。下図のように試しに1+1と入力してみると、2が返ります。

Julia REPLに入力する様子

外部のライブラリーを追加したり、電卓がわりにさっと計算したりする際はこの端末を使います。

2.Jupyter Notebook(IJulia)を導入

先ほどのREPLだと画像を扱ったりメモを残したりはできないので、勉強に使うには少々不便です。
そこでグラフィカルな計算環境であるJupyter Notebook(IJulia)を導入します。

デモ

▼ 使っている様子はこんな感じ。

ijuliaのデモ

▼ 数式や、マークダウンでメモも残せます。

数式やマークダウンについては、後述しています。

Ijuliaでマークダウンを使った様子
Ijuliaでマークダウンでメモした様子

インストール

Julia用のJupyter Notebookは、Julia REPLから導入できます。

既にPython用にJupyter Notebookを導入済の方は、次項をご覧ください。

簡単にあらましを書くと、以下の通りです。
※ 正式な手順は、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がインストールされます。

▼ 公式ドキュメントへのリンク

既にPythonでJupyter Notebookを導入済の場合

私はPythonのAnacondaを以前にインストールしていたので、既にJupyter Notebookが入っていました。
その場合は、上記手順は必要ありません。
Jupyter Notebookを立ち上げ、右上からカーネルの変更をすればOKでした。

上のgif画像のように簡単な計算が実行されることを確認したら、ひとまず完了です。

コードを実行する(動作確認)

インストールが済んだら、とりあえず簡単なコードを実行して動作を確認しておきます。

使い方

Inと書かれた横のボックスに何かコード、例えばprint("Hello World!")を書き、実行します。
実行は、上のRunボタンか、Shift+enterを押せばOKです。
すると、ボックスの下に実行結果が表示されます。コードに間違いがあると、エラーが表示されます。

julia-jupyter-notebookでコードを実行する
Jupyter notebookでコードを実行する方法

3.Plotsをインストール

今回の記事の目的は数式の視覚化なので、プロット(グラフ)に関するパッケージを追加します。

今回インストールする主なパッケージは、以下の通りです。

  1. Plots
  2. GR
  3. PyPlot

1.のPlotsは視覚化に関するツールセットで、2.や3.はプロットツールです。3D表現や処理速度など、それぞれ特徴や強みを持っています。
Plotsを介して、バックエンドであるGRやPyPlotを制御することができます。

ちなみに、今回使うバックエンドはPyplotだけです。3DグラフはPyplotが一番思い通りの結果になったので使っています。GRも使い勝手が良いのでとりあえず導入しておきました。

インストール方法

juliaの端末(REPL)で、インストールを進めます。
例えば、Plotsをインストールするなら、端末で以下のように入力します。
]キーを押してパッケージモードに入り、add Plotsと入力し実行します。

julia> ]
(v1.5) pkg> add Plots

GRPyPlotについても、同様に実行します。

※ パッケージモードから抜ける際は、Ctrl+Cを押します。

詳しくは、公式ドキュメントをご覧ください。

▼ 公式ドキュメントへのリンク

導入が済んだら、早速使ってみましょう!

プロットのテスト

まず、正常にインストールされているかを確認するため、簡単なグラフを描いてみます。

# Plotsの動作確認を行うコード
# バックエンドを起動、初期化
using Plots
pyplot()

# プロットのテスト
x = 0:5
y =  0:1:5;
plot(x, y)
juliaでplotsをテスト
IJjulia上でPlotsをテストした様子

平面の方程式を視覚化する

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

上図の通り、今回は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ボタンで実行されます。

アニメーションを作る

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

Juliaのplotsのアニメーション機能を使った様子

コード

アニメーションのためのマクロが用意されており、簡単なコードでアニメ化ができます。

# カメラを回して、アニメーションとして表示する
# 平面の方程式を視覚化する。
# 使用する公式: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

▼ 詳しい仕様は、公式ドキュメントをご覧ください。

Animations · Plots
Documentation for Plots.

カメラを回すスライダーを作る

次に、カメラ角度を設定するスライダーを作ります。
逐一、角度を振るたびにコードの数字を書き換えるのは面倒ですが、マウスで可変できれば便利ですよね。

Interactというパッケージを使うと、Jupyter上で手軽に操作ボタンやスライダーなどのインターフェースを作れます。

JuliaでInteractを使ってスライダーを設けた様子
スライダーでカメラ角度を変化させる様子

コード

こちらもスライダーを作るためのマクロが用意されているので、コードは最小限で済みます。

# カメラを回して、アニメーションとして表示する
# 平面の方程式を視覚化する。
# 使用する公式: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

▼ 詳しくは、公式ドキュメントをご覧ください。

GitHub - JuliaGizmos/Interact.jl: Interactive widgets to play with your Julia code
Interactive widgets to play with your Julia code. Contribute to JuliaGizmos/Interact.jl development by creating an accou...

Markdownや数式を書く方法

Jupyter Notebookで、Markdownの書式でメモを書いたり数式を表記する方法は、以下の通りです。

  1. 上部のメニューからMarkdownを選ぶ
    ※ Codeのままだとエラーが出る
  2. ボックス内に内容を書く
  3. Runボタンで実行する
ijuliaでmarkdown表記を使う

デモ

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

ijuliaで、数式やmarkdownを書いている様子

書式のルール

数式

数式は、MathjaxというLatex表記用の表示エンジンを使って表記できます。

  • インライン(文中):始まりと終わりに$を付ける。$ここに数式が入る$
  • 独立して書く:始まりと終わりに$$を付ける。$$ここに数式が入る$$

▼ 数式の詳しい書き方は、以下の資料をご覧ください。数式のサンプルも見られます。

LaTeX/Mathematics - Wikibooks, open books for an open world
MathJax-demos-web
A repository with examples using mathjax-v3

Markdown

マークダウンの書式は、適宜ネットの資料をご覧ください。

Basic writing and formatting syntax - GitHub Docs
Create sophisticated formatting for your prose and code on GitHub with simple syntax.

参考資料へのリンク一覧

julia

Jupyter Notebook (IJulia)

Plots

Interact

数式表記

数学

  • 平面の方程式について
    大学の数学講義受講者のための、チートシートです。学生以外も見られるように公開されていて、とてもわかりやすいです。
Calculus III - Equations of Planes
In this section we will derive the vector and scalar equation of a plane. We also show how to write the equation of a pl...

さいごに

参考書を読むだけだと集中力が続かず投げてしまいがちでした。そこでJuliaで計算したりグラフを描いたりすると、何より分かりやすいですし、勉強に変化が出て面白くなりました。
また視覚化するには自分でコードを書かねばならないので、公式を咀嚼して、処理の流れを考えられる機会ができるのも良かったです。

▼ この記事の内容の動画版も作りました。時間は、7分12秒です。
※音声あり

▼ 関連記事

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