Python 楕円の周の長さと面積を求める「scipy」

 本記事では、楕円の半径A, Bの値を用いて、楕円の周の長さと面積を求める雛形コードを載せました。
 下図は本プログラムの実行例です。A, Bに5, 3の場合に、楕円の周の長さは25.53, 楕円の面積は47.12との結果を表示しています。

■本プログラム

 クラスを用いて記述しています。入力値A,Bの大小関係は通常A>BであるのをA<Bでもインスタンス生成時に内部処理で置換して対応しています。A=Bの場合は楕円でなくて円として計算処理を進めます。そして、周の長さと面積を計算するのはメソッドで実行する仕組みにしています。

import numpy as np
from scipy import special

class EllipseCircumferenceCalculator:
    # 初期化
    def __init__(self, a, b):
        # 大きい値をa, 小さい値をbにする
        self.a, self.b = max(a, b), min(a, b)

    # 楕円の周の長さを計算
    def calc_circumference_of_ellipse(self):
        e_sq = 1.0 - (self.b**2 / self.a**2)  # 離心率の2乗
        C = 4 * self.a * special.ellipe(e_sq)  # scipyによる楕円の周の長さを計算する
        return C

    # 円周の長さを計算
    def calc_circumference_of_circle(self):
        return 2 * self.a * np.pi

    # 楕円もしくは円の周の長さを計算して値を返す
    def calc_circumference(self):
        # 入力a, bの大小関係によって場合分け
        if self.a == self.b:
            return self.calc_circumference_of_circle()
        else:
            return self.calc_circumference_of_ellipse()

    # 楕円の面積を計算
    def calc_area_of_ellipse(self):
        return np.pi * self.a * self.b

    # 円の面積を計算
    def calc_area_of_circle(self):
        return np.pi * self.a**2

    # 楕円もしくは円の面積計算を実行して、その値を返す
    def calc_area(self):
        # 入力a, bの大小関係によって場合分け
        if self.a == self.b:
            return self.calc_area_of_circle()
        else:
            return self.calc_area_of_ellipse()

def main():
    # 楕円の長軸と短軸の半径を指定(A, Bの大小関係逆でも可。A=Bの場合は円周を計算します)
    A = 5
    B = 3

    # インスタンスの生成
    my_ellipse = EllipseCircumferenceCalculator(A, B)

    # 計算の実行(周の長さ)
    val_circumference = my_ellipse.calc_circumference()

    # 計算の実行(面積)
    val_area = my_ellipse.calc_area()

    # 結果を表示
    print(f"楕円の半径(A, B)= ({A}, {B})")
    print("周の長さ:", round(val_circumference, 2))
    print("面積:", round(val_area, 2))

if __name__ == "__main__":
    main()

 次に、下図左のように複数の楕円形状の半径A, Bデータがcsvファイルにある場合、楕円の周の長さと面積を計算する雛形コードについて追記します。計算結果は下図右のように、列名「circumference」, 「area」に入力して、csvファイルに出力する仕様です。上記コードとの違いは、main関数部分です。

import pandas as pd
import numpy as np
from scipy import special

class EllipseCircumferenceCalculator:
    # 初期化
    def __init__(self, a, b):
        # 大きい値をa, 小さい値をbにする
        self.a, self.b = max(a, b), min(a, b)

    # 楕円の周の長さを計算
    def calc_circumference_of_ellipse(self):
        e_sq = 1.0 - (self.b**2 / self.a**2)  # 離心率の2乗
        C = 4 * self.a * special.ellipe(e_sq)  # scipyによる楕円の周の長さを計算する
        return C

    # 円周の長さを計算
    def calc_circumference_of_circle(self):
        return 2 * self.a * np.pi

    # 楕円もしくは円の周の長さ計算を実行して、その値を返す
    def calc_circumference(self):
        # 入力a, bの大小関係によって場合分け
        if self.a == self.b:
            return self.calc_circumference_of_circle()
        else:
            return self.calc_circumference_of_ellipse()

    # 楕円の面積を計算
    def calc_area_of_ellipse(self):
        return np.pi * self.a * self.b

    # 円の面積を計算
    def calc_area_of_circle(self):
        return np.pi * self.a**2

    # 楕円もしくは円の面積計算を実行して、その値を返す
    def calc_area(self):
        # 入力a, bの大小関係によって場合分け
        if self.a == self.b:
            return self.calc_area_of_circle()
        else:
            return self.calc_area_of_ellipse()


def main():
    # csvファイルを読み込む
    input_file = 'input.csv'
    df = pd.read_csv(input_file)
    
    df['circumference'] = df.apply(
        lambda row: EllipseCircumferenceCalculator(a=row['A'], b=row['B']).calc_circumference(), axis=1)
    df['area'] = df.apply(
        lambda row: EllipseCircumferenceCalculator(a=row['A'], b=row['B']).calc_area(), axis=1)

    # 新しいCSVファイルに書き込む
    output_file = 'output.csv'
    df.to_csv(output_file, index=False)

if __name__ == "__main__":
    main()

以上

<広告>