まっしーの貯蔵庫

思考のゴミ箱

陰関数のプロット

昔、僕が高校生だった頃は、数学Cという科目が残っていた。
数学Cの最後の方で”リサージュ曲線”の話が出てきていたものだ。
そこで先生は「これ手で計算して描くの面倒だから普通はPCに任せますwww」っていう話をしていた。
のを最近思い出した。


じゃあどう描くんだ。

未だに陰関数をプロットしなければならないという場面にはあまり遭遇していないのだが、とりあえず現時点で思いつくだけの描き方をリストアップする。

  1. 「Grapher」を用いる

Macを持っている人が使える、チート級の技。
二次元プロットも三次元プロットも可能である。
また、極座標も使うことができる。
さらに、どんな陽関数、陰関数も即プロットできる。

使い方は簡単。最初に座標系を選ぶ。
あとはプロットしてほしい式を打ち込むだけ。

どうも、微分とか積分とかもやってくれるらしい。とんでもないソフトだ。

  1. Gnuplot」を用いる

ググったけど、描き方忘れた。
大体のやり方は以下のとおり。

 + z=F(x,y)のグラフを三次元で描画
 + z=0を抜き取る
 + 抜き取った面を上から眺める

なるほどな、という感じのやり方であるが、もう少し簡単に描けないものだろうか。

  1. 微分方程式」を用いる

F(x,y)=0をxで微分する。
これによりdy/dxが求められる(求められない場合は、どんまい、としか言えない)。
それでできた微分方程式を、オイラー法なりルンゲクッタ法なり使って解く。

  1. python」を使う

mpl_toolkits.mplot3d の Axes3D というモジュール、すなわち潜在能力を呼び覚ます。
これにより、z=F(x,y)という関数であれば描画可能である。
今までの三次元プロットでよく使ったのはこの方法だ。

例。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

x=np.arange(-3,3,0.25)
y=np.arange(-3,3,0.25)

X,Y = np.meshgrid(x,y)

Z=np.sin(X)+np.cos(Y)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X,Y,Z)

plt.show()

f:id:astro_massii:20161009195103p:plain

何をやっているかというと

  1. x,yの範囲を設定する
  2. np.meshgrid(X,Y)により、XとYの網目をつくる
  3. z=F(x,y)を定義する。網目の各穴に対してzの値が定まる、という仕組み。
  4. 描画

という流れ。詳しくはググれ。pythonの三次元プロットのやり方を説明した日本語のサイトは多くはないが、やり方を分かりやすく書いてる方がいらっしゃるのでそっちを見るのが早い。

あとはz=0を抜き取ればいい。これはしたことないけど。てかできるんだろうか。知らん。


以上。
gnuplot微分方程式pythonの方法はx,yの2変数の陰関数でないと使えないという欠点がある。
やはりGrapher一強だろうか。
でも、Grapherを使うのは外道、という気もする。

今度、数値計算の本でも借りるか。