楕円弧の長さは級数解や台形公式による数値積分によっても計算できますが 処理速度を考えると ガウス-ルジャンドルあるいは春日屋の方法が適しています。
楕円弧の長さは
で計算できます。
楕円弧の長さは 楕円の長径×第2種楕円積分 で与えられることがわかります。第2種楕円積分は楕円弧の円周率πのようなものだと考えれば受け入れやすいと思います。
wikipedia 楕円積分によれば、ルジャンドル標準形の楕円積分になります。数式処理ソフト maxima の組込関数はこの形式が採用されています。
※参考文献
○楕円弧の長さの計算式は、応用数学 第4巻 建築構造講座 コロナ社
○Gaussの求積法は、解析概論[改訂第三版] 岩波書店
○Legendreの多項式は、自然科学者のための数学概論[増訂版] 岩波書店
○平均値法は、次元解析・最小2乗法と実験式 応用数学講座 第5巻 コロナ社 本間 仁・春日屋伸昌 共著
楕円弧の長さの計算で使うのは 第二種不完全楕円積分と第二種完全楕円積分です。不完全と完全の違いは積分区間だけなので、本稿ではまとめて第2種楕円積分としています。
第一種不完全楕円積分
elliptic_f (phi, m)
定義
integrate(1/sqrt(1 - m*sin(x)^2), x, 0, phi)
第二種不完全楕円積分
elliptic_e (phi, m)
定義
integrate(sqrt(1 - m*sin(x)^2), x, 0, phi)
第三種不完全楕円積分
elliptic_pi (n, phi, m)
定義
integrate(1/(1-n*sin(x)^2)/sqrt(1 - m*sin(x)^2), x, 0, phi)
第一種完全楕円積分
elliptic_kc (m)
定義
integrate(1/sqrt(1 - m*sin(x)^2), x, 0, %pi/2)
第二種完全楕円積分
elliptic_ec (m)
定義
integrate(sqrt(1 - m*sin(x)^2), x, 0, %pi/2)
ただし
phi ルジャンドルの標準形のφ
w = b / a, w <= 1 扁平比
k = sqrt(1 - w ^ 2) 離心率、母数(modulus)
m = k ^ 2 = 1 - w ^ 2
n 特性(characteristic)
maxima の楕円積分関数で楕円弧の長さを計算した例です。プログラムを 200-4-1.bat で保存して実行すると
:楕円弧の長さ(楕円積分)
@echo off
path C:\maxima-5.47.0\bin;%path%
ruby -x %~f0
pause
goto:eof
#!ruby
f = open("| maxima --very-quiet", "w")
f.print <<~Maxima
[a, b, p1, p2] : [1, 0.5, -30, 120]$
w : b / a$
p3 : (90 + p1) * %pi / 180$
p2 : (p2 - 90) * %pi / 180$
print("[a, b, p1, p2, p3] =", [a, b, p1 * %pi / 180, p2, p3])$
print("w =", float(w))$
ec : elliptic_ec(1 - w ^ 2)$ /* 第2種完全楕円積分 */
print("s = a * ec = a * elliptic_ec(1 - w ^ 2) =", float(a * ec))$
s3 : a * elliptic_e(p3, 1 - w ^ 2)$
print("s3 = a * elliptic_e(p3, 1 - w ^ 2) =", float(s3))$
s1 : 2 * a * ec - s3$
print("s1 = 2 * a * ec - s3 =", float(s1))$
s2 : a * elliptic_e(p2, 1 - w ^ 2)$
print("s2 = a * elliptic_e(p2, 1 - w ^ 2) =", float(s2))$
print("s1 + s2 =", float(s1 + s2))$
quit()$
Maxima
f.close
__END__
計算結果は
となります。
maxima の楕円積分関数は 楕円弧の長さの計算の答え合わせに使えます。
次回は 台形積分 を取り上げます。