プログラムを少し改造する必要がある.
- precision を定数で与える ◯
- initialpointを冒頭で定義する ◯
- setprecision ブロック内の処理はすべて平場で実施する △
- 特性関数を y = (x-a)^2+b の形式に変更する X
- 特性方程式 x=(x-a)^2+b の解をあらかじめ取り出しておく ◯
- その他のパラメータも変数表示してあらかじめ計算しておく △
これは何だ?まだ午後9時というのに…
これはこれまでのレコードではないだろうか?ただし,それほど伸びなかったようだ.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
ようやく片付いた.以下のように手当して切り抜けた.
- 任意精度浮動小数点数では仮数部のビット数は指定できるが,指数部を設定できないので,巨大整数では例外が発生する.これを処理するために try・catch ブロックを設けたが,catch ブロックでは外部変数を参照できないなど,いろいろと制約がある.
- このため,try・catch ブロック を最上層に仕掛けて,catch ブロックの中ではフラグを立てるだけで抜けるようにした.後処理を catch ブロックの中で実行しようとすると,動作がおかしくなる.
- 後処理は最上層に戻ってから実行するようにした.後処理では,例外が発生してご破算になった計算を安全に計算できる範囲で再計算する.このために,maxloop を書き直して,CalcTrajectory を再実行している.
一応これで片付いたが,まだ軌跡は描画できていない.アニメには収録されているのだが… 多分これはどこかで調整できるだろう.⇒とりあえず出るようになったので,よしとしておこう.大部扱い易くなった.
あとは,最低限,不動点を描画するだけだが,これを自動計算することはできないだろうか?ともかく,一度バックアップしておこう.⇒Julia にはいくつかsolverパッケージがある.Roots.jl,NLsolve.jl… NLsolve には x=F(x)を解く機能まで備わっているようだ.NLというのはnon-linearという意味だ.Roots では探索範囲を指定しなくてはならないところがやや難だ.しかし,蜜天法よりはましかもしれない.蜜天法では見つかったとしても一つだけだ.NLsolveは二変数以上の方程式が解ける.今のところはそこまで必要ないので,Rootsでゆくことにする.⇒フォルダ名を蜜蜂天国に変えた.
どうも,find_zeroの引数xはFloat64までしか使えないようだ.