packages feed

hmep-0.1.1: doc/sin_approx.py

from random import random
from pylab import *

rcParams['font.family'] = 'serif'
rcParams['font.size'] = 14

def dist1(x,y):
    return abs(x-y)

# The polynomial approximation sin(x)
# TODO: algebraic expression elimination
def approx(x0):
    v1 = -5.936286355387799e-2 + -5.936286355387799e-2
    v4 = x0 + x0
    v5 = v1 * x0
    v7 = v4 * x0
    v8 = v1 * v5
    v9 = x0 * x0
    v10 = v8 * v9
    v11 = x0 * v10
    v15 = -5.936286355387799e-2 * x0
    v18 = v10 * v11
    v20 = v7 * v15
    v21 = v15 + x0
    v25 = v21 + v20
    return v18 + v25

def main():
    xs = linspace(-pi,pi,300)
    a = [approx(x) for x in xs]

    distances = [dist1(approx(x), sin(x)) for x in xs]
    avg = sum(distances) / len(xs)
    print("Average distance for %d points: %.4f" % (len(xs), avg))
    # Average distance for 300 points: 0.0303

    # Visualization

    # Note, the random domain during each demo run is different.
    # The values below are given for illustration purposes only.
    randXs = sort([(random()-0.5)*2*pi for i in range(50)])
    correct = [sin(x) for x in randXs]

    plot(randXs, correct, '+')
    plot(xs, a, lw=1.2)
    xlabel('x')
    ylabel('y(x)')
    xlim([-pi, pi])
    xticks([-pi, 0, pi], ['-$\pi$', '0', '$\pi$'])
    legend(['Points from sin(x)', 'Polynomial Approx.'], fontsize=10)
    show()


if __name__ == '__main__':
    main()