@CantScript
Du benutzt für die Rechtecke die falsche Seite für die Höhe. Wenn du Pi von unten nähern willst. Das kannst du relativ einfach ausbessern.
Ein erstes dreieck hat wegen i=0 eine breite von 0. daher das Rechteck eine höhe 1. Was du willst ist jedoch, dass das erste Dreieck bereits eine
Breite von 1/n hat. Daher das +b. (Du könntest auch einfach i in [1, n] laufen lassen und das +b weg lassen).
Code: Alles auswählen
from math import *
def piApprox(n):
flaeche = 0.0
b = 1/n
for i in range(n):
b_dreieck = i*b
h = sqrt(1.0 - (b_dreieck+b)**2)
flaeche += h*b
print("b_dreieck=", b_dreieck, " h=", h, "A=", flaeche)
return 4*flaeche
print(pi-piApprox(50))
Hier mal kurz ein Skript, dass das anschlaulicht macht:
Code: Alles auswählen
import matplotlib.pyplot as plt
from math import pi, sqrt
def pi_approx_lower(n):
flaeche = 0.0
b = 1/n
rects = []
for i in range(n):
b_dreieck = i*b
h = sqrt(1.0 - (b_dreieck + b)**2)
flaeche += h*b
rects.append((b_dreieck, h, b_dreieck + b))
return 4*flaeche, rects
def pi_approx_bigger(n):
flaeche = 0.0
b = 1/n
rects = []
for i in range(n):
b_dreieck = i*b
h = sqrt(1.0 - b_dreieck**2)
flaeche += h*b
rects.append((b_dreieck, h, b_dreieck + b))
return 4*flaeche, rects
def draw(rects):
f, ax = plt.subplots()
a_circle = plt.Circle((0, 0), 1, color="#99999955")
ax.add_artist(a_circle)
ax.axis('equal')
for bl, h, br in rects:
tri = plt.Polygon(((0,0), (br, h), (br, 0)), fill=False)
rec = plt.Polygon(((bl, 0), (br, 0), (br, h), (bl, h)), fill=True, color=(0.5, 0, 0, 0.33))
ax.add_patch(tri)
ax.add_patch(rec)
plt.show()
pi_approx, rects = pi_approx_bigger(20)
draw(rects)
pi_approx, rects = pi_approx_lower(20)
draw(rects)
EDIT: Bei der ersten Zeichnung sollten die Dreiecke auf die Innere Ecke zeigen. Hab ich verdusselt verzeihung... Man sieht jedoch, dass diese auf dem Kreis liegen also wird es trotzdem anschaulich....