pythonで東大数学2016第4問を解いてみた
今回は,以下の記事に触発されて,pythonで東大数学2016を解くというのを遂にやってみようと思います。ここで挙げられているのは東大数学文系第1問ですね。今回は理系第4問を解いてみようと思います。
東大数学は条件設定が細かく大変な場合が多いのですが,pythonでそのような設定が可能なのでしょうか。工夫が必要そうです。
今回は複素数についての問題を解いてみますが,それもpythonでできるのでしょうか。まあできなければそのときということで,やってみましょう。
うまく条件設定ができればsympyでも解けそう。解答は以下の鉄緑会東大数学問題集を参考にしました。
2018年度用 鉄緑会東大数学問題集 資料・問題篇/解答篇 2008-2017
- 作者: 鉄緑会数学科
- 出版社/メーカー: KADOKAWA
- 発売日: 2017/07/15
- メディア: 単行本
- この商品を含むブログを見る
すぐにわかることは自分でやってしまって,面倒なところはpythonに任せるようにしちゃいましょう。
数学的な処理
△ABCが 鋭角三角形という条件を,A,B,Cが直線上にないことから
△ABCが鋭角三角形になるということは
となります。これをpythonに打ち込んでいきましょう。
pythonでうまい解き方が思い浮かばなかったのでほとんど受験数学の記事みたいになってしまいそうです。ごめんなさい(__)
<<
>
>
同様にして,
><<
>>>>>
ここからならできると思います。不安。
要は領域が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
領域の作成
結局,表現するべき領域は,
なので,書くべき領域はほんとに簡単なものなんですね。
これ,やってみたところ,陰関数の領域の該当範囲に色を付けて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()
解答となる図が得られていますね。今回はほとんど複素数で計算するということをできていないので,細かいところもpythonにやらせるための方法を勉強していく必要がありそうです。
それでは。
参考サイト
以下,参考サイトたちです。
2016年東大数学をPythonで解く - Qiita
2017年早稲田数学をPythonで解く - Qiita
Matplotlibで円や長方形などの図形を描画 | Python / note.nkmk.me
patches — Matplotlib 2.1.1 documentation
Pythonで数学の勉強:matplotlibでsympy(scipy)のグラフを描く - Qiita
WindowsでPythonの環境構築 - レンガ積みのブログ
Visual Studio CodeをPythonの開発環境として使ってみる - デジタル・デザイン・ラボラトリーな日々