忘却の微分方程式(41) 反復練習5、対角化とn乗、Maxima on Android

Joseph Halfmoon

今回からパソコン上のMaximaに加えてスマホ上のMaxima on Androidを併用して行きたいと思います。このMaxima処理系はパソコン上と変わらず本格的な処理をスマホ上でできるものであります。作者の本田様には感謝です。今回の練習はP-1APの件?です。

※「忘却の微分方程式」投稿順 index はこちら

実を言えば、MoA(Maxima on Android)は相当前にインストールしてあったのですが、使ってなかったです。理由は入力がし難いので。キーボード世代の年寄りにとっては、そもそもスマホの入力が難渋する上に、記号入力が頻繁に必要になるMaximaの入力はシンドイというのが理由。プログラミング向けの入力アプリを別途導入すれば良かったのですが、分けの分からぬものはなるべく入れたくない、と。そうしたらMoAの作者の本田様からMaxima用のキーボードが出ていることにようやく気付きました。

Maxima Keyboard

これは、Maximaだけでなく、記号を入力することが多い、プログラミング言語系の入力に使えるのでないかい(個人の感想です。)まあ、設定工夫すればどんなものでも使えないことない。要はやる気か。。。

御本体のMoAは以下に。

Maxima on Android

ファイルシステムの取扱いにちょっとクセがある

ほぼほぼフルセットだと思われるMaximaがAndroidの上で走るのですが、ファイルシステム関係ではちょっとクセがあるようです。当方アンドロイド10を使ってますが、一人で使っていても「マルチユーザ」モードらしいです。アプリの使うデータファイル類は /data/data 配下に配置されておる感じ。ところがMoAのMaxima本体はデータファイルとして、特定のユーザ用の /data/user/0/ 配下のディレクトリのみアクセス可能みたいです。でも「マルチユーザ」モードの普通のAndroidアプリからはそちら側が見えないように思われます。

困ったと思ったのですが、それは裏で走っているmaxima本体側だけで、maxima本体の上に被っているMoAのGUIを介すとスクリプトのロードなど普通にできました。MoAの右肩のメニューを開くと以下のような感じです。その一番下に、Load script fileという項目があり、ここを使えば普通に/data/data配下のディレクトリにあるスクリプトを選んでロード可能でした。

なお、ロード時には、指定したファイルを一端/data/user/0/配下のMaximaの作業ディレクトリ?にコピーし、仮の名前(拡張子.mac)をつけてからそれをBatch処理するコマンドラインを生成しているようです。これを「ENTER」すれば処理されます。

私の環境では拡張子を .mac とするとデフォルトで別のアプリが開くようになっておりました。そのためか .macのままだとエディタで編集もできないです。しかし上の機構により、/data/data 配下では、xxx.txt のようなテキストファイルとしてmaximaスクリプトファイルを編集した後、Load script file すると、自動的に.mac拡張子のファイル名にキャッシュされてから開かれます。表側?では拡張子は.macでなくても大丈夫みたい。

MoAloadScriptFile

なお、Sessionメニューからはセッションをセーブしたり、リストアしたりすることができます。この保存先は通常アプリからは見えないのですが、そちら側で閉じているので問題なくセーブ、リストア可能でした。

上記メニューから、Manualの項目をタップするとMaxima自体のマニュアル(パソコンでも使えるもの)が読めます。MoAに独特の機能やUIなどについては、Manualではなく、一番上のAbout Maxima on Android から調べることができます。Aboutを開くと表示されるサブ項目の上部はこんな感じ。

Maxima on Android

今回の演習問題

以下の参考書(以下URLは「改訂9」)の「改訂1」版の演習問題をMaximaの練習用に使わせていただいております。

線形代数キャンパス・ゼミ 改訂9 馬場敬之/著

今回は演習問題6「行列の対角化とn乗計算」です。P-1AP(昔一世を風靡したPPAPではありませんぞ)が登場するもの。

このために記述したスクリプトが以下に。

A: matrix([3,4],[-1,-2]);
P: matrix([4, 1], [-1, -1]);
PAP: invert(P).A.P;
PAPN: PAP^^n;
PAPN2: matrix([2^n, 0],[0,(-1)^n]);
A^^n=P.PAPN2.invert(P);

さて上記のスクリプトをLoad script fileでバッチで実行してもらいます。まずは、演習問題で使う2つの2x2の正方行列AとPの定義から。

MoA001

行列2個、AとPが定義できたところで

まずはP-1APを求めよと

Maximaにお願いすれば一撃です。

MoA002

対角化できましたな。

つづいてAnを求めよと

ここで使うのが以下の公式?であります。忘却の彼方から蘇る?最初から記憶していない?

PAPn
P-1AP自体は対角行列であるので、それのn乗は以下のPAPN2のように書き直せます。

MoA003

さすれば、公式をつかって左からP、右からP-1を掛けてやればAnが残るっと。

MoA004

一応、お答えは出た、と。しかし、行列の各要素から1/3をくくり出したりするのはどうしたら良いのでしょう? まだまだ練習が足りんな。スマホでMaximaできるのだから、スキマ時間(そんなものあるのか?)に練習しろ、と。

忘却の微分方程式(40) 反復練習4、行列の列ベクトルへの分割と変形 へ戻る

忘却の微分方程式(42) 反復練習6,行列式その1、Maxima on Android へ進む