小智 6
根据拉马努金求椭圆周长的第一个近似公式 ->
>>> import math
>>>
>>> def calculate_perimeter(a,b):
... perimeter = math.pi * ( 3*(a+b) - math.sqrt( (3*a + b) * (a + 3*b) ) )
... return perimeter
...
>>> calculate_perimeter(2,3)
15.865437575563961
Run Code Online (Sandbox Code Playgroud)
你可以比较结果谷歌计算器还
一个定义问题:大、小轴不同于半大、半小
OP应该很清楚,那些抓取,与在线解决方案相比应该太
你可以得到 sympy 来(在数字上)解决问题,我使用的是完整的轴定义
from sympy import *
a, b, w = symbols('a b w')
x = a/2 * cos(w)
y = b/2 * sin(w)
dx = diff(x, w)
dy = diff(y, w)
ds = sqrt(dx**2 + dy**2)
def perimeter(majr, minr):
return Integral(ds.subs([(a,majr),(b,minr)]), (w, 0, 2*pi)).evalf().doit()
print('test1: a, b = 1 gives dia = 1 circle, perimeter/pi = ',
perimeter(1, 1)/pi.evalf())
print('test2: a, b = 4,6 ellipse perimeter = ', perimeter(4,6))
test1: a, b = 1 gives dia = 1 circle, perimeter/pi = 1.00000000000000
test2: a, b = 4,6 ellipse perimeter = 15.8654395892906
Run Code Online (Sandbox Code Playgroud)
也可以将符号 ds 方程导出为函数,以尝试与其他 Python lib 集成函数一起使用
func_dw = lambdify((w, a, b), ds)
from scipy import integrate
print(integrate.quad(func_dw, 0, 2*np.pi, args=(4, 6)))
(15.865439589290586, 2.23277254813499e-12)
Run Code Online (Sandbox Code Playgroud)
scipy.integrate.quad(func, a, b, args=()...
Returns:
y : float, func从a到b的积分.
abserr : float, 结果中绝对误差的估计