Mathematische Modellierung mit Python-Funktionen (Kreisfläche)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
CantScript
User
Beiträge: 2
Registriert: Montag 25. Mai 2020, 21:04

Hallo,

ich benötige Hilfe mit meinen Programm.

Der folgende Quellcode zeigt eine Umsetzung des Algorithmus zur Annährung der Kreisfläche durch Rechtecke.

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**2)
        flaeche += h*b
        pi * 1.0
        print("b_dreieck=", b_dreieck, " h=", h, "A=", flaeche)
    return 4*flaeche


print(pi-piApprox(50))




Der Aufruf der Funktion und die Berechnung der Genauigkeit, zeigen, dass durch die dargestellte Funktion eine größere Fläche berechnet wird (negatives Vorzeichen).

print(pi-piApprox(50))

--> -0.0366758575087

Die ursprünglich geplante Funktion hätte zu einer kleineren Fläche als 𝝅 führen sollen (positives Vorzeichen).

Könnt Ihr mir bitte helfen den Fehler zu finden?

Danke.
Zuletzt geändert von CantScript am Montag 25. Mai 2020, 21:44, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Poste Code nicht als Bilder sondern kopiere ihn in deinen Beitrag.
Benutze die Code-Tags. Die werden automatisch eingefügt, wenn du im "Vollständiger Editor & Vorschau" auf den </> Button drückst.
Zwichen die Tags gehört dein Code.
CantScript
User
Beiträge: 2
Registriert: Montag 25. Mai 2020, 21:04

Anmerkung: Der Radius beträgt 1.0
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@CantScript: Warum steht da ``pi * 1.0`` mitten im Quelltext? Da kommt `pi` bei heraus, und mit dem Ergebnis wird dann nichts gemacht. Das hat also überhaupt keinen Effekt, von dem kleinen bisschen Rechenzeit abgesehen was der Code braucht um ausgeführt zu werden.

Warum glaubst Du da müsste ein kleinerer Wert als π heraus kommen? Mal Dir das doch mal auf was Du da ausrechnest, dann ist deutlich zu sehen, das der Wert grösser als π sein muss, weil die Rechtecke alle aus dem Einheitskreis heraus ragen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

@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....
Antworten