pythonで”デカルトの正葉線”を書いてみた
お久しぶりです()
前回の記事が9月なのでもう半年たちます。
私はというと、無事東京大学理科一類二年に進級することができました〜 <👏👏
Aセメスターの授業の振り返りとかやってみたいですね、また別の記事でやります(本当は2月頭の時点でやるべき)
今日の内容は陰関数のグラフをpythonで書いてみようという話です。
そこで槍玉に上がったのがデカルトの正葉線というやつ。以下のような陰関数のグラフです。
$$x^3 + y^3 = 3xy$$
なおパソコンについてたソフトで書くとこんな感じです
これ、$y =$の形で表そうとしたら $y$ の三次方程式 $y^3 - 3xy +x^3 = 0$ の解になるんですが、この解を微分して調べて、その後pythonで計算させてグラフを描かせました。
微分を使った考察
この関数はどこかで多価関数になるので、まず自分で
上の方程式を微分してみて考察した。
$$f(y) = y^3 - 3xy +x^3$$
とおくと
$$f'(y) = 3y^2 -3x$$
で、以下の3通りの場合がある。
(1) $x \leq 0$ のとき $f'(y) \geq 0$より$f(y)$は単調増加。
(2) $0 < x \leq 4^\frac{1}{3}$ のとき $f(y) = 0$ は解を3つ( $x =4^\frac{1}{3}$ のときは2つ)持つ。
(3) $x > 4^\frac{1}{3}$ のとき$f(y) = 0$ は解をただ1つ持つ。
アルゴリズム
$x$ を離散的な値に固定し、$y$ の三次方程式を近似的に解いて逐一値を配列に格納し、最後にプロットする。
具体的には、$-2.5 \leq x < 2.5$ の区間を $N$ 等分して( $N$ はあとでいろいろ変える)、そのそれぞれの値について次のアルゴリズムを用いて $y$ を求めた。ステップ数は100(これは適当)
(1)の場合→ $y = 0$ を初期値としニュートン法を用いた。
(2)の場合
→一番小さい $y$ の値は $y = -\sqrt{x} - 1$ を初期値とするニュートン法
真ん中の値は $y = \pm \sqrt{x}$ を初期値とする二分法
一番大きい値は $y = \sqrt{x} + 1$ を初期値とするニュートン法
を用いた。
(3)の場合→ $y = -\sqrt{x} - 1$ を初期値とするニュートン法を用いた。
真ん中の解だけはニュートン法での初期値を設定するのがめんどくさかったため二分法を用いた。
値の格納が一番苦労した。その話は最後に。
実装
ソースコードは載せるの恥ずかしいごちゃごちゃなやつなんで許してください、、、
結果はこんな感じ
$N = 1000$ だとつなぎ目が不自然になってしまってるが、$N = 10000$ だと綺麗に書くことができた。
色が変わってるのは、多価関数ゆえ配列を複数使ったことを示したかったためだ。
青→$x \leq 4^\frac{1}{3}$ を満たす配列に、(1)の $y$ の値と (2) の真ん中の値の入った配列が対応
橙→$0 < x \leq 4^\frac{1}{3}$ を満たす配列に、(2) の小さい方のの値の入った配列が対応
緑→$0 < x \leq 4^\frac{1}{3}$ を満たす配列に、(2) の大きい方のの値の入った配列が対応
赤→$x > 4^\frac{1}{3}$ を満たす配列に、(3) の値の入った配列が対応
最初違う配列の取り方でやったら途中でガタッとなる不連続なグラフが表示されてだるかった。
(今気づいたんだけどこのグラフの "y=x" 対称性を使えば配列の組が2個で済むじゃん、、、)