読者です 読者をやめる 読者になる 読者になる

gnuplot で陰関数の表示(Ruby)

Ruby 数学

Python の matplotlib の plot_implicit による陰関数の描画がどうも信用ならないので、gnuplot でやってみることを考えた。しかし gnuplot 自体には陰関数を直接描画する機能はないので、工夫が必要となる。

gnuplot で陰関数を描く
基本的には上サイトでやっているように、3次元描画をして高さ 0 の等高線を描くという手段をとる。こんな感じになる。

描画した関数はひとつ前の記事と同じである。

Ruby コードは以下。なお、Gem は 'gnuplot' ではなく 'numo/gnuplot'を使った。この Gem の利用例はここに詳しい。

require 'bundler/setup'
require 'numo/gnuplot'

Numo.gnuplot do
  set "contour"      #等高線の描画を指定
  set "cntrparam levels discrete 0"    #指定された高さの点に等高線を引く
  set style: "line 1 lw 2"
  set style: "increment user"
  set isosamples: [100, 100]    #面描画に使用する線の数を設定する(3次元)
  unset "surface"    #網を表示しない
  unset "ztics"      #z軸の目盛の数値を表示しない
  set border: 15     #枠の設定(15は上下左右に枠を描く)
  set view: [0, 0]   #視点の設定(0,0はz軸方向から見る)
  set "zeroaxis"     #すべての軸の座標軸を表示する
  unset "key"        #関数名を書かない
  set xrange: -1.1..1.1
  set yrange: -1..1.6
  splot "x ** 6 + 3 * x ** 4 * y ** 2 + 6 * x ** 4 * y - 2 * x ** 4 + 3 * x ** 2 * y ** 4" +
    "- 2 *  x ** 2 * y ** 3 - 6 * x ** 2 * y ** 2 - 6 * x ** 2 * y + 3 * x ** 2 + y ** 6" +
    "- 3 * y ** 4 + 3 * y ** 2 - 1"
end

gets

どうも等高線の色を指定するのがうまくいかない。バグだろうか?
 
3次元で描いてみるとこんな感じ。

 

※参考
gnuplotコマンド集
Gnuplot's Tips
Gnuplot FAQ
gnuplot-ja