ランダム係数二次方程式
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())
&\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]
コメント
下記は誤植と思われますので、ご確認ください。
「Quadraticクラスの定義」プログラムで、return [eq, sympy.solve(eq)] → return (eq, sympy.solve(eq))
修正しました。
ありがとうございます。m(_ _)m
【お知らせ】二次方程式を生成する Rquadratic クラスの定義文を見直してみると、無作為に定まる係数が正の値しかとれないことに気づいたので修正しました。修正された Rquadratic() のコンストラクタの引数 abc_range に、タプルやリストで (-3, 5) や [-3, 5] のように指定すると、係数 a, b, c が -5 ~ 3 の範囲で生成されます。また、記事全体を見直して細かな修正をしておきました。
ChatGPTにも二次方程式クラスを作ってもらいました。
[Q] SymPyで二次方程式a*x^2+b*x+c=0を自動生成するクラスを生成してください。ただし、係数a,b,cは-10から10の範囲でランダムに決まるものとします。
[A] 以下に、SymPyを使用して二次方程式を自動生成するクラスの例を示します。係数a、b、cは-10から10の範囲でランダムに決まるようになっています。
このクラスを実行すると、係数a、b、cがランダムに決まり、それに基づいて二次方程式が生成され、また解が計算されて表示されます。毎回異なる二次方程式とその解が生成されることになります。
[Q] SymPyで三次方程式a*x^3+b*x^2+c*x+d=0を自動生成するクラスを生成してください。ただし、係数a,b,c,dはユーザーが指定した範囲でランダムに決まるものとします。
[A] 指定した範囲内でユーザーが係数a、b、c、dを指定し、SymPyを使用して三次方程式を生成するクラスの例を以下に示します。
このクラスを使用する際には、a_range、b_range、c_range、d_rangeという変数を指定して、係数a、b、c、dの範囲を指定します。その後、クラスのインスタンスを生成し、生成された三次方程式とその解を表示します。範囲を指定することで、任意の係数範囲内でランダムな三次方程式を生成することができます。