octave
1Kgの重さの原器から新しい方式へと移行するそうな。
(1) E = hf (2) E = mc^2 (3) m = hf/c^2
1式は、電磁波のエネルギーは、周波数(f)とプランク定数(h)の積だよと。2式はアインシュタインの有名な式。エネルギーは、質量(m)と光速(c)の2乗との積だよと。この2つの 式から、3式が導き出せる。
周波数は1秒間に振動する回数。1秒は、日本の誇る光子時計で十分に精度よく決定出来ている。光の速さも十分な精度が得られている。後は物理定数のプランク定数を精度よく決定出来れば、質量もおのずと未来永劫に精度を担保出来る。
質量の単位「キログラム」の新たな基準となるプランク定数の決定に貢献
アボガドロ定数を正確に求める方法もあるんだな。
setup octave
octaveは、debian機に入っている。Windowsなマシンの仮想PCにも入れておこ うと思ったんだ。CentOSに入れたらセグフォ。これはまずいな次はウブかな。
plotが動かない、ってか画面をコピペする様な変な動作。ならばFreeBSDだな。 随分と余計な物もインストールさせられた。(Java,lua,python,gcc,clang,gnuplot)
$ octave GNU Octave, version 4.4.1 : octave:1> hold on octave:2> libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast
何これ? ググるも解決法には届かず。でも、ヒントがあった。mesaのライブ ラリィーに足りない物があるから、WSLなウブな場合はどうしろ、こうしろと。
CUIな端末からXを飛ばしているから、Windows側のVcXsrvが満足しないんだろう。 ならば、twmを起動して、そこで試してみよう。ビンゴでしたね。ちゃんとグ ラフが描かれた。これにて、一件落着でもいいんだけど、いまいち動きが遅い。
それで思いついたんだ。昔盛んに使っていたMobaXtermは、どうかと。ビンゴ でしたね。これで、CUIな端末から操作してて、グラフ画面だけを別に表示で きる。操作履歴も容易にコピペ出来るってもんです。
$ echo $DISPLAY localhost:10.0
MobaXtermの場合、起動すると勝手に環境変数がセットされるんで何も設定す る必要無し。
余談だけど、NetBSDの注意書きに面白い事が書いてあった。クラッシュを体験 なされたなら、、、、ってね。
$NetBSD: MESSAGE,v 1.2 2017/01/24 12:31:18 maya Exp $ If you are experiencing crashes while plotting, you can try adding the following line to ~/.octaverc: graphics_toolkit("gnuplot");
octave:6> x = [1; 0] x = 1 0 octave:7> c = [3 2; 1 4] c = 3 2 1 4 octave:8> c * x ans = 3 1
octave:9> [x,y] = meshgrid(-2:2) x = -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 y = -2 -2 -2 -2 -2 -1 -1 -1 -1 -1 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2
ここからは、少しコードを書いてみる。線形変換行列 c を受け取って変換す る奴。
$ cat xx.m function xx(c) r = -3:3 for x = r for y = r o = [x;y] z = c * o x2 = z(1) y2 = z(2) quiver(0,0,x2,y2) end end end
演算過程が見える様に、式の後ろにセミコロンを付ていない。
octave:16> c = [2 1.5; -0.8 1.2] c = 2.00000 1.50000 -0.80000 1.20000 octave:17> hold on octave:18> xx(c) r = -3 -2 -1 0 1 2 3 : o = 3 3 z = 10.5000 1.2000 x2 = 10.500 y2 = 1.2000
octave-mode
気を良くしたんで、emacsから編集しようとしたんだ。そしたら、あろう事か ObjCを編集するモードになったぞ。アプル御用達なサフィックスですかい? m ってのは。強制的にoctave-modeになる様に下記の設定をした。
(setq auto-mode-alist (append '(("\\.m$" . octave-mode)) auto-mode-alist))
M-x run-octaveで画面が割れてreplが動き出すのはお約束。編集して実行が楽 で良いわい。
function xx(c) hold on r = -1:1; for x = r for y = r o = [x;y]; z = c * o; x2 = z(1); y2 = z(2); quiver(x,y,x2,y2, 0, "b") end end disp("Hit any key to hide graph ...") pause() close end
始点を線形変換した先を矢印で示すようにチョイと変更。更にグラフが自動で 作られる様にした。
octave> xx([2 -0.8; 1.2 0.5]) Hit any key to hide graph ... q octave>
こんな風にして、ワープを実感してくれ。それにしても計算に時間がかかり過 ぎのように思える。なんでかな? 実行時間を測るには、どうする? システムに聞くのが一番だな。
octave> lookfor time : tic Initialize a wall-clock timer. toc Measure elapsed time on a wall-clock timer. speed Determine the execution time of an expression (F) for vario us input values (N).
使えそうな物を見繕ってみた。そして、speedの例。
octave> speed ("sum (x)", "", [10000, 100000], ... "v = 0; for i = 1:length (x), v += x(i); endfor") > testing sum (x) init: x = randn (n, 1) n1 = 10000 n2 = 11788 n3 = 13895 n4 = 16379 n5 = 19307 n6 = 22758 n7 = 26\ 827 n8 = 31623 n9 = 37276 n10 = 43940 n11 = 51795 n12 = 61054 n13 = 71969\ n14 = 84834 n15 = 100000 Mean runtime ratio = 235 for 'v = 0; for i = 1:length (x), v += x(i); endfor' v\ s 'sum (x)' For sum (x): asymptotic power: O(n^1.2) approximate time per operation: 9 ns
ふむ、乱数な配列のサイズを10000から100000の間で発生させて、その合計を 求める計算をさせているんだな。そして、配列のサイズによって、計算時間 がどう変化してるか求めている。リニアになるかと思たら、1.2乗になりま したとな。良いアルゴリズムを求めてくださいって趣旨がよく分る。
今回はもっと大雑把な奴が欲しい。tic,tocを試してみる。
octave> tic octave> toc Elapsed time is 3.52813 seconds. octave> toc Elapsed time is 14.688 seconds.
ticがストップウォッチを初期化して、tocで経過時間ね。
octave> xx([2 -0.8; 1.2 0.5]) Elapsed time is 1.62495 seconds. Hit any key to hide graph ...
待ってる時間って長く感じるものなのね。これって作ったデータをその都度 gnuplotに渡しているのかな。
octave> demo quiver : quiver example 3: clf; [x,y] = meshgrid (1:2:20); h = quiver (x,y, sin (2*pi*x/10), sin (2*pi*y/10)); set (h, "marker", "o"); title ("quiver() plot w/origin markers and arrowheads"); Press <enter> to continue:
この例をファイルにコピペして、実行時間を計測。
octave> aa Elapsed time is 0.127378 seconds.
オイラーが書いたコードより、よっぽど複雑なプロットなのに、断トツで実行 時間は短かい。多分gnuplotには一回しかデータを渡していないのだろうね。
/usr/local/share/octave/4.4.1/m/plot/draw/quiver.m
function h = quiver (varargin) [hax, varargin, nargin] = __plt_get_axis_arg__ ("quiver", varargin{:}); : unwind_protect hax = newplot (hax); htmp = __quiver__ (hax, false, varargin{:}); ## FIXME: This should be moved into __quiver__ when problem with ## re-initialization of title object is fixed. if (! ishold ()) set (hax, "box", "on"); endif
主要部分はこれっぽい。__quiver__ が、プリミティブで、演算とかgnuplotと のやり取りをしてるんだろうね。wnwind_protect 失敗するか も知れない演算を表わすlisp風の防御関数だから。
octave-forge
好き者が作った、Community packagesが集積した場所がある。
色々あるなあ。pkg -forge とかやると、インストールできるようだ。 でも、FreeBSDには、色々と用意されてるぞ。
$ sudo pkg install octave-forge-ltfat : The following 3 package(s) will be affected (of 0 checked): New packages to be INSTALLED: octave-forge-ltfat: 2.3.1_2,1 cblas: 1.0_9 portaudio: 19.6.0,1 Number of packages to be installed: 3 The process will require 8 MiB more space. 7 MiB to be downloaded.
後は、これをどう使うかだなあ。
gnuplotの、あれ
あれとかそれとか言うようになると、ボケの初まりらしい。 ちゃんと、vectors って言えよ。gnuplotのヘルプによると
gnuplot> help vec The 2D `vectors` style draws a vector from (x,y) to (x+xdelta,y+ydelta). The 3D `vectors` style is similar, but requires six columns of basic data. In both cases, an additional input column (5th in 2D, 7th in 3D) may be used to provide variable (per-datapoint) color information. (see `linecolor` and `rgbcolor variable`). A small arrowhead is drawn at the end of each vector. 4 columns: x y xdelta ydelta 6 columns: x y z xdelta ydelta zdelta The keywords "with vectors" may be followed by an inline arrow style specifications, a reference to a predefined arrow style, or a request to read the index of the desired arrow style for each vector from a separate column. Note: If you choose "arrowstyle variable" it will fill in all arrow properties at the time the corresponding vector is drawn; you cannot mix this keyword with other line or arrow style qualifiers in the plot command. plot ... with vectors filled heads plot ... with vectors arrowstyle 3 plot ... using 1:2:3:4:5 with vectors arrowstyle variable Example: plot 'file.dat' using 1:2:3:4 with vectors head filled lt 2 splot 'file.dat' using 1:2:3:(1):(1):(1) with vectors filled head lw 2
/usr/local/share/examples/gnuplot/vector.dem あたりを参考にすれば良い のかな。何やらダイポールアンテナの電界分布を表示する例だ。こういうのは、 CQ誌のあの人の得意分野。マクスウェルの電磁方程式を計算してるんだな。
#set table $field2xy set table "tab.csv" separator comma splot vtot(x,y) w l unset table pause 0
tableなんていうコマンドが用意されてて、(s)plotコマンドで描画されるデー タをin-memoryで保持できるみたい。それを横取りして、内容を覗いてみた。3 次元の世界で電波は拡がっていくんだなあ。(あったり前よ。まて、時間の次 元が抜けていないか。幾ら電波伝搬が速いと言っても、有限だぞ。過渡応答は 難しいので、定常状態の解析なんだな)
$ head tab.csv # Surface 0 of 1 surfaces # Curve title: "vtot(x,y)" # IsoCurve 0, 100 points # x y z type -10 -10 -0.00706214 i -9.79798 -10 -0.00713123 i -9.59596 -10 -0.00719778 i
gnuplot-mode
gnuplotもある意味、スクリプトを書いて動かす、インタープリタだ。ならば、 emacsから使えるようになっているはず。
Emacs の gnuplot-mode で gnuplot を快適に
やっぱりあったな。スクリプトを書いてから、C-c C-bでバッファーの内容を gnuplotへ送りつける事が出来る。(あるいは、C-c C-fでファイルを喰わせる 事もできる)
test.gp
set xr [0:8] set yr [0:8] set grid plot '-' using 1:2:3:4 with vectors head filled lt 2, \ '-' using 1:2 w points pt 'o' 2 3 1 -2 3 2 2 2 4 4 0 1 end 2 3 1 -2 3 2 2 2 4 4 0 1 end pause -1 "Hit return to continue"
ベクタープロット・データ付きなスクリプト。shellからgnuplot test.gp し ても良いし、replな場面から、load "test.gp" しても良い。
ベクタープロットで始点にmakrする方法が見付からなかったので、グラフの重 ね書きをしてる。その為、必要なデータを二回繰りかえしてしまった。 本来はデータは、ファイルに用意するんで、問題は無かろう。
maxima
octaveを入れた時に、随分と色々な物が付属してきた。ここまで数学寄りな奴 が入っているなら、maximaを入れてもCommon Lispぐらいしか必要ないだろう。
試しに入れたら、sbclとtkだけが足りないから入れるよと言われて、完了した。 これで、現在のFreeBSDは、数学学習の為のOSになったな。まるでfedoraのあ のセットみたい。
wxmaximaなんてのも有ったなと思って入れてみたけど、エラーになってしまっ て使えなかった。よって、emacsからだな。
$ locate maxima.el /usr/local/share/emacs/26.1/lisp/org/ob-maxima.el.gz /usr/local/share/emacs/26.1/lisp/org/ob-maxima.elc /usr/local/share/maxima/5.41.0/emacs/emaxima.el /usr/local/share/maxima/5.41.0/emacs/imaxima.el /usr/local/share/maxima/5.41.0/emacs/maxima.el
こんなのが付属してたんで、setupした。
;; maxima (autoload 'maxima-mode "maxima" "Maxima mode" t) (autoload 'maxima "maxima" "Maxima interaction" t) (setq auto-mode-alist (cons '("\\.mac" . maxima-mode) auto-mode-alist))
maxima業界のサフックスは、.macなのね。知らんかったわい。
lisp繋りで、面白い記事を発見。
機械学習は、Pythonが覇権を握ってしまったけど、昔は頑張っていたんだよ。 たまには、素のLispと戯れてみるか。