本日は
Juliaで陰関数の描画をしたいお気持ちにかられたのでそのメモをします.
二変数関数 $z=f(x,y)$ が与えられたとき $f(x,y) = 0$ を満たすような二次元の点 $(x,y)$ の集合を描画するというものです. 陰関数は implicit function なのでそのキーワードで調べると Juliaの discourse に出会いました.どうやら ImplicitEquations.jl というパッケージがあるみたいです.
Install
公式パッケージらしいので add で入ります.
julia> ] # just type ]
(v1.1) pkg> add ImplicitEquations
余談ですがパッケージ導入の方法はREPLモード上でも下記のようにしてできます.
julia>using Pkg
julia>Pkg.add("ImplicitEquations")
# 複数のパッケージを一気に導入もできる
julia>Pkg.add(["Plots","ImplicitEquations"])
# string macro @pkg_str を用いた方法
julia> using Pkg
julia> pkg"add Plots ImplicitEquations"
# こんな感じでワンラインでもOK
julia> using Pkg; pkg"add Plots"
To return to the julia> prompt, either press backspace when the input line is empty or press Ctrl+C. Help is available by calling pkg> help. If you are in an environment that does not have access to a REPL you can still use the REPL mode commands using the string macro pkg available after using Pkg. The command pkg"cmd" would be equivalent to executing cmd in the REPL mode.
使ってみる
円の例
半径1の円の方程式は $x^2 + y^2 = 1$ とかけます.これは点 $(x,y)$ と原点の距離が1の点の集まりともみることができます.また二変数関数 $f(x,y)=x^2+y^2-1$ の f(x,y) = 0 を満たす点の集まりともみることができます.なんにせよ Julia でこれを表現してみませう.ImplicitEquations.jlを用いると簡単です
using Plots
gr()
using ImplicitEquations
f(x,y) = x^2 + y^2 - 1
plot(f ⩵ 0, aspect_ratio=:equal)
無事円が表示できましたね.ここで注意するのが ==
を使うのではなく \Equal
+ Tab で得られる ⩵
用いなければいけません.
⩵
の記入の仕方わからないよーという場合でも Julia の help mode でそれをコピペすれば使い方・入力方法を教えてくれます.
楕円曲線の例
$y^2 = x^3 + ax+b$ というような形の方程式を満たす点の集まりを描画してみましょう
using Plots
gr()
using ImplicitEquations
a = -1
b = 1
f(x,y) = y^2 - x^3 - a * x - b
plot(f ⩵ 0, aspect_ratio=:equal)
結果は下記の通り
これは Wikipedia の楕円曲線の例の一つです. https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A
うーん.こんな便利なパッケージがあったらもっと早く使いたかったなぁ・・・
追記
\Equal
の代わりに Eq(f,0)
と書いても良い. また $f\geq 0$ を満たす領域を描画することもできる Hint: Lt, Gt を使う.
陰関数描画アルゴリズムの文献
メモとして陰関数表示のアルゴリズムの文献表を置いておきます.ImplicitEquationsの実装は Tupper氏 の方法を用いているようです.
その他日本語で読めるものとして