さて、今年も受験シーズンですねーー
数学の問題をプログラムで解くという
無駄なことをやっていきたいと思います。
解説動画はこちら
2020年の数学1の問題です。
さてまず最初は
問題見るだけだと
なんだかよく分からないですよねー
まずはこの直線L君を作図してあげましょう。
そうすれば分かりやすくなるはずです。
Python言語では
数学的な作図が非常に楽です。
数式用、作図用のライブラリを
インポートします。
作図では直線を描くので
x軸、y軸の値が必要になります。
y軸の値は数式を元に生成されるので
x軸の値を適当に生成します。
numpyのlinspaceで
数値を適当に生成することができます。
aが1の時を作図してみると
傾きは右肩下がりで負の値になっています。
今度はaが8の時を試してみます。
そうすると右肩上がりで
傾きが正の値になりました。
どこかに境界線があるはずです。
aの値を複数用いて
まとめて作図してみます。
aの値を1から5までで作図すると
4の時に平行になったように見えます。
5になると正の値になっているように見えます。
と言うことで4が境界線に
なっていると言えそうです。
ただし、aの値は負の値を取ることも
考えられますので、aが負の時も
作図してみます。
aが負の場合
-2で平行になっているように見えますね。
合わせると回答すべきポイントは
アイ< a < ウなので
-2 < a < 4
と言う感じになりますね。
ただしこれだと
図からの判断なので
実際に傾きを求めてみましょう。
傾きは
にて求めることができます。
x,yの共分散は
np.cov(x,y)[0,1]
xの分散は
np.var(x)
これで求めることができます。
これでaを入れて傾きを求めてみると
はい、これで-2と4のところで
ちゃんと傾きは0で平行になっていますので
それを越えれば傾きが正になることが確認できました。
続いて
先ほどの直線Lとx軸の交点と言っているので
x軸を作図してあげれば
交点bが分かりやすくなります。
プログラム上では
単純にy=0とし、xを適当な値で結んで
直線を描けばx軸になります。
はい、赤線と青線の交わる部分が交点bですねー
さてaが変われば傾きが変わり
交わる部分も変わってくるのですが
求めたい交点bについては
yの値は0なのでxの値を求めてあげれば
良いと言うことになります。
と言うことで
直線の式を変形して
xの値を求めてみましょう。
式を変形すると
xの値をすぐに求めることができますね。
aを変えてxを求めてみましょう。
まずは a > 0 の場合
これでみると4のところが無くて
5から負の値になっていますね。
4の値をもう少し細かく見てみましょう。
と言うことで4を越えると
xが0未満になり成立しません。
a > 0 の場合、b > 0となるのは エ < a < オ
なので
答えは
0 < a < 4
ですね。
a<=0の場合は
-2で負の値に切り替わりますね。
-2付近を細かく見ると
はい、これで-2を界に
負の値になることが確認できたので
a <= 0 の場合、b > 0となるのは a < カキ
a < -2
となりました。
ふう
普通に問題を解くのに比べて
3倍ほどは時間がかかるんじゃないでしょうかね
このように
無駄なコードを書くことで
プログラミングを上達させることが
できるかもしれません。
お暇であれば試してみるのもいかがでしょうか?
今回はこれまでです。
それでは
数学の問題をプログラムで解くという
無駄なことをやっていきたいと思います。
解説動画はこちら
2020年の数学1の問題です。
さてまず最初は
問題見るだけだと
なんだかよく分からないですよねー
まずはこの直線L君を作図してあげましょう。
そうすれば分かりやすくなるはずです。
Python言語では
数学的な作図が非常に楽です。
数式用、作図用のライブラリを
インポートします。
import numpy as np import warnings import matplotlib.pyplot as plt warnings.simplefilter('ignore') %matplotlib inline
作図では直線を描くので
x軸、y軸の値が必要になります。
y軸の値は数式を元に生成されるので
x軸の値を適当に生成します。
numpyのlinspaceで
数値を適当に生成することができます。
a=1 x = np.linspace(-5, 5, 100) y = (a**2-2*a-8)*x + a plt.plot(x, y,label=str(a)) plt.legend() plt.show()
aが1の時を作図してみると
傾きは右肩下がりで負の値になっています。
今度はaが8の時を試してみます。
そうすると右肩上がりで
傾きが正の値になりました。
どこかに境界線があるはずです。
aの値を複数用いて
まとめて作図してみます。
for a in range(1,6): x = np.linspace(-5, 5, 100) y = (a**2-2*a-8)*x + a plt.plot(x, y,label=str(a)) plt.legend() plt.show()
aの値を1から5までで作図すると
4の時に平行になったように見えます。
5になると正の値になっているように見えます。
と言うことで4が境界線に
なっていると言えそうです。
ただし、aの値は負の値を取ることも
考えられますので、aが負の時も
作図してみます。
for a in range(-6,0): x = np.linspace(-5, 5, 100) y = (a**2-2*a-8)*x + a plt.plot(x, y,label=str(a)) plt.legend() plt.show()
aが負の場合
-2で平行になっているように見えますね。
合わせると回答すべきポイントは
アイ< a < ウなので
-2 < a < 4
と言う感じになりますね。
ただしこれだと
図からの判断なので
実際に傾きを求めてみましょう。
傾きは
にて求めることができます。
x,yの共分散は
np.cov(x,y)[0,1]
xの分散は
np.var(x)
これで求めることができます。
これでaを入れて傾きを求めてみると
for a in range(-5,6): x = np.linspace(-5, 5, 100) y = (a**2-2*a-8)*x + a # 傾き = x,yの共分散 / xの分散 coef = np.cov(x,y)[0,1] / np.var(x) print(a,'\t',coef)
-5 27.27272727272728 -4 16.161616161616156 -3 7.070707070707068 -2 0.0 -1 -5.050505050505051 0 -8.080808080808078 1 -9.090909090909092 2 -8.080808080808078 3 -5.050505050505051 4 0.0 5 7.070707070707068
はい、これで-2と4のところで
ちゃんと傾きは0で平行になっていますので
それを越えれば傾きが正になることが確認できました。
続いて
先ほどの直線Lとx軸の交点と言っているので
x軸を作図してあげれば
交点bが分かりやすくなります。
プログラム上では
単純にy=0とし、xを適当な値で結んで
直線を描けばx軸になります。
a=1 x = np.linspace(-5, 5, 100) y = (a**2-2*a-8)*x + a # 直線Lを作図 plt.plot(x, y,label=str(a)) # x軸を作図 plt.plot([-5,5], [0,0],c='red') plt.legend() plt.show()
はい、赤線と青線の交わる部分が交点bですねー
さてaが変われば傾きが変わり
交わる部分も変わってくるのですが
求めたい交点bについては
yの値は0なのでxの値を求めてあげれば
良いと言うことになります。
と言うことで
直線の式を変形して
xの値を求めてみましょう。
式を変形すると
y = (a**2-2*a-8)*x + a y-a = (a**2-2*a-8)*x (y-a)/(a**2-2*a-8) = x x = (y-a)/(a**2-2*a-8)y=0なので、yの部分を0に変えてあげれば
xの値をすぐに求めることができますね。
aを変えてxを求めてみましょう。
まずは a > 0 の場合
for a in range(0,11): if (a**2-2*a-8)!=0: x = (0-a)/(a**2-2*a-8) print(a,'\t',x)
0 -0.0 1 0.1111111111111111 2 0.25 3 0.6 5 -0.7142857142857143 6 -0.375 7 -0.25925925925925924 8 -0.2 9 -0.16363636363636364 10 -0.1388888888888889
これでみると4のところが無くて
5から負の値になっていますね。
4の値をもう少し細かく見てみましょう。
for a in np.linspace(3.9, 4.1, 21): if (a**2-2*a-8)!=0: x = (0-a)/(a**2-2*a-8) print('{:.03}'.format(a),'\t',x)
3.9 6.610169491525415 3.91 7.3510058281631725 3.92 8.277027027027007 3.93 9.467598169115819 3.94 11.054994388327726 3.95 13.277310924369653 3.96 16.610738255033528 3.97 22.166387493020434 3.98 33.277591973244355 3.99 66.6110183639381 4.01 -66.72212978369552 4.02 -33.38870431893784 4.03 -22.277501381979285 4.04 -16.72185430463576 4.05 -13.388429752066106 4.06 -11.166116611661277 4.07 -9.578724405742625 4.08 -8.388157894736848 4.09 -7.462141944900592 4.1 -6.721311475409841
と言うことで4を越えると
xが0未満になり成立しません。
a > 0 の場合、b > 0となるのは エ < a < オ
なので
答えは
0 < a < 4
ですね。
a<=0の場合は
for a in range(-10,0): if (a**2-2*a-8)!=0: x = (0-a)/(a**2-2*a-8) print(a,'\t',x)
-10 0.08928571428571429 -9 0.0989010989010989 -8 0.1111111111111111 -7 0.12727272727272726 -6 0.15 -5 0.18518518518518517 -4 0.25 -3 0.42857142857142855 -1 -0.2
-2で負の値に切り替わりますね。
-2付近を細かく見ると
for a in np.linspace(-3, -1, 21): if (a**2-2*a-8)!=0: x = (0-a)/(a**2-2*a-8) print('{:.03}'.format(a),'\t',x)
-3.0 0.42857142857142855 -2.9 0.466988727858293 -2.8 0.5147058823529413 -2.7 0.5756929637526651 -2.6 0.6565656565656565 -2.5 0.7692307692307693 -2.4 0.9375000000000004 -2.3 1.2169312169312176 -2.2 1.774193548387094 -2.1 3.4426229508196755 -1.9 -3.220338983050848 -1.8 -1.551724137931033 -1.7 -0.9941520467836252 -1.6 -0.7142857142857142 -1.5 -0.5454545454545454 -1.4 -0.4320987654320987 -1.3 -0.3504043126684635 -1.2 -0.28846153846153844 -1.1 -0.2396514161220043 -1.0 -0.2
はい、これで-2を界に
負の値になることが確認できたので
a <= 0 の場合、b > 0となるのは a < カキ
a < -2
となりました。
ふう
普通に問題を解くのに比べて
3倍ほどは時間がかかるんじゃないでしょうかね
このように
無駄なコードを書くことで
プログラミングを上達させることが
できるかもしれません。
お暇であれば試してみるのもいかがでしょうか?
今回はこれまでです。
それでは