def lowStrainApproximation(l1,l2,ep_max=0.0001,d_start=1,d_fac=2):
"""
Find r1, r2 such that abs(0.5*(l1*r1 - l2*r2)/min(l2*r2,l1*r1)) < ep_max
"""
ep = 1.0 # strain
d = d_start
while abs(ep) > ep_max:
r1 = Fraction(l2/l1).limit_denominator(d).numerator
r2 = Fraction(l2/l1).limit_denominator(d).denominator
if r1 > d:
r2 = Fraction(l1/l2).limit_denominator(d).numerator
r1 = Fraction(l1/l2).limit_denominator(d).denominator
if r1 > d:
print (l1, l2)
raise Exception('Cannot find good approximation')
if r2 == 0 or r1 == 0:
d *= d_fac
else:
ep = 0.5*(l1*r1 - l2*r2)/min(l2*r2,l1*r1)
if abs(ep) > ep_max:
d *= d_fac
return r1, r2
评论列表
文章目录