Seite 1 von 1

Mathematische Modellierung mit Python-Funktionen (Kreisfläche)

Verfasst: Montag 25. Mai 2020, 21:16
von CantScript
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.

Re: Mathematische Modellierung mit Python-Funktionen (Kreisfläche)

Verfasst: Montag 25. Mai 2020, 21:40
von sparrow
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.

Re: Mathematische Modellierung mit Python-Funktionen (Kreisfläche)

Verfasst: Montag 25. Mai 2020, 21:54
von CantScript
Anmerkung: Der Radius beträgt 1.0

Re: Mathematische Modellierung mit Python-Funktionen (Kreisfläche)

Verfasst: Dienstag 26. Mai 2020, 10:02
von __blackjack__
@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.

Re: Mathematische Modellierung mit Python-Funktionen (Kreisfläche)

Verfasst: Dienstag 26. Mai 2020, 11:07
von NPC
@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....