これで行くしかない.

なぜだろう?実行しようとすると,precompiling Gtkというのが入るようになってしまった.ステータスバーでは Julia: Evaluateing…という状態が続いている.⇒Execute active file in REPLモードでは問題なく動作するようになったが,create_appでアプリが生成されていない.⇒REPLで動作するようにjulia_main()を追加したためだ.これを外すと今度はパネルのボタンイベントが無視されるようになる.アプリの場合にはやはりコードをすべて julia_main の中に置くしかないのではないか?どうもそういうことのようだ.バックアップに戻って確認してみよう.2024-04-10版を走らせるとパネルが2つも出た.いや,遅れてでてきたのを見落としていただけだ.

書き始めてから大部日時が経ってしまったが,続けよう.ようやく動いたが,エラーが出ている.

★★★★★ julia_main ENTER ★★★★★

(mitten.exe:10740): GLib-GObject-CRITICAL **: 14:44:46.180: g_boxed_type_register_static: assertion ‘g_type_from_name (name) == 0’ failed

(mitten.exe:10740): GLib-CRITICAL **: 14:44:46.180: g_once_init_leave: assertion ‘result != 0’ failed

(mitten.exe:10740): GLib-GObject-CRITICAL **: 14:44:46.180: g_boxed_type_register_static: assertion ‘g_type_from_name (name) == 0’ failed

(mitten.exe:10740): GLib-CRITICAL **: 14:44:46.180: g_once_init_leave: assertion ‘result != 0’ failed

(mitten.exe:10740): GLib-GObject-CRITICAL **: 14:44:46.180: g_boxed_type_register_static: assertion ‘g_type_from_name (name) == 0’ failed

(mitten.exe:10740): GLib-CRITICAL **: 14:44:46.180: g_once_init_leave: assertion ‘result != 0’ failed
★★★★★ julia_main INIT ★★★★★

クリックでフリーズし,以下が出る.

image

ともかく一度バックアップしておこう.

⠸ [00m:16s] PackageCompiler: compiling incremental system image★★★★★ julia_main ENTER ★★★★★
⣄ [00m:17s] PackageCompiler: compiling incremental system imagecould not load library “C:\Users\babalabo\.julia\artifacts\da6c2aa0d20a483437256f245d3c35b25e667c62\bin\libgtk-3-0.dll”
The specified module could not be found.

▲久留島喜内の道具箱でエラーが出た.α=2, ε=1000, γ=19

image

どこかでゼロ割が発生している.εを100まで落としても同じ.自動計算ではエラーにならない.更新ボタンを押したときエラーが起きるようだ.⇒これは後日見ることにしよう.

またEXEが作れなくなってしまったい.どこをいじるとどうなるという脈絡がよくわからない.REPLでもエラーが出ている.

仕掛版ではREPLでカウントアップによるアプリ終了が機能していない.というか,その処理が入っていないので停止しない.ウィンドウを閉じれば完了するが,signal_connect(win, :destroy)のところでエラーが出る.ここではnotify(c)というのを投げているがうまく通っていないようだ.グローバル変数で状態を渡したいところだが,gtk_mainで回っているだけなので,対応できない.以前,Gtk.gtk_mainの引数のところでループを回していたことがあるが,復活させてみよう.

nclickで離脱できるようになったが,エラーが出ている.MethodError: no method matching gtk_main(::Nothing) そもそもこの構文自体よく理解できないのだが…

Gtk.gtk_main(
 while nclick < 21
  println(“gtk_main:”, nclick)
  sleep(1)
 end
)

この構文もよくわからない.

@async Gtk.gtk_main()
wait(c)

C言語風に書けば,gtk_main(void)なので,エラーになるのは当然だろう.メソッドのオーバーロードというのはJuliaでは聞いたことがない… ⇒ notify(c)を2個所で呼び出していたのが,競合していたようだ.signal_connect(win, :destroy)を止めて動作するようになった.Julia の主画面とパネルが出るようになったが,動作していない.クリックイベントが受け付けられていない.やはり,以前と同じ mitten.exeは応答していませんになってしまう.とりあえずバックアップしておこう.

EXEを実行すると,主画面が表示され,ループが回りだしてプリント文を出すところまでは動いたが,クリックするとループが停止してしまう.これは生のループでもgtk_mainでも同じだ.つまり,クリックイベントを処理する段階でどこか野壺にはまってしまっているように思われるが,その場所を特定することができない.本体ループではないことは確かだし,REPLでは動作しているので,パネル上のパーツの動作でもなく,おそらく,イベント処理後の戻り道を見失ってしまっているのではないかという気がする.

元々Juliaではこのような構成は予定外なので「できない」と言ってしまえばそれまでなのだが… GTKやそれ以外にもJuliaにGUIを付け加えるためのモジュールは多数ある.また,パッケージを生成してスタンドアローンアプリを走らせるためのモジュールというのもあるにはあるのだが,それらを同時に実現した事例というのは見当たらない.あきらめるのが一番早いのかもしれないが,それではこれまでに費やした時間がすべてただの浪費になってしまう.

実際問題としてはJuliaのパッケージは一般に配布するには大き過ぎるので,これを定版とするというつもりは元々ないのだが… 次善策として,バッチファイルでジュリアのモジュールを走らせるということは可能だろうか?これができれば実質的にスタンドアローンアプリを走らせると同等のことができるようになり,かつ配布パッケージも極小のもので済むという利点がある.この構成なら現状でもなんとか動かせるのではないかと思う.これが現時点における現実策ではないだろうか?しかし,

julia mitten.jl

を実行しても何も起こらない.以下のURLでは

https://qiita.com/Authns/items/9b13655159f90715b2fd

「> julia 〇〇.jl してはいけないよ」とあり,理由としてコンパイル時間が掛かることを挙げているが,動いている気配がない.この記事ではむしろjuliaを開いてそのREPLから実行することを勧めている.しかし,REPLからmitten.jlを実行することもできない.(以前はこの方法で走ったような気がするのだが…)どうもモジュール自体をあらかじめpkgしておく必要があるという感じだ.ただし,エラーになった.

(@v1.10) pkg> add mitten
     Updating registry at `C:\Users\babalabo\.julia\registries\General.toml`
ERROR: The following package names could not be resolved:
  * mitten (not found in project, manifest or registry)
    Suggestions: MieScattering MoistThermodynamics LimitOfDetection MicrostructureNoise mosquitto_client_jll

この方向なら行けるだろうと思っていたのだが,逆にますます嵌りそうだ.往くも地獄戻るも地獄の世界になってきた.

run(command, args…; wait::Bool = true)

というコマンドがある.これはどうだろう?juliaのREPLを開いておいて,そこにソースを流し込む方法で実行することはできる.これはVS Code内でもできる.モジュールをincludeしたりusingしたりするためにはその名前のパッケージが存在しなくてはならないようだ.このためにはgitに登録する必要があるのではないか?以前にできたというのはgitに登録したことがあったからではないだろうか?この辺りを習得するにはまた,かなりの習熟曲線が必要になりそうだ.

パッケージと呼んでいるものは,数百MBもあるフォルダのことを言っているのだろうか?ますますわからなくなってきた.ここまで粘って解けないというのも悔しいが,ここでは一旦打ち切って,juliaのREPL上で動かすことを考えてみよう.できれば,それをバッチファイルのようなものでアイコンから起動できるようなればベストなのだが… ⇒ともかく,includeで実行できることが分かった.たとえば,

julia> include(“./mitten/src/mitten.jl”)

ただし,その前にディレクトリをcd(パス名)で切り替えておく必要がある.コンソール出力はすべてJuliaのREPLに出力される.これで行くしかない.バッチコマンドから起動については後で考えることにする.

スタンドアローン型の julia アプリ

スタンドアローン型のアプリを作ろうとしているのだが,動作しない.必ずしもスタンドアローン型である必要はないのだが,生成されているのに動かないというのはおもしろくないので,もう少し粘ってみることにする.パッケージは800MBを超えてしまうので,これを毎回バックアップしていたのではたまらない.外部に置くことにしてD:の直下のcompiledに保存するようにした.ここに生成されたmitten.exeを実行すると,いままでよりは多少長い時間ウィンドウが表示されるようになった.と言っても数秒も立たないうちに閉じてしまうのだが…

ただこれではっきり分かったことは,Gtkではjulia_mainを実行しているということだ.この中にループを組んでやれば多分動作するようになると思う.ただし,動作を観ていると,Julia_mainでシェルは開かれてはいるが,UIの入ったウィンドウは開かれていないように見える.多分,これはどこかに書いてあったような気がするが,Julia_mainの中にすべての処理を突っ込まなくてはならないのではないかと思う.言い換えると,REPL用のコードとスタンドアローン用のコードが切り分けできるようになっていなくてはならない.

コマンドシェルでmitten.exeを実行すると,julia_main中のプリント文は表示されるが,すぐに抜けてしまう.また,EXEのダブルクリックによる実行では何も表示されず,プリント文も出ない.⇒julia_mainの中でwaitすることによって,下図までは動いた.

image

生成された小さいパネルも表示されているが,ボタンクリックでフリーズしてしまった.

なかなか埒が明かない

なかなか埒が明かない.パッケージを作るのにPkgTemplates.jlというのが出てきた.これを試してみよう.

https://julialang.org/contribute/developing_package/

ここではGitHubを使っている.アカウントは作ってあるので,乗ってみることにする.まず,

using Pkg
Pkg.add(“PkgTemplates”)

でPkgTemplatesをインストールし,次に以下のテンプレートを作る.

using PkgTemplates
t = Template(; user=”your-GitHub-username”,
 authors=[“your-name”],
 plugins=[
  License(name=”MIT”),
  Git(),
  GitHubActions(),
 ],
)

エラーが出てしまった.user名が通らない.ArgumentError: Git: Global Git config is missing required value ‘user.name’ “babalabos” で登録しているはずなのだが… 中にピリオドが入ることが必須なのだろうか?⇒GitHubは将来(近未来的)使うことになるような気もしているのだが,どうもとんだ回り道になりそうな気がしてきた.PkgTemplatesというのを下調べしてみた方がよさそうだ.PkgTemplatesはJulia パッケージを新規生成しようとするときの手段を与えるものだ.典型的には,既存のGit 構成から起こすというのが手っ取り早い.最初からGitに繋がっているので,いろいろ好都合ということなのだろう.これは,もうちょっと手が空いてからということにしておこう.

https://qiita.com/mametank/items/9fc1c9227303d6ca304b

この記事はJuliaのプロジェクトについての分かり易い解説になっている.この続きでPkgTemplatesを解説している.現行の開発環境では,トップに蜜蜂天国GUIというフォルダがあり,その下に蜜蜂天国GUI→ 蜜天GUI→ 蜜天→ という構成になっている..code-workspace は蜜天GUIの並びにあり,蜜天の並びには.gitと.vscodeがある.このプロジェクトはGitに登録しているので,その際に.gitが生成されたのだろう..vscodeにはlaunch.jsonが入っている.これはVS Codeに関係するものだ.つまり,Julia的には外部に当たる.

蜜天というフォルダがJuliaのプロジェクトファイルに当たる.まだプロジェクトは生成されていないが(一度は生成しているが,後に削除)srcというフォルダが残っていて,蜜天.jlが配置されている.プロジェクトとして構成するためには,ここにProject.tomlとManifest.tomlを置く必要がある.これとは別にJulia本体がインストールされたユーザ環境がある.babalabo\.juliaで,この下のenvironmentsにもManifest.tomlとProject.tomlがある.Project.tomlを開いてみると,

[deps]
Gtk = “4c0ca9eb-093a-5379-98c5-f87ac0bbbf44”
JuliaFormatter = “98e50ef6-434e-11e9-1051-2b60c6c9e899”
PkgTemplates = “14b8a8f1-9102-5b29-a752-f990bacb7fe1”
Printf = “de0858da-6303-5e67-8744-51eddeeeb8d7”

のようになっている.Gtk, JuliaFormatter, PkgTemplates, Printfの名前が見える.これらは比較的最近導入されたもので,それ以前にインストールしたPlotsなどの名前は出てこない.この記事では最初にPkgモードでgenerateによってプロジェクトを作っている.これは前にやったことがあるが,もう一度作り直してみよう.蜜天というフォルダは温存して,別にmittenというプロジェクトを起こしてみる.

pkg> generate mitten

mittenというフォルダが生成され,その中にProject.tomlというファイルとsrcというフォルダがあり,srcにはmitten.jlというファイルが作られている.このままactivateしてみよう.

(@v1.10) pkg> activate mitten
   Activating project at `D:\蜜蜂天国GUI\密天GUI\mitten`

(mitten) pkg>

プロンプトの表示が(mitten) pkg> のように変わり,「環境」が変化したことを示している.mitten.jl には以下のコードが入っている.

module mitten
greet() = print(“Hello World!”)
end # module mitten

しかし,実行しても

> Connecting to debugger… Done!

が出るだけで,何も表示されない.println(“蜜蜂天国”)を追加すれば出る.greet()は単に宣言されているというだけのようだ.確かに,呼び出せば実行できる.⇒動画を1本観た(1時間物).

Juliaのパッケージ開発2022年版 @ Bio”Pack”athon2022#2
https://togotv.dbcls.jp/en/20220421.html

ようやくコンパイルが通ったようだ.コンパイル後にアプリの実行が始まった.正常に動作している.コマンドは

julia> using PackageCompiler
julia> create_app(“mitten”, “compiled”)

で compiled フォルダには,julia.exe だけではなく,mitten.exe もできている.ただし,これを実行しても画面をちらっと見せただけで閉じてしまう.ともかく,一度バックアップしておこう.⇒julia_mainをGtk.gtk_mainで置き換えるという修正を入れてようやく動くようにはなったが,今度は最後にエラーが出るようになってしまった.

[00m:19s] PackageCompiler: compiling nonincremental system image
ERROR: failed process: Process(`’C:\Users\babalabo\.julia\juliaup\j…

バックアップに戻ってもう一度やり直してみよう.なぜだろう.フォルダがやけに大きくなっている.56KBしかなかったものが,700MB以上になっている.システムイメージを持っているかいないかの違いだ.しかし,こんなに大きなパッケージを配布するなど非現実的だ.

確かにこのバージョンではエラーは発生していない.この版ではJulia_main も gtk_main も使わずにモジュール内で単純にループしているだけだ.clickの中でもループカウントをチェックしていて,オーバーするとexitを実行するようになっているが,これを止めても動作は変わらない.ただし,ウィンドウは開いたままになってしまう.これでもう一度ビルドしてみよう.いや,おそらくEXEでウィンドウを開いたままにするには,gtk_mainが必要なのではないか?

Julia で GUI アプリに挑戦

蜜蜂天国のまとめに入っているところだが,足踏み状態だ.いろいろなパターンを試してみたいのだが,そのためにはもうちょっと準備が必要だ.Julia ではGUIを持った独立のアプリを作るというのが難しいので,C#への移植を考えている.C#なら何でもできるし,これまで作ってきた資産を活かすこともできる.そのためには少なくとも,BigFloatをサポートする環境を構築しなくてはならない.以前,C#にBigIntegerを導入しようとして挫折した経験があるので,二の足を踏んでしまうところだが,再チャレンジしてみたい.

C#のライブラリとしてGitHubに公開されているものとしては,Osinkoというのがある.これはベースがBigIntegerなので,多分 BigIntegerを先に導入する必要がありそうだ.Osinko の開発者は名前から想像付くように日本人のようだ.これを使ってみることにしよう.ただし,かなり古い.リリースされたのが10年以上前で最新の更新は8年前という感じ.計算結果がマシーンによって異なるというクレームも上がっている… nuget というディストリビューションもある.

いや,その前にもう一つ考えておかなくてはならないことがある.Julia には solve という関数があり,任意の方程式を解ける機能が備わっているが,この代替になるものがC#にあるだろうか?蜜天法で自力で解くという考え方もあり得るが… いまのところ現実性は薄い.むしろ,がんばって Julia で GUI アプリを作ってしまった方が早いかもしれない… ちょっとそのコースを試してみることにしよう.

https://goropikari.hatenablog.com/entry/julia_gui_app

Julia のREPLではサンプルコードを動かすことができたが,VS Code上ではエラーになってしまう.一行目の

win = Window(“Count Click”) # 大枠のWindowをつくる

でエラーが発生している.何かが不足しているのだろう.上記URLの筆者の記事はシリーズものなので,もう少し前まで遡る必要があるかもしれない.ここではGtkを使っているが,クロスプラットフォームGUIを生成するツールキット Qt.jlというのもある.また,WebベースのGUIアプリを作るWebIO.jlというのもある.PCを使っていないユーザもいるので,ブラウザで動くというのは有用かも知れない.
https://www.reddit.com/r/Julia/comments/wdeda0/help_with_gtkjl_in_vscode/?rdt=48792&onetap_auto=true&one_tap=true

VS Codeの中で,Julia のREPLから実行するという提案があり,実行できた.ただし,まだエラーは出ている.⇒エラーは出ないようになったが,クリックがカウントされない.つまり,イベントを拾っていない.このコードの作者はLinux環境でJuliaを動かしているようだ.別の選択肢としては,Jupyterというのがある.これはJuliaだけでなくPythonその他複数の言語をサポートしている.

VS Codeの右上メニューからJulia:Execute active file in REPL でウィンドウを開き,イベントを取るところまではできた.しかし,デバッグはできない.デバッグモードで実行しようとすると,sigatomic_end called in non-sigatomic region エラーが起きてしまう.クロスプラットフォームパッケージのQtをインストールしてみよう.Qtというパッケージは見つからないので,QT_jllというのをインストールしてみた.インストール時にエラーが起きている.VS Code内でJulia→pkgではエラーは起きなかった.⇒しかし,サンプルは動かない.

オリジナルのソースコードは反応するようになった.

image

デバッグはできないが,何とかアプリを構築できる目処は立ったとも言える.EXEに仕立てるには,PackageCompiler.jlというのが必要になる.⇒インストールできたが,ビルドできない.build_executableが未定義になってしまう.PackageCompilerではなく,ApplicationBuilder という名前が出てきた.以下のコマンドで動いた.

Julia> PackageCompiler
Julia> create_app(“密天GUI.jl”, “密天GUI”)

ただし,エラーが出ている.引数がまずいようだ.

using PackageCompiler
create_app("/path/to/Hello",         # this is the directory where Project.toml resides
           "/path/to/HelloCompiled") # target directory where you want your compiled app to be generated

project.tomlというファイルがどこかになくてはならないのだが… Julia にはプロジェクトという概念はなかったような気がするのだが… 実際,メニューにはそれらしきコマンドは見当たらない.⇒プロジェクトはpkgで生成されるようだ.

pkg> generate 密天GUI

現在のフォルダの下に指定した密天GUIというプロジェクトが生成され,同時に蜜天GUI.jlというファイルも作られる.密天GUIの中にはProject.tomlというファイルが作られ,そこにはsrcというフォルダができていて,その中にも蜜天GUI.jlというファイル作られている.いや,最初の蜜天GUI.jlは元々あったものだ.Project.tomlの内容は以下のようなものだ.

name = “密天GUI”
uuid = “d0bef8e6-be7e-4316-93e9-b4cd7ca35f8f”
authors = [“babalabo “]
version = “0.1.0”

src\蜜天GUI.jlの中身は,以下の3行だ.

module 密天GUI
greet() = print(“Hello World!”)
end # module 密天GUI

このファイルを実行すると,

Main.密天GUI

が出力される.しかし,greet()という関数が実行された気配はない.greet()の下に一行追加して

println(“密天GUI ############”)

実行すると,

WARNING: replacing module 密天GUI.
密天GUI ############
Main.密天GUI

が出力される.どうもよく訳が分からない… フォルダを変えて,新しいプロジェクトフォルダを見るようにしたら,上の警告が消えて,まともな動作になった.

密天GUI ############
Main.密天GUI

(@v1.10) pkg> activate .
   Activating project at `D:\蜜蜂天国GUI\密天GUI\密天GUI`

ビルドするときにはJuliaを以下の構文で起動する必要がある.

❯ julia -q –project ⇒エラーになる.

その後で,以下を実行する.

julia> create_app(“MyApp”, “MyAppCompiled”) [ Info: PackageCompiler: creating base system image (incremental=false), this might take a while… [ Info: PackageCompiler: creating system image object file, this might take a while…

ほとんど空に近いアプリだが,ビルドはかなりの時間が掛かる.⇒しかし,最終的にはエラーで終わってしまった.

ERROR: failed process: Process(setenv(`’C:\Users\babalabo\.julia\juliaup\julia-1.10.2+0.x64.w64.mingw32\bin\julia.exe’ ....

今回は39個しかDLLが生成されていない.(その前は54個?できていた)julia.exeを実行してもぱっとウィンドウが一瞬開いて閉じてしまう.ただし,今回はbinの他に,shareというフォルダができている.この中にはファイルが3個できているが,そのうちの一つはProject.tomlだ.⇒どうも,GtkはWindows向きにはできていないようだ.REPLでは動作しているようなのだが…

https://docs.gtk.org/gtk3/building.html

GtkをWindowsで使うためには,gvebuildが必要なようだ.これはPythonスクリプトで,VSを使ってGTKライブラリを構築する.

いつの間にか来訪者が20万の大台超え

蜜蜂天国のまとめに入っているところだが,find_zeroが動作していない.どうもtryブロック内の変数がローカルになっているようだ.global 宣言することで動作するようになった.

いつの間にか来訪者が20万の大台を超えていた.何かいいことあるだろうか?タバコが切れてからそろそろ一週間…

image

また軌跡の描線が出なくなっている

なぜだろう?また軌跡の描線が出なくなっている.アニメには出力されている.このサンプルでは例外は発生していない.昨日は完全に動作確認したつもりだったのだが…

image

ポイントは描画できているのに線分が描けないというのはどういうことだろう?2024-03-28-1 では出ている.最新版でまったく同じ設定にしてみたが,やはり動作していない.どうもよく分からないので,ここまで戻ることにする.

image

いや,それより後の28-2でも動作している.ここまで戻れば十分だ.

image

この後,どんな修正が入っているかが問題だ.この版にはすでにRootsは組み込まれていて,Find_zeroで不動点を検出している.実際画面にも描画されている.ここまでできれば立派なものだと思うのだが,何を追加しようとしたのだろう?まず,動線を描画できていないサンプル y=x^2-1.5 初期値α=1.8229を試してみよう.確かに画面には何も出てきていない.

image

ただし,これは計算や動作が誤っているためではない.開始点=(1+√7)/2 から出発した場合,値の変化が遅くて不動点の◯の外に出られないためだ.これを区間[1.8, 2.0] point:30で描画すると,以下が出力される.

image

ただし,ステップを増やして,point=34を超えると動線は消えてしまう.

1: 1.82287565553229535809
2: 1.82287565553229552433
3: 1.82287565553229613042

27: 1.84833257470943420165
28: 1.91633330673200616455
29: 2.17233334249042522319
30: 3.21903215089562309242
31: 8.86216798849970155839
32: 77.03802145638884645281
33: 5933.35674991502828268578
34: 35204720.82176222747503632359
35: 1239372368138217.42496308002819849062

36: 1536043866904533138569813670805.66483330243742956258
37: 2359430761055031115005960802378927230275224692180453704350907.12176434601263055879
38: 5566913516212723332117413654604965054786240836971452633864047785437413116991185624735519798218699259766451175951693774848.00000000000000000000
39: 30990526096991907041511225161593806680067925799018141776028714401452471138227479974234438992180424796522079841327601952168724719696008595440015069056256081311447418248647170548763107745965205691210096638929522670926745027633952745003478417408.00000000000000000000

のように変化するとき,39点目で例外が発生しているが,それよりも手前の35点目で描画上の問題が発生するものと考えられる.例外が発生した場合には,例外の発生点から先を切り捨てて自動再計算するようになっているが,動線を描画するためには,maxloopを68以下に設定する必要がある.下図では区間を[1.8-100.0]まで拡大して32点までを描画している.

image

いずれにしても,軌跡の動点数を調整しないと動線を描くことはできないということが分かった.ここで一度バックアップを取ってから,もう少し整理することにしよう.⇒配列XaとYaは廃止できるはずだ.⇒廃止した.⇒lastpos はループの中では更新せず,最後のsweetposから取り出すというのでよいのではないか?(正確に言うと,この点は描画されていない可能性はあるが…)この図は区間[1.8, 4.0]だが,稲妻型の発散としてはこのくらいが分かり易いのではないか?

image

とりあえず,一旦バックアップを取っておこう.ある程度整理が付いた.稲妻型の収束例として以下をピックアップしておこう.

image

スパイラル型の収束例が欲しい.これがスパイラルではないか?

image

そんな感じだ.通常のメルストロム型とはかなり違う.初期値0.5でもほとんど図柄は変わらない.しかし,x^2-1.5の標準図とは大きな違いだ.下図↓

image

ようやく片付いた

プログラムを少し改造する必要がある.

  1. precision を定数で与える ◯
  2. initialpointを冒頭で定義する ◯
  3. setprecision ブロック内の処理はすべて平場で実施する △
  4. 特性関数を y = (x-a)^2+b の形式に変更する X
  5. 特性方程式 x=(x-a)^2+b の解をあらかじめ取り出しておく ◯
  6. その他のパラメータも変数表示してあらかじめ計算しておく △

これは何だ?まだ午後9時というのに…

image

これはこれまでのレコードではないだろうか?ただし,それほど伸びなかったようだ.2000は超えなかった模様.

初期値を2から100に変更しただけでエラーが起きてしまった.10ならば動作する.-10にしたら,今度はDrawLinesで停止するようになった.⇒これはわたしのミスだ.根号の中の変数に負値を与えていた.√(5+x)なので,-5より小さい値は渡せない.しかし,√(20+x)としても,エラーは解消しない.今度は setprecision のエラーだ.

NaN result for non-NaN input

どうも,シグネーチャの異なる呼び出しを実行しようとしているようだ.⇒setprecisionを引数一つの一番シンプルなタイプに書き換えて動作するようになった.しかし,初期値100ではまだエラーになる.今度は UndefVarError: `Rounding` not defined に変わった.

初期値20なら動作する.初期値によって動作が変わるというところが気に食わないところだ.どうも,この setprecision という関数は本当に始末に悪い関数だ.今度は

BoundsError: attempt to access 920-element Vector{UInt8} at index [923]

どうなっているのか?訳が分からない.⇒わかった.おそらくこれは浮動小数点数の指数部のレンジローバーだ.ここでレンジオーバーするということはこの数値はすでに超巨大数になっていることを意味する.つまり,BigFloatでも扱えないほどの数ということになる.precisionは仮数部のビット数なので,これがどれほど大きくても無関係だ.⇒ざっと見た限りではこのレンジを変更する手段はないように思われる.ここでは,エラーで脱出するしかないだろう.

https://discourse.julialang.org/t/cumbersome-scoping-rules-for-try-catch-finally/4582

ようやく片付いた.以下のように手当して切り抜けた.

  1. 任意精度浮動小数点数では仮数部のビット数は指定できるが,指数部を設定できないので,巨大整数では例外が発生する.これを処理するために try・catch ブロックを設けたが,catch ブロックでは外部変数を参照できないなど,いろいろと制約がある.
  2. このため,try・catch ブロック を最上層に仕掛けて,catch ブロックの中ではフラグを立てるだけで抜けるようにした.後処理を catch ブロックの中で実行しようとすると,動作がおかしくなる.
  3. 後処理は最上層に戻ってから実行するようにした.後処理では,例外が発生してご破算になった計算を安全に計算できる範囲で再計算する.このために,maxloop を書き直して,CalcTrajectory を再実行している.

一応これで片付いたが,まだ軌跡は描画できていない.アニメには収録されているのだが… 多分これはどこかで調整できるだろう.⇒とりあえず出るようになったので,よしとしておこう.大部扱い易くなった.

image

あとは,最低限,不動点を描画するだけだが,これを自動計算することはできないだろうか?ともかく,一度バックアップしておこう.⇒Julia にはいくつかsolverパッケージがある.Roots.jl,NLsolve.jl… NLsolve には x=F(x)を解く機能まで備わっているようだ.NLというのはnon-linearという意味だ.Roots では探索範囲を指定しなくてはならないところがやや難だ.しかし,蜜天法よりはましかもしれない.蜜天法では見つかったとしても一つだけだ.NLsolveは二変数以上の方程式が解ける.今のところはそこまで必要ないので,Rootsでゆくことにする.⇒フォルダ名を蜜蜂天国に変えた.

どうも,find_zeroの引数xはFloat64までしか使えないようだ.

どうも,かなり難しい話になってきた

蜜蜂天国の空域の地割りをやろうとしているのだが,手強い.y=x^2-3/2の代わりにy=x^2を適用すると,初期値s<1の場合には単純に収束してしまう.つまり,この代数系の動作を決定しているのは曲線の形状だけではないということになる.

◎オフセット:-1.5 初期値:α=-0.5 α点を含む白地を残して塗り潰し

image

◎オフセット:-1.0 初期値:α=-0.5 無限ループ

image

◎オフセット:-1.5 初期値:α=-0.7071 卍字型循環経路

image

ミツバチ天国:ハニーポットを探せ

どうも,何か異変が起きている気配がある.初期値-1.5で10000ステップを実行しているところだが,停止しない.いや,これがノーマルなのではないか?これまでは1000と2000でテストしていたが,10000というのはやっていないと思う(以前に試したことはある).これではちょっと掛かり過ぎるので打ち切ることにしよう.グリーン・ゾーンの塗り潰しを見たいのだが,2000くらいでも十分なのではないか?制御が移ってしまっているのだろうか?SHIFT+F5で停止しない.CTRL+Dでターミナルを止めて停止した.

話が大部変わってきたので,タイトルも「無限プール・ゲーム」から「ミツバチ天国」に変えた.これまでは,スィートスポットはボールをすべて吸引するポケットと考えられてきたが,どうもそうではないらし.つまり,スィートスポットは孤立した到達不能点である可能性が高くなってきた.ミツバチ達はこの到達不能なスィートスポットを探して広い緑地空間を飛翔し続けるというストーリィだ.白丸が開始点で赤丸はスイート・スポットないしビタースポットだ.上の図では開始点がスイートスポットに重なっているため,赤丸は1個しか出ていない.

image

IPAMinchoをJapanese Fonts というところからダウンロードして,インストールした.ZIPファイルを解凍してTTFファイルを右クリックすると「インストール」というメニューが出てくるので実行するだけだ.しかし,エラーは消えない.”IPAMincho”を”IPA明朝”に変えても同じ.

ENV[“GKS_ENCODING”] = “utf-8”
gr(fontfamily=”IPA明朝”)

画面は日本語表示されているので,警告を止めるだけでもよいのだが… Plotly というバックエンドを使うと何もしなくても日本語が出るようだが… Plotly はもっぱらJavascriptで使われているようだ.我々はGRを使っているので,この上で動くものでなくてはならない.いや,Plotly はGRの上で動くのではなく,GRを置き換えるものだ.また,Plotlyではplotなどのコマンドはそのまま使えるようだ.Plotlyjsという名前にはなっているが,JavaScriptを使わなくてはならないということではないのではないか?これはPlotlyを使う一択なのではないだろうか?

とりあえず,JuliaのREPLで試してみることにする.しかし,どうにもネットワークが遅い.Plotlyで画面を出すには,electron と Blink.jl が必要なようだ.どちらもまだ入っていない.パッケージのダウンロード中にエラーが起きている.Kaleido で失敗している.やはり,ギガを買わないと無理なのではないか?この代金はポイントで支払えるので,多分決済できるだろう.⇒俄然早くなった.

PlotlyJSとは別にPlotlyというパッケージもある.ポイントがもったいないので,これもインストールしておこう.Electron と Blink も追加インストールした.しかし,まだ動かない.Blink.AtomShell.Install() を実行するように指示されたが,エラーになってしまう.Install を小文字かして install としたら動作した.しかし,まだまだエラーが取れない.

7z.exe というのがない.GITに繋がっていないためだろうか?存在するのに動作がブロックされているという可能性もある.PlotlyBase,PlotlyKaleidoをPkgで導入したが,インストールされていないというエラーになる.⇒インストールしたIPA明朝のファイル名を確認したら(C:\Wndowd\font),IPAMincho Regular となっていたので,このスペルで設定したら日本語表示できるようになった.Plots が使えるようになったので,Plotly などを持ち出す必要はなくなった.

開口部には外部から侵入できないようだ

無限ビリヤードだけで6436本もファイルが入っている.久留島喜内で100本だ..vscodeが入っている.インテリセンス用のデータベースだ.いや,ここにはsetting.jsnというファイルが1本入っているだけだ..condaに6千本以上詰まっている.これを追い出す必要がある.どうなるのか分からないが,とりあえず,.vscodeと.condaをCドライブに移動した.また,厄介なことにならなければよいが… ⇒VS Codeを再起動してみたが,とりあえず,問題なく立ち上がってきた.⇒ランさせてみたが,特に問題は起きていない.

公開サンプルでは,開始点から直下に下がったところで関数曲線にぶつかり,そこから左に向かったあと,曲線の反対側から螺旋運動が始まるような動作になっている.この螺旋運動の領域をハニーポットと呼んでいるが,最初に関数曲線に出会う点は図版ではハニーポットに含めていない.しかし,この点(X点としよう)は関数曲線上の点なのだから,軌跡の動く領域に含まれないというのもおかしい.100回ループを1000回に変えてみた.この図を見る限りでは,確かにX点はハニーポットの外側にある.これはなぜか?

image

10000回周回させると半日掛かってしまうので,2000回で取り直ししてみよう.2000回走らせると下図のようになる.

image

やはり,X点はハニーポットには入っていない.今度は,開始点を(0, 0)にしてみた.出力は開始点(1.5, 1.5)の場合とほとんど変わらない.

image

開始点を(-1, –1)に変えてみよう.この点はスィートスポットより左に位置する点だ.塗り潰しの濃淡はあるが,構図はほとんど変わらない.

image

開始点を(2, 2) とすると発散してしまうが,これは開始点がビターポイントの右にあるためと考えられる.開始点が(-2, –2)でどうなるか見てみよう.⇒発散してしまう.発散してしまうのはよいが,垂線1本とそれから水平に曲がる直線しか表示されない.多少は中間点が表示されてもよいと思うのだが…X, Yのレンジを巨大数まで拡げてみようとしたが,どうも難しい.このくらいが限界だ.

image

これ以上拡げると曲線がほとんど垂直線になって軌跡が見えなくなってしまう.ビタースポットの近傍からスタートした場合,内側ならハニーポットに入り,外側なら発散するという予想通りの結果になった.下図は,β-0.00000001からスタートした場合(2000ステップ)

image

スィートスポットはハニーポットの内部にあるが,この点からスタートした場合にはどういうことになるか?結果が出た.

image

この結果はビターポイントの左側の点はすべてスィートポイントに収束することを意味する.いや,ちょっと違うかもしれない.これは開口部の内側からスタートしたもので,開口部の外側からスタートした軌跡がこのスタート地点に到達することを意味するものではない.開口部の内部に少し階段線が出ているが,これは螺旋経路に入るまでのステップであり,おそらく,その後は通常の渦巻きになっているのだろう.逆に言うと,外側から開口部の内部に到達する経路は存在しないということになる!これはかなり予想外の結果だ.

開始点の座標は(α, α)になっているが,これはもちろん厳密値ではないから,真のα点からはスタートすることもできないはずだ.

x=-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

y=-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

Y=-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

どうも計算のどこかで桁落ちが起きているようだ.最初のステップでは確かにX=Y=αの状態になっているのに,どこかでそれが崩れている.次のステップで値が変化している.

x=0.8228756555322954654385375167383836510883458373747302040693228205013915750026478

データの受け渡しは sweetspot という変数を使って行っている.step!が3回目に呼ばれたときには値が変わっている.

-0.822875655532295358085548286908306181430816650390625
-0.822875655532295358085548286908306181430816650390625
-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

値が変わっているだけではなく,桁数も伸びている.CharacteristicFuncではx^2-3/2 の計算値を返している.⇒BigFloatを明示的に返すようにしたが,変化なし.CharacteristicFuncの値を見てみよう.

-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

α=-0.822875655532295358085548286908306181430816650390625 であるとすると,α’=CharacteristicFunc(α) で α≠α’ になっている.これは避けられないのではないだろうか?

Julia で x = x^2-3/2 という方程式を解けるだろうか?できそうだ.この値を使ってやればよいのではないだろうか?

printf のパッケージを導入する必要がある.Julia と VS Code のどちらに入れたらよいのだろう?VS Code で入れると現在のプロジェクトフォルダに入ってしまような気がするのだが… Julia の場合はUsers\babalabo\.julia に入る.

Base.@kwdef mutable struct BallPositionには,xとyという変数があるはずだが,アクセスできない.type SimpleVector has no field x 

BallPosition というのは,Base.@kwdefのインスタンスではなくて,型のようだ.変数を宣言することで動作するようになったが,日本語が出せない.フォント不在エラーになる.

ENV[“GKS_ENCODING”] = “utf8”
using Plots
gr(fontfamily=”IPAMincho”)