二次方程式の自動生成

二次方程式の自動生成

ランダム係数二次方程式

 SymPy を活用したサンプルコードを作っておきました。後半に紹介する Rquadratic() は二次方程式などを自動的に作成するクラスなので、数学の試験問題作成などに役立ててください。
 
 二次方程式クラス作成の準備として、有理係数二次多項式クラス (Quadratic) を定義しておきます。Quadratic は二次多項式 $ax^2+bx+c$ をデータ属性にもつインスタンスを生成します。各種のメソッドによって x に値を代入したり、頂点の座標や二次方程式 $ax^2+bx+c=0$ の解を求めることができます。

# PYTHON_QUADRATIC_EQUATION

# In[1]

import sympy

# 有利係数2次多項式クラス
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) は二次多項式オブジェクト $ax^2+bx+c$ を生成します。渡された係数 a, b, c は sympy.Rational() によってすべて有理数型に変換されます(たとえば 1.5 は 3/2 に変換されます)。

 Quadratic.value(p) は二次多項式オブジェクトの記号 x に p の値を代入した結果を返します。
 
 Quadratic.vertex() は二次関数の頂点の座標をタプルで返します。
 
 Quadratic.equation() は二次方程式 $ax^2+bx+c=0$ の表式と解をタプルで返します。解はタプルの中にリスト形式で収められています。
 
 以下に Quadraticクラスの使用例を載せておきます。

# In[2]

# Quadraticクラスのインスタンスを生成
y = Quadratic(1, 2, 3)

# 2次多項式x**2+2*x+3
print(y.exps)

# 2次関数y=x**2+2*x+3 の頂点の座標
print(y.vertex())

# 2次方程式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()

# 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*}\]

 


 それでは、ランダム係数二次方程式を生成する Rquadratic クラスを定義してみます。Rquadratic は Quadratic のサブクラスです。その機能のほとんどを Quadratic から継承していますが、係数 $a,\ b,\ c$ はランダムに決定される整数です。

# In[3]

import random

# ランダム係数2次方程式クラス
class Rquadratic(Quadratic):
    
    # 初期化メソッドのオーバーライド
    def __init__(self, abc_range):
        
        # 記号xを定義
        sympy.var('x')
        
        # 2次多項式の係数a,b,cをランダムに決定
        self.a = random.randint(abc_range[0], abc_range[1])
        self.b = random.randint(abc_range[0], abc_range[1])
        self.c = random.randint(abc_range[0], abc_range[1])
        
        # 2次多項式の表式
        self.exps = self.a*x**2 + self.b*x + self.c

 Rquadratic(abc_range) はランダムな整数係数をもつ二次多項式オブジェクトを生成します。引数 abc_range は各係数の下限値と上限値です。
 
 Rquadratic.equation() は二次方程式 $ax^2+bx+c=0$ の表式と解をタプルで返します。解はタプルの中にリスト形式で収められます。
 
 以下に Rquadraticクラスの使用例を載せておきます。

# In[4]

random.seed(0)

# Rquadraticクラスのインスタンスを生成
# 2次多項式の係数a,b,cの範囲は[-5,5]
y = Rquadratic((-5, 5))

# ランダム係数の2次多項式
print(f'2次多項式:{y.exps}')

eq, sol = y.equation()

# 2次方程式
print(f'2次方程式:{eq}')

# 2次方程式の解
print(f'2次方程式の解:{sol}')

# 2次多項式:x**2 + x - 5
# 2次方程式:Eq(x**2 + x - 5, 0)
# 2次方程式の解:[-1/2 + sqrt(21)/2, -sqrt(21)/2 - 1/2]