SymPy を活用したサンプルコードを作っておきました。後半に紹介する Rquadratic() は 2次方程式などを自動的に作成するクラスなので、数学の試験問題作成などに役立ててください。
有理係数二次関数クラス
Quadraticクラスは有理係数 2次関数 $ax^2+bx+c$ をデータ属性にもつインスタンスを生成します。各種のメソッドによって x に値を代入したり、頂点の座標や 2次方程式 $ax^2+bx+c=0$ の解を求めることができます。
# Quadraticクラスの定義
import sympy
class Quadratic:
def __init__(self, a, b, c):
# 記号xを定義
sympy.var('x')
# a, b, c を有理数型に変換
self.a = sympy.Rational(a)
self.b = sympy.Rational(b)
self.c = sympy.Rational(c)
# 2次関数の表式
self.exps = self.a*x**2 + self.b*x + self.c
# 2次関数の値を返すメソッド
def value(self, t):
return self.exps.subs(x, t)
# 頂点の座標を返すメソッド
def vertex(self):
xv = -self.b / (2*self.a)
yv = (-self.b**2 + 4*self.a*self.c)/(4*self.a)
return(xv, yv)
# 2次方程式と解を返すメソッド
def equation(self):
eq = sympy.Eq(self.exps, 0)
return [eq, sympy.solve(eq)]
Quadratic(a, b, c) は 2次関数オブジェクト $ax^2+bx+c$ を生成します。
渡された係数 a, b, c は sympy.Rational() によってすべて有理数型に変換されます(たとえば 1.5 は 3/2 に変換されます)。
Quadratic.value(p) は 2次関数オブジェクトの記号 x に p の値を代入した結果を返します。
Quadratic.vertex() は 2次関数の頂点の座標をタプルで返します。
Quadratic.equation() は 2次方程式 $ax^2+bx+c=0$ の表式と解をタプルで返します。解はタプルの中にリスト形式で収められています。
以下に Quadraticクラスの使用例を載せておきます。
# Quadraticクラスの使用例
# Quadraticクラスのインスタンスを生成
y = Quadratic(1, 2, 3)
# 2次関数 x**2 + 2*x + 3
print(y.exps)
# 頂点の座標
print(y.vertex())
# x**2 + 2*x + 3 = 0 と解の表示
print(y.equation())
x**2 + 2*x + 3 (-1, 2) (Eq(x**2 + 2*x + 3, 0), [-1 - sqrt(2)*I, -1 + sqrt(2)*I])
Jupyter Notebook で実行する場合は、以下のコードを入力すると結果が LaTeX 数式で表示されます (display() は Jupyter Notebook の関数です)。
sympy.init_printing()
# Quadraticクラスのの使用例
# Jupyter Notebook LaTeX表示バージョン
# Quadraticクラスのインスタンスを生成
y = Quadratic(1, 2, 3)
# 2次関数 x**2 + 2*x + 3
display(y.exps)
# x**2 + 2*x + 3 = 0 と解の表示
display(y.equation())
&\left ( x^{2} + 2 x + 3 = 0, \quad \left [ -1 - \sqrt{2} i, \quad -1 + \sqrt{2} i\right ]\right )\end{align*}\]
Pythonデータサイエンスハンドブック ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習 新品価格 | ![]() |

ランダム係数二次関数クラス
Rquadraticクラスは Quadratic のサブクラスです。その機能のほとんどを Quadratic から継承していますが、係数 $a,\ b,\ c$ はランダムに決定される整数です。
# Rquadraticクラスの定義
# Quadraticクラスの継承
class Rquadratic(Quadratic):
# 初期化メソッドのオーバーライド
def __init__(self, k):
import random
# 記号xを定義
sympy.var('x')
# 係数をランダムに決定
self.a = random.randint(1, k)
self.b = random.randint(1, k)
self.c = random.randint(1, k)
# 2次関数の表式
self.exps = self.a*x**2 + self.b*x + self.c
Rquadratic(k) はランダムな整数係数をもつ 2次関数オブジェクトを生成します。引数 k は各係数の上限値です。
Rquadratic.value(p) は 2次関数オブジェクトの記号 x に p の値を代入した結果を返します。
Rquadratic.vertex() は 2次関数の頂点の座標をタプルで返します。
Rquadratic.equation() は 2次方程式 $ax^2+bx+c=0$ の表式と解をタプルで返します。解はタプルの中にリスト形式で収められます。
以下に Rquadraticクラスの使用例を載せておきます。
# Rquadraticクラスの使用例
# Rquadraticクラスのインスタンスを生成
# 係数の上限値は10
y = Rquadratic(10)
# ランダム係数の2次関数f(x)
print(y.exps)
# f(x) = 0 と解の表示
print(y.equation())
4*x**2 + 4*x + 5 (Eq(4*x**2 + 4*x + 5, 0), [-1/2 - I, -1/2 + I])
# Rquadraticクラスの使用例
# Jupyter Notebook LaTeX表示バージョン
sympy.init_printing()
# Rquadraticクラスのインスタンスを生成
# 係数の上限値は10
y = Rquadratic(10)
# ランダム係数の2次関数f(x)
display(y.exps)
# f(x) = 0 と解の表示
display(y.equation())
&\left ( 4 x^{2} + 2 x + 10 = 0, \quad \left [ - \frac{1}{4} - \frac{\sqrt{39} i}{4}, \quad - \frac{1}{4} + \frac{\sqrt{39} i}{4}\right ]\right )\end{align*}\]
コメントを書く