簡體   English   中英

使用機器 Epsilon 使用泰勒級數逼近 sin(x)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM