本記事では、楕円の半径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):
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)
C = 4 * self.a * special.ellipe(e_sq)
return C
def calc_circumference_of_circle(self):
return 2 * self.a * np.pi
def calc_circumference(self):
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):
if self.a == self.b:
return self.calc_area_of_circle()
else:
return self.calc_area_of_ellipse()
def main():
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):
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)
C = 4 * self.a * special.ellipe(e_sq)
return C
def calc_circumference_of_circle(self):
return 2 * self.a * np.pi
def calc_circumference(self):
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):
if self.a == self.b:
return self.calc_area_of_circle()
else:
return self.calc_area_of_ellipse()
def main():
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)
output_file = 'output.csv'
df.to_csv(output_file, index=False)
if __name__ == "__main__":
main()
以上
<広告>
リンク
リンク