グラフと方程式

突然ですが、方程式 x^2 – 2x – 4 = 0 の解は何でしょうか?

解の公式を使うと解は 1±√5 です。またf(x) = x^2 – 2x – 4 のグラフを書いてみると以下のようになります。

x軸と2箇所で交わっています。これはxの値によっては x^2 – 2x – 4 = 0 になる場合が2つあることを意味していて、そのときのxの値がこの方程式の実数解です。グラフをみるとこの方程式の実数解が2つあることが視覚的にもわかると思います。

では方程式 x^2 – 2x + 4 = 0 の解はどうなるでしょうか? この場合、実数解は存在しません。判別式(b^2 – 4ac)なんて知らなくても以下のf(x) = x^2 – 2x + 4 のグラフをみてみるとx軸と交わる点は存在しないため、この方程式の実数解は存在しないことが視覚的にも理解できると思います。

複素数と3次元グラフ

問題はここからです。方程式 x^2 – 2x + 4 = 0 には解は存在しないのでしょうか?解が 存在しないのは実数の範囲内という条件があるときです。xが複素数の場合は1±√3iという虚数解が存在します。これを図形的に理解するためには平面上のグラフでは難しいです。

そこで3次元グラフを考えます。赤い軸がxの実部、青い軸がxの虚部、緑の軸がf(x) = x^2 – 2x + 4 の実部です。

実際にグラフを書こうとするとグラフは線ではなく面になることが予想できます。ただY座標はf(x)の実部なので虚部を図として表現することができません。そこでここではf(x)が実数になる場合のみを考えます。

どのように考えればよいでしょうか? 複素数は a + biです。aとbはそれぞれ実数、iは虚数単位で2乗すると-1になる数です。まずはx^2 – 2x + 4に x = a + bi を代入して計算してみましょう。

x^2 – 2x + 4 = (a + bi)^2 – 2(a + bi) + 4
これを実部と虚部にわけて整理すると (a^2 – b^2 – 2a + 4) + (2ab – 2b)i となります。

f(x)が実数になる場合とはiの係数 2ab – 2b が0になる場合です。
2ab – 2b = 0 の両辺を2で割って因数分解すると b(a – 1) = 0 です。b = 0 または a = 1のときf(x)は実数になるのです。

b = 0とはxが実数なのでf(x)も実数になるのは当たり前だと言われれば当たり前です。重要なのはもうひとつのケース、すなわち実部が1の場合は虚部が何であってもf(x)は実数になるということです。

a^2 – b^2 – 2a + 4 に a = 1 を代入してみましょう。

a^2 – b^2 – 2a + 4 = 1^2 – b^2 – 2 + 4 = – b^2 + 3

実数解が存在しなくても0との交点は存在する?

さきほどの3次元座標でグラフを書くと以下のようになります。

これではよくわからないので別の角度から見てみます。

x軸方向からみると(この方向からだとx軸が見えない)、立体感がないかわりにf(x) = 0になる複素数 1 + bi が2つあるということが視覚的にはっきりします。

まとめるとf(x) = x^2 – 2x + 4が実数になる場合に限定して3次元グラフを書くと放物線がふたつできることになります。

グラフを見ることができるページをつくったのでマウスをドラッグしていろいろな角度から眺めてみてください。

Three.jsで3次元グラフを書いてみる

JavaScriptのコードも書いておきます。

HTML部分

HTML部分を示します。canvasと方程式の解に相当する座標が表示されるテキストフィールドを2つ用意します。カメラを移動させることで交点のスクリーン座標が変わるので、そのつどテキストフィールドの位置を変更します。

style.css

グローバル変数と定数

JavaScript部分を示します。

グローバル変数と定数を示します。

index.js

ページが読み込まれたときの処理

ページが読み込まれたときの処理を示します。

矢印をシーンに追加する

XYZ軸となる矢印をシーンに追加する処理を示します。

曲線をシーンに追加する

2本のグラフの曲線をシーンに追加する処理を示します。

球体を追加する

座標(1, 0, √3)と(1, 0, -√3)に球体を追加する処理を示します。

レンダリング

レンダリングをする処理を示します。isAutoRotationフラグがtrueのときはカメラは自動で原点の周りを回転します。

ボタンをクリックしたら自動回転を開始したり停止する処理をおこないます。

グラフとY = 0の交点に’1+√3 i’と’1-√3 i’の文字列を表示させたいのですが、カメラの位置が変更されると表示する座標を変えなければなりません。showTextFields関数は交点のスクリーン座標を取得してテキストフィールドを適切な位置に移動させます。

3Dオブジェクトのスクリーン座標を取得する