This repository has been archived on 2021-06-30. You can view files and clone it, but cannot push or open issues or pull requests.
riemann-sum/tmp-tests.py

147 lines
3.8 KiB
Python

import math
import turtle
import scipy.integrate as integrate
MIN_VALUE = -2
MAX_VALUE = 2
ITERATIONS = 100
TURTLE_SCALE = 100
#### TURTLE STUFF
cursor = turtle.Turtle()
win = turtle.Screen()
cursor.shape()
cursor.hideturtle()
cursor.speed(0)
cursor.goto(-2, 0)
def draw_rectangle(length, width):
arr = [width, length, width, length]
i = 0
while (i < len(arr)):
cursor.forward(arr[i])
cursor.left(90)
i += 1
cursor.penup()
cursor.forward(width)
cursor.pendown()
def draw_trapezoid(a, b, h):
# Drawing Trapezoid given Area
width_of_triangle = b - a
c = math.sqrt(math.pow(h, 2) + math.pow(width_of_triangle, 2))
angle = math.atan2(h, width_of_triangle) * (180 / math.pi)
cursor.forward(h)
cursor.left(90)
cursor.forward(b)
cursor.left(180 - angle)
cursor.forward(c)
cursor.left(angle)
cursor.forward(a)
cursor.left(90)
cursor.penup()
cursor.forward(h)
cursor.pendown()
###
# The function that draws the upper half of the Heart
def f(x):
return math.sqrt(1 - ((math.fabs(x) - 1) ** 2))
# The function that draws the Lower Half the the Heart
def g(x):
return -3 * math.sqrt(1 - math.sqrt(math.fabs(x) / 2 ))
def percent_error(exper, accept):
return (math.fabs(exper - accept) / accept) * 100
def approx_integral_square(func, a, b, n):
# n is how many rectangles you want.
# area is length * width
area = 0.0
width = (b - a) / n
i = 1
while (i <= n):
height = func(a + (i - 1) * width)
# draw_rectangle(height * TURTLE_SCALE, width * TURTLE_SCALE)
area += width * height
i += 1
return area
def approx_integral_trapezoid(func, a, b, n):
# n is how many trapezoids you want
width = (b - a) / n
res = func(a) + func(b)
i = 1
prev_height = func(a)
while (i < n):
height = func(a + (i * width))
draw_trapezoid(prev_height * TURTLE_SCALE, height * TURTLE_SCALE, width * TURTLE_SCALE)
res += 2 * height
prev_height = height
i += 1
return (width / 2) * res
# Compare Results
upper_area = integrate.quad(lambda x: f(x), MIN_VALUE, MAX_VALUE)
lower_area = integrate.quad(lambda x: g(x), MIN_VALUE, MAX_VALUE)
# Don't really care for the margin of error at the moment
# Absolute Value of the area because we don't care about signed area at the moment.math.
upper_area = math.fabs(upper_area[0])
lower_area = math.fabs(lower_area[0])
print("Using the Square Method:")
upper_area_approx = math.fabs(approx_integral_square(lambda x: f(x), MIN_VALUE, MAX_VALUE, ITERATIONS))
# cursor.goto(-2, 0)
lower_area_approx = math.fabs(approx_integral_square(lambda x: g(x), MIN_VALUE, MAX_VALUE, ITERATIONS))
print("\nApproximated Top Half Area:", upper_area_approx, "Original:", upper_area)
print("Percent Error: ", percent_error(upper_area_approx, upper_area), "%", sep="")
print("\nApproximated Bottom Half Area:", lower_area_approx, "Original:", lower_area)
print("Percent Error: ", percent_error(lower_area_approx, lower_area), "%\n", sep="")
print("------")
print("\nUsing the Trapezoid Method:")
upper_area_approx = math.fabs(approx_integral_trapezoid(lambda x: f(x), MIN_VALUE, MAX_VALUE, ITERATIONS))
cursor.goto(-2, 0)
lower_area_approx = math.fabs(approx_integral_trapezoid(lambda x: g(x), MIN_VALUE, MAX_VALUE, ITERATIONS))
print("\nApproximated Top Half Area:", upper_area_approx, "Original:", upper_area)
print("Percent Error: ", percent_error(upper_area_approx, upper_area), "%", sep="")
print("\nApproximated Bottom Half Area:", lower_area_approx, "Original:", lower_area)
print("Percent Error: ", percent_error(lower_area_approx, lower_area), "%", sep="")
# Contratulations!
# Figuring out How to draw a Trapezoid in Turtle.
win.exitonclick()