[英]Using Machine Epsilon to approximate sin(x) using Taylor's Series
我很難使用 2.220446049250313e-16 的 Machine Epsilon,然后我需要使用 abs 錯誤來確定我的正弦項的 abs 值是否小於 Machine Epsilon。
使用泰勒級數寫一個正弦 function 來計算 sin(x) 的值,其中是以弧度為單位的角度。 角度必須介於 -(pi/2) 和 pi/2 之間。 使用 Machine Epsilon 確定計算正弦值所需的項數。
我需要 output 的角度,我的正弦計算,絕對誤差和使用的項數。 這是我已經擁有的:
def machineEpsilon(e):
e = 1.0
while(1.0 + e/2.0) > 1.0:
e = e/2.0
return e
def sine(x, n):
sign = 1
sine = 0.0
half_pi = math.pi/2
#converts anything greater than pi/2 to something in between -pi/2 and pi/2
while x > half_pi:
x -= half_pi
#converts anything less than -pi/2 to something in between -pi/2 and pi/2
while x < -(half_pi):
x += half_pi
if x > math.pi:
x -= math.pi
sign = -1
swap_sign = 1
#loops through taylor series for sine
for i in range(1, n * 2, 2):
sine += swap_sign * (x ** i) / math.factorial(i)
swap_sign *= -1
return sign * sine
def main():
numTerms = 0
pie = math.pi
angle1 = round(sine(-20, 50), 9)
abbsErr1 = (abs(angle1 - math.sin(-20)))
angle2 = round(sine((-pie), 10), 9)
abbsErr2 = abs(angle2 - math.sin(-pie))
angle3 = round(sine((-pie/2), 10), 9)
abbsErr3 = abs(angle3 - math.sin((-pie/2)))
angle4 = round(sine(-0.5, 10), 9)
abbsErr4 = abs(angle4 - math.sin(-0.05))
angle5 = round(sine(0.0000, 10), 9)
abbsErr5 = abs(angle5 - math.sin(0))
angle6 = round(sine(0.05, 10), 9)
abbsErr6 = abs(angle6 - math.sin(0.0500))
angle7 = round(sine(100, 5), 9)
abbsErr7 = abs(angle7 - math.sin(100))
print("\n")
print("Name: Name")
print("Machine epsilon = ", machineEpsilon(1))
print("{:<12} {:<15} {:<25} {:<3}".format('Angle(rad)', '(my sine)', 'AbsErr',
'# of Terms'))
print("{:<12} {:<15} {:<25} {:<3}".format('-20.0000', angle1, abbsErr1, numTerms))
#print(math.sin(-20))
print("{:<12} {:<15} {:<25} {:<3}".format('-3.1416', angle2, abbsErr2, numTerms))
#print(math.sin(-(pie)))
print("{:<12} {:<15} {:<25} {:<3}".format('-1.5708', angle3, abbsErr3, numTerms))
#print(math.sin(-(pie/2)))
print("{:<12} {:<15} {:<25} {:<3}".format('-0.5000', angle4, abbsErr4, numTerms))
#print(math.sin(-0.5))
print("{:<12} {:<15} {:<25} {:<3}".format('0.0000', angle5, abbsErr5, numTerms))
#print(math.sin(0))
print("{:<12} {:<15} {:<25} {:<3}".format('0.0500', angle6, abbsErr6, numTerms))
#print(math.sin(0.0500))
print("{:<12} {:<15} {:<25} {:<3}".format('100.0000', angle7, abbsErr7, numTerms))
#print(math.sin(100))
print("\n")
您的正弦 function 似乎不太正確 - 它還應該返回所需的迭代次數。 我已經通過將系列的當前值與前一個值進行比較,將您的代碼修改為隱式使用機器 epsilon。 (我還冒昧地將要計算的值放入數組並循環遍歷它們)。
import math
def machineEpsilon(e):
e = 1.0
while(1.0 + e/2.0) > 1.0:
e = e/2.0
return e
def sine(x):
sign = 1
half_pi = math.pi/2
#converts everything into range 0..2*pi
while x >= 2*math.pi:
x -= 2*math.pi
while x < 0.0:
x += 2*math.pi
if x > math.pi:
x -= math.pi
sign = -1
swap_sign = 1
#loops through taylor series for sine
i = 1
sine = 0.0
oldsine = 1
iterations = 0
while sine!=oldsine:
oldsine = sine
sine += swap_sign * (x ** i) / math.factorial(i)
swap_sign *= -1
i += 2
iterations += 1
return (sign * sine, iterations) # value, number of iterations
def main():
print("\n")
print("Name: Name")
print("Machine epsilon = ", machineEpsilon(1))
print("{:<12} {:<22} {:<27} {:<3}".format('Angle(rad)', '(my sine)', 'AbsErr', '# of Terms'))
pie = math.pi
values = [-20,-pie,-pie/2,-0.5,0.0,0.05,100]
for v in values:
s,numTerms = sine(v)
abbsErr = abs(s - math.sin(v))
print("{:<12} {:<22} {:<27} {:<3}".format(round(v,9), s, abbsErr, numTerms))
print("\n")
if __name__=="__main__":
main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.