手計算しにくい方程式をソフトウェアで解く(数値計算)

 

皆、中学または高校で、ある方程式を解くことは経験済み

これから先は、次の2のような方程式をソフトウェアで解いていく。これは数値計算の一部と考えて良い。

1 手計算で解が得られる方程式。

2 手では計算しにくいが、コンピュータソフトウェアを使うと容易に解が得られる方程式(手計算では時間がかかり過ぎる)。

3 自然界には、方程式の形は判っているのに、特定の条件で解が存在するか不明な方程式がある。

 

中学校の授業では2次方程式の解の公式を暗記させられたので、解が手計算で求められる事は分かっている。では3次方程式はどうだろうか? ご存知の人もいるだろうが、これにも解の公式がある(カルダノの公式)。4次方程式の解の公式にはカルダノの弟子フェラーリの名前が付いている。しかし5次以上の多項式方程式については、解の公式は存在しないことが19世紀に数学者らによって証明されている。でも公式が無いからと言って解が無いわけではない。コンピュータソフトウェアを用いて計算させれば、何かしらの解を得ることが可能だ。

 

例1)まず入り口として、次の様な簡単な二次方程式を考える。

式(1)の解の公式は以下の通り

具体的に簡単な数値a=2、b=1、c=-5を入れてみよう。

式(2)にこの値を代入すると、

2つの実数解が得られる事が解る。電卓を使えば近似解も得られる。今まで紹介してきたツールを使って、2次関数(y=式(1)の左辺)をプロットしておけば、y=0をその近次解が通過していることが解るはずだ。

「そんな事、解ったよ」と思った人、もう少々お付き合い願いたい。段々クールになっていくよ。

 

解の公式が無い場合

例2)上の2次方程式と同じ様な形でも、解の公式が使えない場合が容易に考えられる。以下のような方程式だ。

2乗を2.1にしただけだが、もはや解の公式は使えない。

ソフトウェアの数値計算で解を得る前に、関数(y=式(5)の左辺)をプロットして解の存在を確かめたい。そこで、xの値の範囲を予測してみる。式(4)の結果から、大体-4〜+3辺りに解はありそうかな? wxMAXIMAでプロットしたものを下に示す。wxMaximaの画面上部にあるPlotプルダウンメニューを使えば、以下の緑色の所だけの入力で済む。残りはwxMAXIMAから自動で出力されたものだ。

-------------------------------------------------------------------------------------

wxplot2d([2*x^2.1+x-5], [x,-5,3],
    
 [gnuplot_postamble, "set zeroaxis;"])$

-------------------------------------------------------------------------------------

ゼロを通過する点が解なので、x=1.4付近に解は有りそうだ。x<0の領域には実数解は無い(電卓で確認できる)。見てる領域以外に本当に実数解が無いかどうか、xの範囲を広げて確認した方が良い。また実数解が見つかったからといって、複素数解が無いとは言えない(これ以上は複素関数論の領域なので、ここでは踏み込まない)。このように関数全体を見渡しておくことをお勧めする。

wxMAXIMAには方程式の解を求めるコマンドがいくつか存在するが、今回はfind_rootを使う(このコマンドは関数ではなく方程式に変える必要がある)。

-------------------------------------------------------------------------------------

find_root(2*x^2.1+x-5=0,x,-5,3);

find_root: function has same sign at endpoints: f(-5.0)=45.85644999937932, f(3.0)=18.09021713261029
 -- an error. To debug this try: debugmode(true);

------------------------------------------------------------------------------------

エラーが出て解が求まっていない。「値の最大値と最小値で関数値の符号が同じ」であることが理由のようだ。つまり関数値ゼロの前後で、関数値を評価すれば符号が異なるので上手く行くかも。上のプロットを見ながら、x=1~2に変更し再度トライ。

-----------------------------------------------------------------------------------

find_root(2*x^2.1+x-5=0,x,1,2);

1.334417964241897

----------------------------------------------------------------------------------

今度は上手く行った。

 

例3)別のツールでも同様な結果になる事を検証しておこう。Wolfram CloudMathematicaで確認してみる。  

---------------------------------------------------------------------------------

----------------------------------------------------------------------------------

Mathematicaのプロットも同様だ。SolveとNsolveコマンドは実数値解が1個で複素数解が2個(共役複素数)存在することを示している。

このように、ツールにより計算結果の表示桁やコマンドが異なるので、是非複数のツールで結果を検証することを心掛けたい。慣れてくるとプロットせずにコマンドだけで解を求めがちになる。でも関数値をプロットして関数の全体像を把握しておくことは、視覚的にその関数の限界を知り空間認識するので、数学的なセンスが磨かれるかどうかは別にしても、個人的にはお勧めである。今なら、「推し」か。