Unityと物理・数学の話

UnityやPython、天文関連、物理学、生物学を中心に更新していく予定です。塾講師、家庭教師の仕事をやっているのでお仕事の依頼はコメントにて承っております。当面はUnityをPythonで動かすのを試行錯誤しています。

pythonで東大数学2016第4問を解いてみた

今回は,以下の記事に触発されて,pythonで東大数学2016を解くというのを遂にやってみようと思います。ここで挙げられているのは東大数学文系第1問ですね。今回は理系第4問を解いてみようと思います。

qiita.com

東大数学は条件設定が細かく大変な場合が多いのですが,pythonでそのような設定が可能なのでしょうか。工夫が必要そうです。

今回は複素数についての問題を解いてみますが,それもpythonでできるのでしょうか。まあできなければそのときということで,やってみましょう。

 

理系 第4問

 z複素数とする。複素数平面上の3点A(1),B(z),C(z^2)が鋭角三角形をなすようなzの範囲を求め、図示せよ。

うまく条件設定ができればsympyでも解けそう。解答は以下の鉄緑会東大数学問題集を参考にしました。

2018年度用 鉄緑会東大数学問題集 資料・問題篇/解答篇 2008-2017

2018年度用 鉄緑会東大数学問題集 資料・問題篇/解答篇 2008-2017

 

  

すぐにわかることは自分でやってしまって,面倒なところはpythonに任せるようにしちゃいましょう。

数学的な処理

△ABCが 鋭角三角形という条件を,A,B,Cが直線上にないことから

  \frac{z^2 - 1}{z - 1} が虚数\Leftrightarrow \\(z\neq1)かつ(z + 1は虚数)\\\therefore zは虚数

△ABCが鋭角三角形になるということは

\begin{equation}∠CABが鋭角 ①\\∠ABCが鋭角 ②\\∠BCAが鋭角 ③\end{equation}

となります。これをpythonに打ち込んでいきましょう。

pythonでうまい解き方が思い浮かばなかったのでほとんど受験数学の記事みたいになってしまいそうです。ごめんなさい(__)

① \Leftrightarrow -\frac{\pi}{2} < arg \frac{z^2 -1}{z - 1}< \frac{\pi}{2}

 \Leftrightarrow Re\frac{z^2 -1}{z - 1}>0

 \Leftrightarrow Re z>  -1

同様にして,

② \Leftrightarrow Re\frac{z^2 - z}{1 - z}>0 \Leftrightarrow Re(-z)<0 \Leftrightarrow Re z<0

③ \Leftrightarrow Re\frac{1-z^2}{z - z^2} >0 \Leftrightarrow Re\frac{1+z}{z} >0 \Leftrightarrow Re(1+\frac{1}{z}) >0 \Leftrightarrow Re\frac{\overline{z}}{|z|^2}>-1 \Leftrightarrow Re \overline{z}>-|z|^2

 ここからならできると思います。不安。

 要は領域がx,y座標にプロットされるのがゴールなので,x,yを定義してしまいましょう。

 ①②までは簡単なことですが,ベクトルに落とし込んでsympyで出力させる形を取りました。 

pythonによる数学的な処理

>>> x,y = sy.symbols('x y')
>>> z = sy.Matrix([x, y])
>>> P = sy.Matrix([1, 0])
>>> sy.simplify((z).dot(P) > -1)
x > -1
>>> sy.simplify((z).dot(P) < 0)
x < 0

問題は③です。sympyで複素数の絶対値ってどうやって表現するの。

 numpyだったら絶対値がnumpy.abs(z)で計算できるみたいなんですが,ここはそのままsympyの複素数計算で乗り切ろうと思います。(無理でした。) 

>>> Q = sy.Matrix([x, -y])
>>> sy.simplify(Q.dot(P)>-z.dot(z))
x > -x**2 - y**2

領域の作成

結局,表現するべき領域は,

-1 \lt x \lt 0, かつ x^2 + x + y^2 \gt 0

なので,書くべき領域はほんとに簡単なものなんですね。 

これ,やってみたところ,陰関数の領域の該当範囲に色を付けてplotさせることはsympyにより可能ですが,その他の領域を同時に色付けする方法がsympyにより可能であるかが分かりませんでした。

今度は,matplotlibによっては複数の領域の色付けが可能みたいですが,-1<x<0の領域の表現方法が分かりませんでした。

結論として,matplotlibにより,-1<x<0をtestxとtestyの領域に含まれるようにグラフの表示領域を設定して,解答となるグラフを得ることができました。


import matplotlib import matplotlib.pyplot as plt def main(): fig = plt.figure() ax = fig.add_subplot(111) testx = [-1,-1,0,0] testy = [-5,5,5,-5] plt.fill(testx,testy,color='r') circle = plt.Circle((-0.5,0),0.5,fc='w') ax.add_patch(circle) ax.set_aspect('equal') plt.xlim([-2,1.5]) plt.ylim([-1,1]) plt.show() if __name__ == '__main__': main()

 

f:id:unitypy:20171229124224p:plain

東大理系数学2016第4問解答図

解答となる図が得られていますね。今回はほとんど複素数で計算するということをできていないので,細かいところもpythonにやらせるための方法を勉強していく必要がありそうです。

それでは。  

参考サイト

以下,参考サイトたちです。

実ベクトルで考える複素ベクトル - Qiita

2016年東大数学をPythonで解く - Qiita
2017年早稲田数学をPythonで解く - Qiita

python for scientist: 複素数

プロットを利用する — 読書ノート v1.4.0dev

SymPyを使ってみる - 車輪を再発明

Matplotlibで円や長方形などの図形を描画 | Python / note.nkmk.me

patches — Matplotlib 2.1.1 documentation

Pythonで数学の勉強:matplotlibでsympy(scipy)のグラフを描く - Qiita

matplotlibで領域の図示 - 気ままに宙をみる

WindowsでPythonの環境構築 - レンガ積みのブログ

Visual Studio CodeをPythonの開発環境として使ってみる - デジタル・デザイン・ラボラトリーな日々