【Python】 2次関数 任意の3点から2次関数を求めてグラフに図示

■2次関数

a > 0 の時、グラフは下に凸(とつ)

a < 0 の時、グラフは上に凸(とつ)

■任意の3点から2次関数を算出

任意の3点:
A (x1, y1)
B (x2, y2)
C (x3, y3)

3元1次連立方程式をNumpyを使って解く。

3点をそれぞれ計算したものを行列で示す。

pythonで上記(a, b, c)を求める場合はnumpy.linalgのsolveを使うことで算出可能

import numpy as np
from numpy.linalg import solve

# 各要素を配列に格納
equation1 = np.array([[x1 ** 2, x1, 1], [x2 ** 2, x2, 1], [x3 ** 2, x3, 1]])
equation2 = np.array([y1, y2, y3])

# a, b, cが配列で算出される
ans = solve(equation1, equation2)

■例題

任意の3点A(1, 4), B(-2, 10), C(3, 10)を通る2次関数を求め、グラフに図示

■サンプルコード

# -*- Coding:UTF-8 -*-
import numpy as np
from numpy.linalg import solve
from matplotlib import pyplot as plt

# 任意の3点から2次関数を決定する関数
# 引数     :任意の3点A(x1, y1), B(x2, y2), C(x3, y3)
# 戻り値   :y = ax **2 + bx + c の [a, b, c]
def DecisionQuadraticFunc(x1:int, y1:int, x2:int, y2:int, x3:int, y3:int) -> list:
    # 3元1次連立方程式を解く
    left_equation = np.array([[x1 ** 2, x1, 1], [x2 ** 2, x2, 1], [x3 ** 2, x3, 1]])
    right_equation = np.array([y1, y2, y3])

    result_data = solve(left_equation, right_equation)

    return result_data

# グラフを作成する関数
def MakeGraph(result_data:list, x1:int, y1:int, x2:int, y2:int, x3:int, y3:int) -> None:

    # 初期値をセット
    a = result_data[0]
    b = result_data[1]
    c = result_data[2]

    ########## 2次関数をグラフに図示 ##########
    # 2次関数のxを便宜上、0.1間隔で -3 < x < 4 の範囲を指定
    xmin = -3
    xmax = 4
    xinterval = 0.1
    x = np.arange(xmin, xmax, xinterval)

    # yを算出
    y = a * (x ** 2) + b * x + c

    # グラフを作成
    plt.plot(x,y)
    ########################################

    ########## グラフにx軸,y軸から点Aまでを点線で図示 ##########
    # 補助線を点線で作成 [hlines:水平 vlines:垂直]
    plt.hlines([y1], 0, x1, "gray", linestyles='dashed')
    plt.vlines([x1], 0, y1, "gray", linestyles='dashed')
    #######################################################

    ########## グラフにx軸,y軸から点Bまでを点線で図示 ##########
    # 補助線を点線で作成 [hlines:水平 vlines:垂直]
    plt.hlines([y2], 0, x2, "gray", linestyles='dashed')
    plt.vlines([x2], 0, y2, "gray", linestyles='dashed')
    #######################################################

    ########## グラフにx軸,y軸から点Cまでを点線で図示 ##########
    # 補助線を点線で作成 [hlines:水平 vlines:垂直]
    plt.hlines([y3], 0, x3, "gray", linestyles='dashed')
    plt.vlines([x3], 0, y3, "gray", linestyles='dashed')
    #######################################################


    ########## グラフにx軸,y軸(0)を図示 ##########
    # 補助線(0)を作成 [axhline:水平 axvline:垂直]
    plt.axhline(y = 0, color = "gray")
    plt.axvline(x = 0, color = "gray")
    ############################################

    # グラフを表示
    plt.show()


# メイン処理
if __name__ == '__main__':
    # A(1, 4), B(-2, 10), C(3, 10)
    x1 = 1
    y1 = 4
    x2 = -2
    y2 = 10
    x3 = 3
    y3 = 10


    # x任意の3点から二次関数を求める
    result_data = DecisionQuadraticFunc(x1, y1, x2, y2, x3, y3)


    print('二次関数:y = '+ str(result_data[0]) + 'x**2 + (' \
                        + str(result_data[1]) + ')x + (' \
                        + str(result_data[2]) + ')')

    # グラフの作成
    MakeGraph(result_data, x1, y1, x2, y2, x3, y3)

■実行結果

二次関数:y = 1.0x**2 + (-1.0)x + (4.0)

コメント