投稿

ラベル(数学)が付いた投稿を表示しています

gnuplotプロット例 : 最小二乗法の可視化的説明

イメージ
データプロットを関数(ax + b)でフィッティング 始めに  最小二乗法を用いた数値解析によるフィッティングを可視化してみることにしました。 実験で得られた測定データ、表計算や解析ソフトでは簡単に近似曲線と関数が得ることが出来ます。こういうのは実際どういった処理で求めているのかを意識することは無いかも知れません。ただあまりブラックボックスな技術にばかり頼りっきりでもしょうがないので、ちょっと試しに可視化してみることにしました。 用いるデータ さて、用いたデータプロットは以下のようになっています。これを 関数 f(x) = ax + b でフィッティング、つまり最適解となる変数a, bを求めます。 用いるデータプロット ここでは最小二乗法については説明しませんが、手順としてはまず適当にaとbをそれぞれある値に決めます。そこで定まった関数とデータプロットの各点との差を求めます。ここで差は二乗してデータプロット全ての点のそれを合計します(便宜上sumと置く)。そうするとa, b, sumのワンセットが得られます。あとはこれをa, bの値をそれぞれ変化させて、どのパラメーターを取ればsumが最小となるかを求めてそれを解とします。 可視化してみる   解だけ求めるなら計算してsumが最小となる点を抽出すればいいのですが、その過程を可視化するためにもう少し準備をします。  まず計算により得られるデータセットは以下の3列からなります。 a1, b1, sum1 a2, b2, sum2 a3, b3, sum3 a4, b4, sum4 ︙ なので、aをx、bをy、sumをzとして三次元プロットをしてみます。計算過程を動画にすると以下のようになります(左側がデータプロットと関数の二次元プロット、右側が三次元プロット)。左側のグラフではデータプロットの各点と関数との差を矢印で図示するようにしています。 (Youtubeにアップロードした動画、処理にはPythonによるプログラミングも併用)  この動画では大雑把にaとbの範囲を設定して計算しているので、どこが最小なのかはいまいち分かり難くなっています。これは、データプロットから大きく外れたときのsumの値がかなり大きくなるの...

gnuplotでログスケールの対数グラフを描く方法(set logscale)

イメージ
gnuplotでグラフの軸をログスケールにして対数グラフを描きたい場合、以下のような書式で設定します。 set logscale y 2 これはy軸をログスケール、底を2で指定する仕方。 y軸以外にx軸やその他の軸も指定可能です。また底の値も任意で指定することができます。 そして set logscale xy 10 のように複数の軸をまとめて指定して両対数グラフにすることも出来ます。 自然法則は指数関数的な挙動を示すものが結構あって、測定したデータを対数グラフでプロットしてみるとそれが分かりやすくなったりします。 例として以下の指数関数2つと比較として一次関数1つをプロットしてみます。 y = 2**x y = 2**(3*x+2) y = x 初めにそのままプロットした場合。 gnuplot> plot [][0:100] x, 2**x, 2**(3*x+2) これをログスケールに設定してプロットすると以下のグラフとなります。 (分かりやすくするため、上のグラフとはy軸の範囲は変えてあります) gnuplot> set logscale y 2 gnuplot> plot x, 2**x, 2**(3*x+2)     その他gnuplot関連のブログ記事

gnuplotでシステム側のコマンドを使う、コマンドの実行結果を取得する方法(system)

イメージ
gnuplotでは 「system」 というコマンドを使用することで、システム側のコマンドを実行することが出来ます。 例えば、gnuplotをインタラクティブモードで使っているときに、フォルダ内のファイルを確認するという使い方が出来ます。データファイルをプロットする時にフォルダ内のファイル名を確認したい時に便利かと思います。 使えるコマンドについてはgnuplotを実行しているシステム(OS)に依りますが、ここではLinux(Ubuntu 18.04 LTS)上で実行しているものとして話を進めることにします。 systemコマンドの実行例 systemコマンドの実行方法 フォルダ内のファイルを「ls」コマンドで確認したい場合は、systemコマンドを用いて以下のように書きます。 gnuplot> system "ls" コマンドの実行結果を取得する方法 上記の方法ではコマンドの実行結果は画面上に出力されますが、これを文字列として変数に取得することも出来ます。この場合、systemコマンドでは括弧を付けて以下のように記述します。 gnuplot> d = system("date") (dという変数にdateコマンドの出力結果を入れる) これをグラフタイトルにするには gnuplot> set title d gnuplot> plot sin(x) というようにすればよいでしょう。   フォルダ内のファイル名を取得しプロットに利用する 応用的な使い方として、フォルダ内のファイル名を取得してデータプロットに使う方法を説明していきます。話としては以下の記事に関連するものです(wordやwords関数の使い方はその記事を読んで下さい) 。 gnuplotのplotでforループを使った活用方法(その1) フォルダ内に以下の5つのファイルがあるものとします。 「001.dat, 002.dat, 003.dat, 004.dat, 005.dat」 これをまとめてプロットする場合、以下のようなコマンドとなります。 gnuplot> f = system("ls *.dat") gnuplot> fi...

gnuplotのplotでforループを使った活用方法(その1)

イメージ
以前のブログでplotコマンドで用いるforループについて簡単に解説しました。 gnuplotのplotでforループを使ったグラフプロット(plot for [i = ... ) このときは変数を単に数値として用いる方法と文字列を扱う方法を少し紹介しましたが、いろいろ組み合わせると活用できる幅が大きいです。 今回はそこからいくつか役に立ちそうな活用方法について紹介していきます。 変数に数値を用いる これは以前のブログで紹介した方法です。簡単には以下のような使い方になります。 plot for [i = 1:5] sin(x) * i 変数に文字列を用いる 変数に文字列を用いる場合の書式は [moji in "文字列1 文字列2 文字列3 文字列4"] のようになります。 ファイル名の生成に用いる  文字列を使う場合の方法として、いくつものデータファイルをプロットする場合の指定方法に使うことが出来ます。 ここではワークフォルダ内にある「001.dat, 002.dat, 003.dat, 004.dat, 005.dat」の5つのデータファイルをプロット指定しています(ついでにtitleにも指定)。 plot for [file in "001 002 003 004 005"] file.".dat" title file ここではファイル名のリストで拡張子".dat"を省いてリストの外側でそれを付ける形にしています(別にリスト内で拡張子付きのファイル名でも問題ないです)。 変数を複数用いる方法 ここまではループ変数は1つのものを紹介してきました(数値やファイル名)。では変数を複数、例えばファイル名の他に線の色も変数で割り当てたいなどの場合どうすればいいでしょう? それにはやや入り組んだ手法を用いることになります。 まず1つのplot指定ではループ変数は1つしか使えないようです。 (調べた限りではそうでしたが何か方法があればコメント下さい) その条件において複数の変数を使いたい場合、複数のリストを作成することで対処することが出来ます。 解説は後回しにしますが、処理を書くと以下のようになります。 file = "001.dat 00...

gnuplotで複数のグラフを1つにまとめて出力する方法(multiplot)

イメージ
multiplotとは gnuplotでは普通にプロットすると1つのグラフのみが出力されます。複数のグラフを同時に扱いたい、例えばグラフの中に説明用に小さなグラフを載せたい場合や、複数のグラフを並べたものを作りたい場合もあるでしょう。そういった場合、一度画像ファイルとして出力してから何かしらの画像エディタで編集して作り上げてもいいのですが、それだとやや作業が煩雑になってしまいます。 gnuplotにはmultiplotモードという機能が用意されていて、これを用いることで一つのキャンバスに複数のグラフ出力が出来るようになります。multiplotを使う場合、細かく配置を指定するには個々のグラフ領域の扱いなどやや考慮すべきことが多いのですが、簡単に使う分にはそれほど難しくはないです。 multiplotモードの解説 multiplotモードを以下のような簡単な例を用いて説明していきます。 set multiplot set size 1,1 set origin 0,0 plot x set size 0.4,0.3 set origin 0.5,0.6 clear plot sin(x) linecolor 'red' set size 0.4,0.3 set origin 0.5,0.1 clear plot x**2 linecolor 'green' unset multiplot 基本としては「set multiplot」でmultiplotモードに切り替え、個々のグラフ領域など設定しつつ複数のグラフをプロット。最後に「unset multiplot」でmultiplotモードを終了させます。終了させることでインタラクティブモードでは通常のgnuplotのモードに戻ります。 「set size」、「set origin」で個々のグラフ領域の大きさや配置する箇所を決めています。 multiplotモードで使うclearコマンド さて上のコマンド例で「clear」コマンドを用いていますが、このコマンドは指定した領域を削除するというものです。multiplotモードでグラフの中にグラフをプロット場合、そのままプロットすると2つのプロットが重なって見づらくなる場合もあります。...

gnuplotで他のコマンドからの出力結果をプロットする方法(Piped-data)

イメージ
 gnuplotでデータファイルをプロットするとき、データファイルそのままではなく何かしらの処理をしてからプロットするということはよくあります。その場合、前もって他のソフトやコマンドを用いてデータファイルに何かしらの処理をし、別のデータファイルとして保存。それをgnuplotでプロットすることになるでしょう。 それでもいいのですが、データ処理とプロットをひとまとめに出来れば処理工程を減らすことが出来ます。 そしてgnuplotには「Piped-data」という、他のコマンドの出力結果をデータファイルかのように扱える機能があります。これによりデータ処理とプロットをひとまとめにすることが出来ます。 Piped-dataを使う時の書式 Piped-dataを用いる時の書式は「<」記号を用いて、以下のようになります。 gnuplot> plot "< awk '{print $1, $2+$3}' test.dat" w l 解説すると、これはtest.datというデータファイルをawkコマンドで処理したものをプロットしています。awkコマンドでは1列目はそのままで、2列目と3列目のデータを加算したものを2列目として出力しています。 sedコマンドを使った例 次に以下のようなデータファイル(test02.dat)を例にPiped-dataの使い方を考えてみます。 #a b c 1 3 10 2 4 20 3 1 15 4 9 22 5 2 19 6 3 11 gnuplotでは以下のようにusingで列ラベルを指定してプロットすることが出来ます。 gnuplot> plot 'test02.dat' using "a":"b" w l しかし、test02.datの列ラベルは「#」でコメントアウトされているので、上のコマンドでプロットしようとしてもエラーとなります。その場合、以下のようにsedコマンドで「#」を削除すれば列ラベルで指定したプロットが出来るようになります。 gnuplot> plot '< sed "s/#//" test02.dat' us...

gnuplotで軸を数値ではなく任意のラベルで表示する方法(usingでticlabelsを用いる)

イメージ
gnuplotで以下のグラフのようにx軸を数値ではなく、任意のラベルに割り当てて表示する方法を紹介していきます。 このグラフはデータファイルとしては以下のようになっています。 サンプル-壱 3 サンプル-弐 4 サンプル-参 1 サンプル-四 2 方法としてはusingの書式でticlabesを設定する方法と、setコマンドでxtics listを設定する方法があります(その他にもあるかも)。 上の例のようにデータファイルに書かれているラベルを用いたい場合はusingで設定する方を用いるのが便利でしょう。今回はこちらのticlabelsを用いる方法を紹介していきます。 ticlabelsについて ticlabelsは設定の総称で、実際に設定するのは以下に示すような各軸の設定項目になります。 x軸 : xticlabels, x2ticlabels y軸 : yticlabels, y2ticlabels z軸 : zticlabels usingで指定するときの書式 まずもっとも短いであろう書式を書いておきます。 gnuplot> plot 'test01.dat' using 2:xticlabels(1) with boxes これは一見するとそれほど難しくはないのですが、usingの書式からすると結構違和感のある書き方に見えるかと思います。 usingの部分だけ見ると 「using 2:xticlabels(1)」 となってますが、この書き方だとデータファイルの2列目がx軸、1列目のラベルがy軸のように見えるかと思います。しかし実際にはこれは2列目はy軸、1列目のラベルがx軸となる設定の書き方になっています。 なぜこのような書き方になるのかやや分かり難いのですが、これはusingで設定すると言っても プロットの指定部分とticlabelsの指定部分は分かれている と考えると理解しやすいでしょう。 そして再び 「using 2:xticlabels(1)」 という書き方を見ると、これはプロットの指定部分は「2」、ticlabelsの指定部分は「xticlabels(1)」という書き方になっています。 以前のブログ gnuplotでデータファイルをプロットす...

gnuplotでデータファイルをプロットするときの列の指定について(using)

gnuplotでデータファイルのデータをグラフとしてプロットするとき gnuplot> plot 'test01.dat' using 1:2 のように「using」を用いてプロットに用いる列を指定します。 指定方法としては上のような列番号を指定する以外に、いくつかの指定方法があります。 指定方法は大まかに分類すると以下のようになっています。 列番号で指定 : using 1:2 列ラベル(1行目)で指定 : using "first":"second" 同上 : using (column("first")):(column("second")) 1列目を擬似的な列として指定 : using 0:1 0:1の省略した書き方 : using 1 固定した数値を指定 : using 1:(5) 列に対して演算する場合 : using ($1):($2) 演算したものを列に割り当てる指定 : using 1:($2+$3+$4) 条件演算子を用いた指定 : using 1:($2<5 ? $2 : 0) データファイルを読み込むときの書式フォーマット指定 : using 1:2 '%lf,%lf' 以下、ピックアップして解説していくことにします。 列番号で指定 : using 1:2 列番号での指定ですが、番号は1から始まる値で指定していきます。 (後述しますが0は別の意味を持ちます) 列番号の指定はシンプルなのであまり困ることはないと思いますが、データファイルの列区切りがスペース以外(カンマなど)だとちゃんと指定してもうまく認識されないことはあるでしょう。gnuplotではスペース区切りを基本としているので、それ以外のデータファイルでは設定を行ってからプロットして下さい。 以下、区切りについて簡単に解説したブログ記事です。 [ソフト] gnuplotでcsvファイルをプロットするときの注意点 列ラベル(1行目)で指定 : using "first":"second" データファイルの一行目に列ラベルがある場合、それを指定することでプロットすることも出来ます。例...

地球を一周するときにどこの部分を回るかで一周の長さはどう違ってくるか

イメージ
今回のブログは数学と地理の雑学話。 地球の一周は約4万kmとは言われています。この数値は赤道に沿って一周した場合の長さのようですが、まぁ大雑把に見ればどこを回っても同じような長さでしょう(たぶん)。 で、ふと考えたのですが、例えば南極点から1m離れた場所をスタートしてそのまま南極点の周りを一周すれば約6.3m歩くだけで一周出来るのではないかと。別に南極点で無くとも、適当にある点を定めてそこを中心として一周すればどこでも同じ話になるでしょう。 「一周」をどう定義して扱うかになると思いますが、考えてみると結構おもしろいものです。 そこで話を終わらせるのもなんなので、もう少し考えていくことにします。 一周の最も長い場所が約4万kmとして、そこから離れた場所で一周するときの距離はどう計算すればいいかを考えることにします。 離れた場所の位置をどう表すかによるでしょうけど、ここでは緯度を使ってみることにします。緯度は赤道が0°で北極が北緯90°ですが、実際の地球の話にすると結構込み入った話になって取り扱い難いので簡単に球として考えることにします。 一周のイメージ図としては以下の通り。赤道を回るのがピンクの線で、任意の位置の赤道と平行になるような一周を赤で表しています。 円として見やすいよう上から見たときのイメージ図を描くと以下の通り。 さて、緯度が与えられているので、これを利用して赤い線の円の長さを計算することにします。 再び3Dの球体モデルに戻って考えると、図としては以下のようになります。 図より任意の一周の半径はxなので、xは三角関数を利用してcosθ*rで計算出来ます。rは球の半径なので4万km/(2*3.14)で求められます。半径が求まれば後は 2x * 3.14で一周の長さが計算出来ます。 実際の地点で計算してみます。東京は北緯35.7°あたりなので、ここから赤道と平行に一周回ると 2πr = cos(35.7)*40000/(2*3.14)*2*3.14≒32500 と約3万2500km。赤道周るよりも約7500km短くなるようですね。球をモデルで計算してるので、これが実際の長さになるわけではないですが、まぁ計算するとすればこんな感じ。

gnuplotのRGB値による色指定について

イメージ
色指定のおさらい 以前のブログ記事でcolornameによる色指定について解説しました。 gnuplotでプロットなどの色をcolornameの指定で変更する 今回はそこで少し触れているRGB値での指定方法について解説していきます。 色指定の基本の部分はそのブログ記事に書いているので、今回はそこは省略します。 RGB値での指定について 2種類あるRGB値での指定 RGB値で指定する場合、red、green、blueがそれぞれ2桁の16進数という書式で行ないます(00〜ff)。またドキュメントを読むと、通常(?)のRGB値とX11でのRGB値の2種類の書式があるようです。 通常 : "0xff0000" X11 : "#ff0000" 書式としてはRGB値の先頭に「0x」が付くか「#」が付くかの違いがあります。調べてみるとRGB値が同じでも両者は異なる色を表している場合もあるとかなんとか。ただちょっと調べたくらいではよく分からなかったので、とりあえず通常(?)とした方に絞って話を進めていきます。 RGB値を用いてプロットする方法 RGB値はコンピューターでの色表現としてはしょっちゅう出てきます。RGB値で指定したい場合はカラーピッカーなどで色を選んでそのRGB値を持ってきて指定してやればいいでしょう。 プロットするときには次のような書き方になります。 gnuplot> plot sin(x) lc rgbcolor "0x0000ff" 他にRGB値では透明度の指定もあるのですが、そちらの解説はまた別の機会にします。 RGB値を指定したときのプロット例 最後にred、green、blueのそれぞれを値を変化させていったときのプロット例を載せておきます。一番下のラインが0x000000で、その上に少しずつ各色の値を増やしたラインを追加していって並べています。 redを変化させていったとき(0x000000→0xff0000) greenを変化させていったとき(0x000000→0x00ff00) blueを変化させていったとき(0x000000→0x0000ff)  その他、gnuplot関連のブログ...

gnuplotでプロットなどの色をcolornameの指定で変更する

イメージ
gnuplotの色指定について gnuplot、関数やデータファイルのプロットの色指定について少しまとめておきます。 色の指定方法はいくかあって、 plot x linetype 3 plot x linetype rgbcolor 'red' plot x linetype rgbcolor '#00FF00' などというように指定します。 基本、「linetype」もしくは「linecolor」の後ろに色の指定がくるという書式になっているようです。 colornameを用いた指定方法 今回はいくつかある色指定の中からcolornameを用いて指定する方法をまとめることにします。colornameとはなんぞや?というと「red」とか「green」というような色に個別の名前が割り振られているものになります。使える色の名前さえ把握出来ていれば、直感的には一番扱いやすい指定方法だと思います。 (colorname以外には16進数でのRGB指定(透明度も扱える)などがあります) 使うことの出来るcolornameの確認方法 gnuplotで使えるcolornameを確認するには gnuplot> show colorname とします。これで使える色のリストが表示されます(対応するRGBも一緒に表示される)。 プロットするときの指定方法 指定方法は gnuplot> plot sin(x) lt rgbcolor 'red' というようになります。また簡略的に以下のようにも書けるようです。 gnuplot> plot sin(x) lt rgb 'red' gnuplot> plot cos(x) lc 'green' ひと通り色をグラフに出力してみる 指定出来る色をひと通りまとめてグラフにしてみました。端末をpngcairoです。 (端末によっては色の差異があるかも知れませんが、確認はしていません😞) 灰色のgrayについてはgreyという綴りのものも用意されています(綴りが異なるだけで色としては同じ…だと思います)。 'white','black','d...

gnuplotでタイトルや軸ラベルを付けるとグラフ領域が小さくなってしまう件について

イメージ
gnuplotではコマンドでどういうグラフにしていくのかを設定していくので、割りと均一なものが作りやすいです。マウスでいろいろ編集出来るソフトと比較すると、始めは結構とっつきにくい感じはありますが、コマンドさえ把握していれば同じ形式のグラフがすぐに描けるのは利点となるでしょう。 設定によってグラフ領域の大きさが変わってしまう ただ、gnuplotで同じグラフを描いているつもりでも、微妙に違ったものが出来てしまうことがあります。 よくあるのが、グラフにタイトルを追加した場合。 例えば、これはタイトル無しでそのままプロットした場合のグラフ。  で次がタイトルを設定してプロットした場合のグラフ。 一見するとタイトルのあるなしだけで同じグラフに見えますが、重ねて表示すると次のようになります。 グラフの縦の幅が微妙に違っているのが分かりますね。 さらにタイトルだけでなく、x軸、y軸の軸ラベルも追加していくと、より違いが顕著になっていきます。 以下はxlabel, ylabel, x2label, y2label, titleを設定してグラフにしたもの。 先程と同様に何も設定していないグラフに重ねてみると となるわけです。ここまでになるとだいぶ違いがあるのが分かります。 一つだけグラフを描くだけならいいんですが、例えば2つのグラフを左右で並べて比較したい場合では、比較するモノ同士でグラフ領域が異なってしまっているとよろしくはないです。 なぜグラフ領域の大きさが変わってしまうのか? gnuplotではグラフ領域の大きさはmargin(マージン)の設定で変更することが出来ます。 で、デフォルトではこのmarginの値はcomputed automatically、つまり自動で計算され設定されるようになっています。なので、タイトルや軸ラベルを配置するとそれに合わせてmarginが設定され、グラフ領域の大きさも変わってきます。 (と、自分なりに解釈はしてますが、ドキュメントの読み逃しもあるかもなので詳しくはそちらを読んで下さい) なので、グラフ領域を決まった大きさにしたい場合はmarginを自動ではなく手動で設定することになります。 marginの設定 marginの設定はグラフ領域の上下左右の4つ。 l...

gnuplotで媒介変数表示(parametric)を使ってグラフを描く方法 (円や球、螺旋模様などに)

イメージ
関数のグラフを描く場合、普通はxの値に対応したyの値をプロットしていきます。 これとは異なる方法で、媒介変数表示( Wikipedia )という表し方があります。円のような曲線をグラフに描く場合の数式の表し方として便利とかなんとか。 媒介変数表示とは 少し説明してみると、ある変数tがあるとして、このtに対応して x = cos(t) y = sin(t) のようにxとyを決める関数がある、というようなものでしょうか。適当に図で説明するとこんな感じになるかと思います。 gnuplotで媒介変数表示をする方法 (set parametric) この媒介変数表示をgnuplotで使うには「set parametric」と設定します。これで二次元プロットでは「t」、三次元プロットでは「u, v」の変数を使って媒介変数表示が出来るようになります。三次元の方は2つ変数が使えるのですが、ちょっとイメージし難いですね…。三次元空間に球などを表現する場合に便利なようです。 変数のデフォルト値) またデフォルトではt, u, vの変数の値は[-5:5]となっているようです。 この値はそれぞれtrange、urange、vrangeを設定することで変更できます。 samplesの設定 あと円を描いてもややカクカクしたグラフになってしまう場合はsamplesの設定を見直すといいかと思います。 (参考 : gnuplotで関数プロットの形がおかしい場合 : samplesの値の設定について ) 実際の媒介変数表示のグラフの例 最後にちょっとしたグラフの例を載せておきます。 円を描く関数をちょっと手を加えて三次元に表すようにしています。 gnuplot> set parametric gnuplot> splot sin(u),cos(u),u w p もう少し手を加えてみましょう。 gnuplot> splot sin(v)/10,cos(v)/10,v w p, sin(v)/5,cos(v)/5,v w p pointtype 2, sin(v)/3,cos(v)/3,v w p, sin(v)/2, cos(v)/2,v w p, sin(v)/1.5, cos(v)/1.5,v w p...

gnuplotの軸(axis)の設定 : x軸、y軸を描く

イメージ
はじめに 今回はgnuplotでグラフ上にx軸とy軸を描く方法について解説していきます。 x軸とy軸を描く 初期設定のグラフ gnuplotで初期設定のまま y = x 2 + 1 のグラフを描くと という出力になるかと思います。 これを見ると、「グラフには普通あるんじゃないかなー?」と思うものが見当たりません。そう、ブログタイトルでネタバレしてますが、x軸とy軸が描かれていません。 フリーハンドで描きますが、グラフなら以下のようにx軸とy軸があるのが見やすいでしょう。 このプロットの場合は軸が合った方が放物線がx軸に接して無いことが分かりやすいですし。 x軸、y軸の設定方法 gnuplotでx軸、y軸を描く方法はいくつかあります。グラフ上の任意の場所に水平線を1本と垂直線を1本描けばいいわけですが(直交座標系の場合)、今回はgnuplotに用意されている機能(zeroaxis)を使って描くことにします。 zeroaxis gnuplotでx軸、y軸(とz軸)を描く機能に「zeroaxis」という機能があります。 gnuplot> help zeroaxis とすればこの機能のヘルプが表示されます。 zeroaxisの設定は xzeroaxis yzeroaxis zzeroaxis に分かれていて、それぞれの軸に対して個別に設定していく必要があります。 簡単な設定方法 簡単には gnuplot> set xzeroaxis とすればx軸が表示されるよう設定され gnuplot> set yzeroaxis とすればy軸も表示されるよう設定されます。どうもx軸、y軸とも一度に設定することは出来ないようですが、区切り記号(;)を使って gnuplot> set xzeroaxis; set yzeroaxis とすれば、一行に収めることも出来ます(個別にsetを使っていることに注意)。 デフォルトの軸の表示 さて、zeroaxisを設定して始めのグラフをプロットしてみると以下のようになります。これでちゃんとx軸、y軸が思った通りに表示することができました。 やはり軸があった方が放物線がどこを通るのかが分かりやすいです。 さ...

gnuplotで角度を度またはラジアンに設定する方法

イメージ
gnuplotの角度の扱いについて gnuplotではデフォルトでは角度はラジアンとして扱われます。ただ角度と言えば度(°)で表す方が馴染みがある場合や、読み込みたいデータファイルのデータが度で角度を表している場合などもあるでしょう。また極座標プロットの場合は度の方が使いやすいかも知れません。そして、そのような場合にはanglesという設定を切り替えることで、ラジアンと度を切り替えることができます。 例外 角度の設定の例外として、hyperbolic(双曲線)関数、Bessel関数では角度が度、ラジアンのどちらの設定でもラジアンとして扱われるようです。詳しくはドキュメントを参照して下さい。 角度の設定方法 インタラクティブモードにおいて gnuplot> show angles とすると現在の角度の設定を確認出来ます。デフォルトでは「Angles are in radians」というようにラジアンになっていると表示されます。 これを度に設定したい場合は gnuplot> set angles degrees とします。またラジアンに戻す場合は gnuplot> set angles radians とします。 使用例 角度を度に設定して、x軸を0〜360°としてSin、Cos関数をプロットするには以下のようにします。 gnuplot> set angles degrees gnuplot> set xrange [0:360] gnuplot> plot sin(x), cos(x) その他、gnuplot関連のブログ記事 Amazon データ解析関連書籍など

量子領域において電子でフラクタル図形を作るという研究

イメージ
ちらほらと科学関係のニュースをみていたら何やらおもしろそうな話が出てました。 Physicists build fractal shape out of electrons オランダのユトレヒト大学の研究者が行った研究で、なんでも量子領域で電子がフラクタル図形を形成するというもの。 実験自体は銅(Cu)表面に一酸化炭素分子(CO)を配置して、その時の表面の電子状態をSTM( 走査型トンネル顕微鏡 - Wikipedia )で観測しているようです。詳しくは上のニュース記事や論文を読んで下さい。 出来上がったフラクタルの形状はSierpiński triangleと呼ばれるもののようです。 一体どのようにしてこのような図形を作ることが出来たのかも興味ありますが、この状態の電子がどういう振る舞いを示すのかもおもしろそうですね。スケールサイズはナノスケールレベルでしょうけど、一体どのくらいの領域で形成されているのか気になります。 で、話は変わりますが、フラクタルと言えば最近自分でも少しいじって遊んでみてました。いくつかYoutubeのチャンネルに動画をアップしています。 fractalプレイリスト その中の一つに今回紹介した研究のフラクタル(Sierpiński triangle)で作った動画もありました。 自分でもまだフラクタルというものについて分かっていないことが多いですが、興味深い研究が出てくるともっと調べてみたくなりますね😉   Amazon フラクタル関係の書籍

Python Turtle graphicsで渦巻き(Spiral)を描く

イメージ
最近、Youtubeのチャンネルに2つの動画をアップロードして公開しました。動画は以下のようなPythonのTurtle graphicsで渦巻き模様を描くというものです。 このブログではこの動画の描き方についての簡単な説明していきます。 渦巻きを描く基本となるPythonのプログラミングコードは以下の通りです。 import turtle import math r = 1 k = 5 c = 10 i = 0 while i < 360*c: turtle.goto(r*math.cos(math.radians(i))*math.exp(math.radians(i/k)), r*math.sin(math.radians(i))*math.exp(math.radians(i/k))) i+=1 turtle.mainloop() このコードの実行結果は以下のようになります。 渦巻きを描いていく数式は x = r * cosθ * exp(θ/k) y = r * sinθ * exp(θ/k) としています。指数関数部分が無ければ単に円を描くだけの式ですが、指数関数部分があることでθが増えるとともに円の大きさも増大して渦巻きが形成されます。 (渦巻きにもいろいろ種類があって、この形式のものは対数螺旋と呼ばれるようです) 動画ではこの基本形に手を加えて複数の渦巻きを同時に描くようにしています。Turtle graphicsはプログラミングの練習として簡単な図を描くのに用いられることが多いですし、条件を変えながら描いていくと意外におもしろいものがかけたりもします。 Pythonが使えるようならTurtle graphicsはすぐ使えるので、ものは試しに遊んでみてはいかがでしょう。 (Ubuntuの場合、python3-tkのパッケージをインストールする必要があるかも)

1年は365日だけど毎月の日数は30日だったり31日だったり28日だったり。その違いがどう現れるのかについて

イメージ
1年は平年では365日。うるう年では2月に1日加わって366日です。さて、1年は12ヶ月ありますが、毎月の日数は30日だったり31日だったり2月は28日(or 29日)だったりと違いがあります。 単純に考えると、この違いが毎月の集計に現れることになります。 お散歩の歩数を測っているとき 朝食やおやつに食べるバナナの本数を月ごとに数えるとき 毎月の売り上げを集計するとき ブログや動画のアクセス数を集計するとき などなど、いろいろ関係する話はあります。まぁ30日間と31日間では1日しか違いがないのであまり気にしなくていいかも知れませんが、ここで改めて確認してみることにします。 まず1年の日数を月ごとに書くと以下の表のようになります。 これをグラフにすると次のようになります。  大雑把に眺めるとだいたい同じくらいの日数に見えますが、どれくらいの違いがあるのか見てみることにします。 まず1年は365日。これを年間の月数12で割ると、1ヶ月は平均で30.4266.....日となります。毎月の日数がこの平均値と比較してどれくらいの割り合いなのかをグラフにすると以下のようになります。 (例えば8月では31日間なので、 31/平均値 ≒ 1.02 という計算です) そのままでは違いが分かりにくいので拡大した図を挿入してあります。2月は28日間と他の月と比べても少ないので差が大きく出ています。また他の月でも違いが見て取れます。 ここまでの話から、毎月ごとの集計では日数の違いにより若干の違いが生じてくるということが分かると思います。仮に毎日バナナを2本食べていたとすると、それを集計すると月によって若干多かったり少なかったりしてくることになります。例えば、そういった集計をグラフにして見ると、毎日同じ本数のバナナを食べていてもグラフに月ごとの周期が乗って来ることになります。 ちょっとした集計ならそういった差は取るに足らないものですが、もうちょっと正確性が要求されるようなものだとこういった話も考慮していく必要があるでしょう。 さて、別の話としてこういった違いを除いて考える方法として、1年を1週間(7日間)ごとの区切りで考えるというものがあります。この場合は月ごとに日数が異なるのとは違い、7日間とキッチリ決まっているた...

【問題】Part.2 おまんじゅうがそれぞれいくつ売れたのかを求めるには?

イメージ
以前書いたクイズ 【問題】おまんじゅうはそれぞれいくつずつ売れたでしょうか?   と似たようなお話です。 あるお菓子屋のおまんじゅうの値段は 大まんじゅう : 1個 120円 小まんじゅう : 1個   35円 です。 お菓子屋のある日のおまんじゅうの売り上げは『7,420円』でした。 そして次の日のおまんじゅうの売り上げは『5,560円』でした。 さて、お菓子屋の中学生の息子が数学の勉強として、このおまんじゅうの売り上げから「大」と「小」のおまんじゅうがそれぞれいくつずつ売れたのか計算してみることにしました。 まず「大まんじゅう」が売れた個数を「x」、「小まんじゅう」が売れた個数を「y」としました。そして初めの日の売り上げから 120x + 35y = 7420  … (1) の(1)式が出来ました。 同じように次の日の売り上げから式を作ると 120x + 35y = 5560  … (2) が出来ました。 そして(1)式と(2)式の連立方程式を解くために(1)式から(2)式を引くと、xとyが両方とも消えてしまい 0 = 1860 となってしまいました。両辺がまったく別になってしまい式としてもおかしいです。 結局、お菓子屋の息子は「大」と「小」のそれぞれおまんじゅうが売れた個数を求めることが出来ませんでした。 【問題】 さて、ではなぜお菓子屋の息子はそれぞれのおまんじゅうが売れた個数を求めることが出来なかったのでしょうか?

【問題】おまんじゅうはそれぞれいくつずつ売れたでしょうか?

イメージ
【問題】 あるお菓子屋さんがお祭りで屋台を出すことになりました。屋台で売るのは、街でそこそこ名物になっているおまんじゅうです。おまんじゅうの大きさは「大」と「小」の2種類。価格はそれぞれ 大が100円 小が30円 です。 お祭りの当日はお菓子屋の店主は、実行委員なので屋台の店番が出来ません。そこで自分の小学生の娘に店番を任せることにしました。 そして娘には分からないことがあったら携帯電話で連絡するように言い、家族にもたまに様子を見てくるように頼みました。お菓子屋さんは実行委員でお祭り会場にいるため、自分でも手が空いたら様子を見に行くつもりです。 さてお祭り当日、おまんじゅうはそこそこ売れているようでした。初めは慣れていなかった娘も次第にお客さんとも気軽に話せるようになっていました。 そんなこんなで屋台の営業時間が終わり、店主が屋台に行くと娘は 「おまんじゅうは全部で57個売れたよ。3950円になった!」 とうれしそうに言いました。そして店主は娘に 「これからお友達とお祭りに遊びに行くなら、売れ残ったおまんじゅう持っていっていいよ」 と伝えました。そして娘は残ったおまんじゅうを全部持ってお祭り会場の方に走って行きました。 さて、このお話では売れたおまんじゅうの数はわかっています。ではお話の中に出ている数字からおまんじゅうの「大」と「小」がそれぞれいくつ売れたのか分かるでしょうか? 関連問題 【問題】Part.2 おまんじゅうがそれぞれいくつ売れたのかを求めるには?

スポンサーリンク