1.6 外部ライブラリ(Matplotlib)
ツインテールdeエンジェルモード!! では、インタプリタ本体である /usr/local/bin/tt のみで完結しますので、これ以外の外部ライブラリ等はありません。
よって、グラフ描画は外部のグラフプログラムに描かせます。(餅は餅屋です。)
ここでは、 gnuplot を利用してみます。
http://www.gnuplot.info/
具体的なプロット方法ですが、
(1) ツインテールdeエンジェルモード!! でグラフデータを生成する。
(2) それを、 gnuplot で描画する。
という流れとなります。
では、簡単な sin() 関数のグラフから、、、
まずは、こんな感じのスクリプトファイル vvv を作成します。
% cat vvv
for( x=0 ; x<6 ; x+=0.1 ){
y=sin(x)
print("%f %f\n",x,y)
}
それを普通に実行して、結果をファイル data にリダイレクトして保存します。
% tt vvv > data
結果はこんな感じになります。
% cat data
0.000000 0.000000
0.100000 0.099833
0.200000 0.198669
0.300000 0.295520
0.400000 0.389418
0.500000 0.479426
0.600000 0.564642
0.700000 0.644218
0.800000 0.717356
0.900000 0.783327
1.000000 0.841471
1.100000 0.891207
1.200000 0.932039
1.300000 0.963558
1.400000 0.985450
1.500000 0.997495
1.600000 0.999574
1.700000 0.991665
1.800000 0.973848
1.900000 0.946300
2.000000 0.909297
2.100000 0.863209
2.200000 0.808496
2.300000 0.745705
2.400000 0.675463
2.500000 0.598472
2.600000 0.515501
2.700000 0.427380
2.800000 0.334988
2.900000 0.239249
3.000000 0.141120
3.100000 0.041581
3.200000 -0.058374
3.300000 -0.157746
3.400000 -0.255541
3.500000 -0.350783
3.600000 -0.442520
3.700000 -0.529836
3.800000 -0.611858
3.900000 -0.687766
4.000000 -0.756802
4.100000 -0.818277
4.200000 -0.871576
4.300000 -0.916166
4.400000 -0.951602
4.500000 -0.977530
4.600000 -0.993691
4.700000 -0.999923
4.800000 -0.996165
4.900000 -0.982453
5.000000 -0.958924
5.100000 -0.925815
5.200000 -0.883455
5.300000 -0.832267
5.400000 -0.772764
5.500000 -0.705540
5.600000 -0.631267
5.700000 -0.550686
5.800000 -0.464602
5.900000 -0.373877
6.000000 -0.279415
ここで、1つ注意。
x<6 だった筈なのに x=6.000000 が出力されています。
これは電子計算機で実数計算を行う場合に発生する、「誤差」によるものです。
ツインテールdeエンジェルモード!! は、生のコンピューターの演算結果を
そのまま返しますので、このようになります。
他の言語であっても、注意が必要です。
ちなみに、C言語で計算しても全く同じ結果となります。
これを回避するには、(1)ループ変数と終了判定を整数で行う。
(2)終了判定に余裕をもたせる。などの方法があります。
最初の方法だと、変数 t を導入して、
例えばこんな感じにすることで回避できます。
for( t=0 ; t<60 ; t+=1 ){
x=t/10.0
y=sin(x)
print("%f %f\n",x,y)
}
あるいは、こんな感じに終了判定を変更することで、
回避することもできます。
for( x=0 ; x<6-0.01 ; x+=0.1 ){
y=sin(x)
print("%f %f\n",x,y)
}
話がそれましたが、データファイル data のグラフをプロットしてみます。
gnuplot を立ち上げて次のコマンドを入力します。
% gnuplot
G N U P L O T
Version 5.0 patchlevel 5 last modified 2016-10-02
Copyright (C) 1986-1993, 1998, 2004, 2007-2016
Thomas Williams, Colin Kelley and many others
gnuplot home: http://www.gnuplot.info
faq, bugs, etc: type "help FAQ"
immediate help: type "help" (plot window: hit 'h')
Terminal type set to 'x11'
gnuplot> plot "data" with line
gnuplot>
同様に、 sin(x) と cos(x) のグラフも描いてみます。
こんな感じになります。
% cat vvv
for( x=0 ; x<6 ; x+=0.1 ){
y=sin(x)
z=cos(x)
print("%f %f %f\n",x,y,z)
}
% tt vvv > data
% cat data
0.000000 0.000000 1.000000
0.100000 0.099833 0.995004
0.200000 0.198669 0.980067
0.300000 0.295520 0.955336
0.400000 0.389418 0.921061
0.500000 0.479426 0.877583
0.600000 0.564642 0.825336
0.700000 0.644218 0.764842
0.800000 0.717356 0.696707
0.900000 0.783327 0.621610
1.000000 0.841471 0.540302
1.100000 0.891207 0.453596
1.200000 0.932039 0.362358
1.300000 0.963558 0.267499
1.400000 0.985450 0.169967
1.500000 0.997495 0.070737
1.600000 0.999574 -0.029200
1.700000 0.991665 -0.128844
1.800000 0.973848 -0.227202
1.900000 0.946300 -0.323290
2.000000 0.909297 -0.416147
2.100000 0.863209 -0.504846
2.200000 0.808496 -0.588501
2.300000 0.745705 -0.666276
2.400000 0.675463 -0.737394
2.500000 0.598472 -0.801144
2.600000 0.515501 -0.856889
2.700000 0.427380 -0.904072
2.800000 0.334988 -0.942222
2.900000 0.239249 -0.970958
3.000000 0.141120 -0.989992
3.100000 0.041581 -0.999135
3.200000 -0.058374 -0.998295
3.300000 -0.157746 -0.987480
3.400000 -0.255541 -0.966798
3.500000 -0.350783 -0.936457
3.600000 -0.442520 -0.896758
3.700000 -0.529836 -0.848100
3.800000 -0.611858 -0.790968
3.900000 -0.687766 -0.725932
4.000000 -0.756802 -0.653644
4.100000 -0.818277 -0.574824
4.200000 -0.871576 -0.490261
4.300000 -0.916166 -0.400799
4.400000 -0.951602 -0.307333
4.500000 -0.977530 -0.210796
4.600000 -0.993691 -0.112153
4.700000 -0.999923 -0.012389
4.800000 -0.996165 0.087499
4.900000 -0.982453 0.186512
5.000000 -0.958924 0.283662
5.100000 -0.925815 0.377978
5.200000 -0.883455 0.468517
5.300000 -0.832267 0.554374
5.400000 -0.772764 0.634693
5.500000 -0.705540 0.708670
5.600000 -0.631267 0.775566
5.700000 -0.550686 0.834713
5.800000 -0.464602 0.885520
5.900000 -0.373877 0.927478
6.000000 -0.279415 0.960170
そしてプロットです。
% gnuplot
G N U P L O T
Version 5.0 patchlevel 5 last modified 2016-10-02
Copyright (C) 1986-1993, 1998, 2004, 2007-2016
Thomas Williams, Colin Kelley and many others
gnuplot home: http://www.gnuplot.info
faq, bugs, etc: type "help FAQ"
immediate help: type "help" (plot window: hit 'h')
Terminal type set to 'x11'
gnuplot> plot "data" , "data" using 1:3
using 1:3 とは、1カラム目(x)と3カラム目(z)のデータを用いるということです。
あと、画像の表示ですが、これは普通にブラウザで見た方が良さそうです。
餅は餅屋です。
とりあえず、ここまで。