直交行列を使って、n次方程式をソルバーで解くプログラムを作ってみました。
上のファイル;6次までの実数を係数に持つ方程式の、計算ソルバー。
下のファイル;6次までの実数を係数に持つ方程式の、計算ソルバー。
9次までの、複素数を係数に含む方程式の、計算ソルバー。
方程式の掛け算、割り算の計算用ツール(掛けた先は、9次まで。割り算に使えるのが、割られる式は9次まで、割る式が5次まで。)
直交行列のリスト(方程式の計算ソルバーのシートの、一番左上の直交行列の欄にコピペして使ってください。9次まで。)
下のファイルは改良版です。6次方程式までの解法のソルバーと、9次+虚数が指定可な方程式までの入力欄を用意したバージョンになっています。また、直交行列の値を修正して、各直交行列が、ランダムに近い数値の並びになるようにしました。一回での反復速度が遅くなる代わりにより1回で収束がしやすくなりました。
とりあえず先に公開します。まだ検証が全て終わってないため、記事自体は、後から修正を加えます。(サンプルとしてアップロードしたファイルは、6次方程式までを解けるようになっています。)
使い方① 定数項〜6次項のところに、求めたい方程式の係数を代入する。(5次以下の方程式を解きたい場合は、6次項の係数を0にして使ってください。)
使い方② ソルバーで、計算行列平方和を目的変数に、解1〜解6までの数値マス2×6を値を動かす変数として、ソルバーを起動させてください。GRG非線形で、最小値を求めます。マルチスタート、解の制約条件のマスに数値1000以下の制約条件をつけてみるのが、最初は無難かもしれません。
使い方③ 対角行列っぽい行列の左上1/4と、右上1/4に、方程式を求めるための条件を設定して、ソルバーを繰り返す。具体的には、左上の6×6の行列のうち、一番左上から、一番右下にかけての斜めの6項を実数成分の対角項、右上の6×6の行列のうち、同じく一番左上から、一番右下にかけての斜めの6項を複素数成分の対角項といい、数値参照が固定されておりますので、動かさないようにしてください。それぞれの対角項の、右上の5×5の三角形について、求めたい条件に合わせて、該当するセルに1を入力します。
入力規則①;まず最初の1回目は、全てのマスに1を入力する。5次方程式以下を解く時には、解の数は全てで5個以下になるので、対角成分のうち、解の計算に使わない成分が1つ以上出てきます。その場合は、使わない成分の縦と横のマスは全て、0にしておいてください。
入力規則②:計算行列平方和のマスが0に近くなり、検証のとこの検算数値がいずれもゼロに近くなっていたら、計算終わり。それが全ての解になります。ならなかった場合について、検算数値が0に近いものがあれば、解の数値の一番上にコピペしたのち、次以降のソルバーの動かすセルから除外しましょう。
入力規則③:計算行列平方和のマスが、0に近くなるまで、0と1を入力し直して、ソルバーを解き続けます。それぞれのマスが1の時には、縦と横の成分が同じ数値に近くなればなるほど、計算行列平方和のマスの数値が大きくなります。
入力規則④:全てのマスを1にした時に計算行列平方和のマスが0に収束しなかった場合は、収束が難しいほど離れた値から始めていたり、重複解がある可能性があります。縦横が全て0になる対角成分を1個ないし2個作って、ソルバーを解き直しましょう。
※検証途中経過。途中から、またファイルに追加しましたが、途中経過で使うための、出てきた解からxの方程式の係数を計算するためのエクセルシートと、方程式の割り算を行うためのシート。また、各次数の直交行列を9次まで作成したものも、置いておきました。
5次方程式なら5次方程式用の5行5列の直交行列、9次方程式なら9次方程式用の9行9列の直交行列を使い、さらに、解を対角要素にした行列(ファイルのうち一番左上の直交行列のさらに下の行列)から、対角要素のそれぞれ右隣(一番下の要素はなし)の1マスを1に設定して、後は0のままでソルバーを反復させます。そうすると、最後の解の小数点以下までちゃんと区別して計算できるようです。ただ、ソルバーの初期値により、一回ではなかなか収束しないこともそれなりにありますので、やっぱり色々と調整した方が、最後の最後まで解を求めやすくなりそうです。
この記事が気に入ったらサポートをしてみませんか?