ランダム係数2次方程式の自動生成

ランダム係数2次方程式の自動生成

 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())
\[\begin{align*}&x^{2} + 2 x + 3\\[6pt]
&\left ( x^{2} + 2 x + 3 = 0, \quad \left [ -1 - \sqrt{2} i, \quad -1 + \sqrt{2} i\right ]\right )\end{align*}\]

 

カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)

新品価格
¥1,296から
(2019/8/21 23:40時点)

ランダム係数二次関数クラス

 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())
\[\begin{align*}&4 x^{2} + 2 x + 10\\[6pt]
&\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*}\]