pythonでセンター試験解いてみた~その1~

プログラミング

こんにちは

今回は平成31年度のセンター試験(数学)を解いていきたいと思います。

pythonで計算ができるということは知っていたのですが、今まで苦手意識があって手をだしていませんでした。

しかし、いつまでもそんなこと言ってられないなと思い、今回いよいよ数学関連のモジュールに触れてみることにいたしました。

使ってみると予想通り大変でしたが、いい勉強になりました!!いまだ苦戦中ですが、とりあえずできたところだけ紹介していきたいと思います。

スポンサーリンク

準備

ぼくがセンター試験を解くに当たり準備したものは

  • センター試験過去問(平成31年版)
  • jupyternotebook

の二つです。

jupyternotebookの導入や使い方についてはこちらを参照ください。

センター試験解いてみよう!!

解く問題

解く問題は平成31年の数1Aにある第一問の(3)です。(なぜ(3)からなのかは触れないでください…ゆくゆくは(1)からやっていきたいと思います。)

ここからは問題文を引用いたします。

\(a\)と\(b\)はともに正の実数で$$y=x^2+(2a-b)x+a^2+1$$のグラフを\(G\)とする。

(1)グラフ\(G\)の頂点は$$\left(\frac{b}{[チ]}-a,-\frac{b^2}{[ツ]}+ab+[テ]\right)である。$$

(2)グラフ\(G\)点(-1,6)を通るとき、\(b\)の取りえる値の最大値は[ト]であり、そのときの\(a\)の値は[ナ]である。

\(b\)=[ト],\(a\)=[ナ]のとき、グラフ\(G\)は二次関数$$y=x^2$$のグラフをx軸方向に\(\frac{[二]}{[ヌ]}\),y軸方向に\(\frac{[ネノ]}{[ハ]}\)だけ平行移動したものである。

モジュールのインストール

(1)グラフ\(G\)の頂点は$$\left(\frac{b}{[チ]}-a,-\frac{b^2}{[ツ]}+ab+[テ]\right)である。$$

これを解いていきます。

まずsympyというモジュールをインストールしていきます。sympyとはMathmaticaのような計算がpythonでもできるようにしたものです。sympyを使ってsolve関数とEq関数もインストールします。solveは方程式を解く関数で、Eqは方程式を立てる関数です。

最後に変数を定義します。今回は x,h,k,a,b という変数を定義しました。

import sympy
from sympy import Eq 
from sympy import solve
x,h,k,a,b = sympy.symbols("x h k a b")

これですべての準備が整いました。

平方完成

では、ここから実際に問題を解いていきます。頂点の座標を求めるには

グラフGと\((x-h)^2+k\)を等しいとおいてh,kを求めればいいですね。(平方完成)

これをpythonで書くと

def exp1(x):
    return x**2+(2*a-b)*x+a**2+1
f = (x - h)**2+k

exp2 = solve(exp1(x) - f,[h,k])#平方完成
h = exp2[0][0]
k= exp2[0][1]#h,kが求まった

print("h = {} ".format(h))
print("k = {} ".format(k))

説明をすると

def exp1(x):
    return x**2+(2*a-b)*x+a**2+1
でグラフGを定義して
exp2 = solve(Eq(exp1(x),f),[h,k])
で方程式 $$x^2+(2a-b)x+a^2+1=(x-h)^2+k$$ をh,kについて解いています。

出力は

h = -a + b/2 
k = a*b - b**2/4 + 1
となり、 $$\left(\frac{b}{[2]}-a,-\frac{b^2}{[4]}+ab+[1]\right)$$ で答えに一致しました!!

最大値の計算

(2)グラフ\(G\)点(-1,6)を通るとき、\(b\)の取りえる値の最大値は[ト]であり、そのときの\(a\)の値は[ナ]である。\(b\)=[ト],\(a\)=[ナ]のとき、グラフ\(G\)は二次関数$$y=x^2$$のグラフをx軸方向に\(\frac{[二]}{[ヌ]}\),y軸方向に\(\frac{[ネノ]}{[ハ]}\)だけ平行移動したものである。

次にこの問題を解いていきます。最大値の問題ですが、(-1,6)をグラフGに代入し、bの関数から最大値を読み取ります。

f = (x - h)**2+k
g = f.subs([(x, -1)])
eq3 = Eq(g,6)
print(sympy.solve(eq3,b))

pythonで書くとこうなります。

g = f.subs([(x, -1)])
で.subs関数で\(x=-1\)を代入し、
sympy.solve(eq3,b)
で$$-6=(-1)^2+(2a-b)(-1)+a^2+1$$ をbについて解いています。

出力は

[-(a - 1)**2 + 5]
となりこの式は2次関数なので、bの最大値は5でそのときのaは1であることが分かります。

\(a\)の値は[ナ]である。\(b\)=[ト],\(a\)=[ナ]のとき、グラフ\(G\)は二次関数$$y=x^2$$のグラフをx軸方向に\(\frac{[二]}{[ヌ]}\),y軸方向に\(\frac{[ネノ]}{[ハ]}\)だけ平行移動したものである。

これはa=1,b=5を代入すれば答えが出て、

x軸方向に\(\frac{[3]}{[2]}\),y軸方向に\(\frac{[-1]}{[4]}\)が答えになります。

ここまでのコードを載せておきます。

import sympy
import numpy as np
from sympy import Eq 
from sympy import solve
x,h,k,a,b = sympy.symbols("x h k a b")

def exp1(x):
    return x**2+(2*a-b)*x+a**2+1

f = (x - h)**2+k

exp2 = solve(Eq(exp1(x),f),[h,k])#平方完成
h = exp2[0][0]
k= exp2[0][1]#h,kが求まった

print("h = {} ".format(h))
print("k = {} ".format(k))

f = (x - h)**2+k

g = f.subs([(x, -1)])
eq3 = Eq(g,6)
print(sympy.solve(eq3,b))

参考

Pythonのlambda(ラムダ式、無名関数)の使い方 | note.nkmk.me
Pythonではdef文で関数を定義するが、lambda(ラムダ式)で名前を持たない無名関数を作成することもできる。lambdaは引数として関数(呼び出し可能なオブジェクト)を指定する場合などに使うと便利。書き方および使い方を説明する。def文とlambda式の対応関係 lambda式でif文を使う PEP8ではlam...
Python, SymPyの使い方(因数分解、方程式、微分積分など) | note.nkmk.me
SymPyは代数計算(数式処理)を行うPythonのライブラリ。因数分解したり、方程式(連立方程式)を解いたり、微分積分を計算したりすることができる。公式サイト: SymPy ここでは、SymPyの基本的な使い方として、インストール 変数、式を定義: sympy.symbol() 変数に値を代入: subs()メソッド...
[SymPy] 代数方程式
Sympyを使うと代数方程式を解くことができます。この記事ではsympy.solve( )関数の基本的な使い方を解説し、応用として5次の円分方程式を解いてみます。
404 Not Found - Qiita - Qiita

コメント

  1. […] 平成31年の数1Aにある第一問の(3) […]

タイトルとURLをコピーしました