11.5    Zweifachintegrale

Wenn nicht nur in Richtung der x-Achse integriert wird, sondern zusätzlich auch noch in Richtung der y-Achse, dann heißt diese Operation Zweifachintegration ∫∫dxdy. Mit Zweifachintegralen können Sie Volumen, Flächeninhalte, Schwerpunkte von homogenen ebenen Flächen und Flächenträgheitsmomente berechnen [Papula2: 282]. Zweifachintegrale können Sie mit der SciPy-Funktion dblquad() und mit der SymPy-Methode integrate() berechnen. Außerdem zeige ich Ihnen noch, wie Sie mit selbst erstellten Python-Funktionen Zweifachintegrale berechnen können.

11.5.1    Zweifachintegrale mit konstanten Integrationsgrenzen

Das Zweifachintegral mit konstanten Grenzen für die Funktion z = ƒ(x,y) hat die allgemeine Form:

formula

Es müssen zwei Integrationen nacheinander durchgeführt werden.

Ein Zweifachintegral wird wie folgt berechnet:

  1. Berechne das innere Integral xdx. Die Variable y wird als Konstante betrachtet. Das Ergebnis wird in das äußere Integral ydy eingesetzt.

  2. Berechne das äußere Integral ydy.

Geometrische Deutung

Die Berechnung eines Zweifachintegrals kann geometrisch als Berechnung des Volumens eines Körpers gedeutet werden, dessen Grundfläche in der x,y-Ebene liegt. Das Teilvolumen ΔV = zΔA = zΔxΔy setzt sich aus n Quadern mit der Grundfläche ΔxΔy und der Höhe z = ƒ(x,y) zusammen.

Wie ein Zweifachintegral mit konstanten Grenzen berechnet werden muss, soll im Folgenden an einem einfachen Beispiel der Funktion

formula

demonstriert werden.

In Richtung der x-Achse soll von 0 bis 2 integriert werden, und in Richtung der y-Achse soll von 0 bis 1 integriert werden. Abbildung 11.10 zeigt den Integrationsbereich in der x-y-Ebene.

Rechteckförmiger Integrationsbereich für konstante Integrationsgrenzen

Abbildung 11.10     Rechteckförmiger Integrationsbereich für konstante Integrationsgrenzen

Abbildung 11.11 zeigt die 3D-Darstellung des Körpers z = ƒ(x,y) = 5 – xy.

3D-Darstellung für z = ƒ(x,y) = 5 – x – y

Abbildung 11.11     3D-Darstellung für z = ƒ(x,y) = 5 – x – y

Das Zweifachintegral mit konstanten Integrationsgrenzen berechnet das Volumen unter der durch die Funktion z = ƒ(x,y) beschriebenen rechteckförmigen Fläche. Die durch die Integrationsgrenzen festgelegte Grundfläche des Körpers besteht aus der Projektion der Dachfläche in die x-y-Ebene. Die vier Kanten des Körpers verlaufen parallel zur z-Achse.

Wird die Gleichung ƒ(x,y) = 5 – xy in das Zweifachintegral eingesetzt, ergibt sich für das Volumen:

formula

Zuerst wird das innere Integral berechnet. Die Variable y wird als konstant betrachtet.

formula

Das Ergebnis wird in das äußere Integral eingesetzt:

formula

Merke

Wenn die Integrationsgrenzen konstant sind, dann wird über einen rechteckförmigen Bereich in x- und y-Richtung integriert. Das heißt, die Grundfläche des Körpers ist ein Rechteck.

Der Algorithmus besteht aus zwei ineinander verschachtelten Schleifen. In der inneren Schleife wird das innere Integral mit dem Summenalgorithmus berechnet, und in der äußeren Schleife wird das äußere Integral mit dem Summenalgorithmus berechnet. Bei zwei ineinander verschachtelten Schleifen beträgt die Laufzeitkomplexität O(n2). Wenn also die Anzahl der Schleifendurchläufe verdoppelt wird, vervierfacht sich die Laufzeit.

Die Genauigkeit der Berechnung mit der von Ihnen erstellten Python-Funktion zweifach() soll mit der SciPy-Funktion dblquad() überprüft werden.

Zweifachintegrale können Sie auch mit der SciPy-Funktion dblquad(f,x1,x2,y1,y2) berechnen. Als erster Parameter wird eine mathematische Funktion ƒ(x,y) übergeben. Die Funktionsargumente x, y dürfen nicht mit angegeben werden. Es folgen die unteren und oberen Grenzen des inneren Integrals x. Danach müssen die unteren und oberen Grenzen des äußeren Integrals y übergeben werden.

Listing 11.9 berechnet Zweifachintegrale für das bereits durchgerechnete Beispiel. Durch Entfernen der Kommentare können Sie auch andere mathematische Funktionen testen. Die Variablen für die äquidistante Zerlegung werden mit dx und dy bezeichnet.

01  #09_zweifach_integral.py
02 from math import *
03 from scipy.integrate import dblquad
04 #Funktionsdefinition
05 def f(x,y):
06 return 5-x-y #x**2+y,x*exp(y),exp(-(x**2+y**2))
07 #Zweifachintegral
08 def zweifach(f,y1,y2,x1,x2,n=200,m=200):
09 dx=(x2-x1)/n
10 dy=(y2-y1)/m
11 sy=0
12 for i in range(n):
13 y=y1+i*dy+dy/2
14 sx=0
15 for j in range(m):
16 x=x1+j*dx+dx/2
17 sx=sx+f(x,y)
18 sy=sy+sx
19 return sy*dx*dy
20 #Grenzen der x-Achse
21 x1,x2=0,2
22 #Grenzen der y-Achse
23 y1,y2=0,1
24 V1=zweifach(f,y1,y2,x1,x2)
25 V2= dblquad(f,y1,y2,x1,x2)[0]
26 print("Volumen:",V1)
27 print("Volumen:",V2,"dblquad")

Listing 11.9     Berechnung von Zweifachintegralen mit selbst definierter Python-Funktion

Ausgabe

Volumen: 7.0
Volumen: 7.0 dblquad

Analyse

Zeile 03 importiert die SciPy-Funktion dblquad. Sie wird benötigt, um die Genauigkeit der selbst erstellten Python-Funktion aus Zeile 06 zu testen.

Die selbst erstellte Python-Funktion zweifach(f,y1,y2,x1,x2, ...) erwartet beim Funktionsaufruf (Zeile 24) die Übergabe des Funktionsnamens f ohne Parameter, die Integrationsgrenzen x1,x2 des inneren Integrals und die Integrationsgrenzen y1,y2 des äußeren Integrals.

Die innere Schleife (Zeile 15 bis 17) berechnet das innere Integral sx. In Zeile 17 wird bei jedem neuen Schleifendurchlauf der aktuelle y-Wert aus Zeile 13 der Funktion f(x,y) übergeben.

Die äußere Schleife (Zeile 12 bis 18) berechnet das äußere Integral sy.

Beide Schleifen werden bei den voreingestellten Werten (n=200, m=200) insgesamt 40.000-mal durchlaufen. Dieser sehr hohe Wert garantiert zwar die Genauigkeit der Berechnung, der selbst entwickelte Algorithmus ist aber bei einer so großen Laufzeitkomplexität von O(n2) nicht praxistauglich.

Wenn die Integrationsgrenzen weiter vergrößert werden, dann berechnet die selbst erstellte Python-Funktion zweifach() zu ungenaue Werte.

11.5.2    Zweifachintegrale mit variablen Integrationsgrenzen

Zweifachintegrale mit variablen Integrationsgrenzen haben die allgemeine Form [Papula2: 274]:

formula

Der Integrationsbereich in der x-y-Ebene soll diesmal kein Rechteck sein, sondern ein Dreieck. Eine Integrationsgrenze ist also nicht konstant. Abbildung 11.12 zeigt den dreieckförmigen Integrationsbereich. Die Grundfläche des Körpers ist also ein Dreieck.

Dreieckförmiger Integrationsbereich

Abbildung 11.12     Dreieckförmiger Integrationsbereich

Aus Abbildung 11.12 können Sie die Funktionsgleichung

formula

für die Eingrenzung des Integrationsbereichs ablesen.

Um die obere Grenze des inneren Integrals zu bestimmen, muss diese Gleichung nach x aufgelöst werden:

formula

Für die Funktion

formula

soll exemplarisch das Zweifachintegral

formula

berechnet werden.

Die Berechnung des inneren Integrals ergibt:

formula

Die Berechnung des äußeren Integrals ergibt:

formula

Integration eines Zweifachintegrals mit SciPy

Listing 11.10 zeigt, wie Sie mit der SciPy-Funktion dblquad() ein Zweifachintegral mit variabler Obergrenze numerisch berechnen können.

01  #10_zweifach_dblquad.py
02 from math import *
03 from scipy.integrate import dblquad
04 #Funktionsdefinition
05 def f(x,y):
06 return x+y**2
07 #obere Grenze, variabel
08 def y2(y):
09 return 1-y/2
10 #Hauptprogramm
11 x1,x2=0,2 #konstant
12 y1=0 #y2 variabel
13 V = dblquad(f,x1,x2,y1,y2)[0]
14 print("Volumen V =",V)

Listing 11.10     Zweifachintegral mit variablen Grenzen mit »dblquad()« berechnet

Ausgabe
Volumen V = 1.0
Analyse

In Zeile 03 wird die SciPy-Funktion dblquad importiert. Die variablen Grenzen müssen als Python-Funktion festgelegt werden (Zeilen 08 und 09).

In Zeile 11 stehen die konstanten Grenzen des inneren Integrals. Zeile 12 legt die untere Grenze des äußeren Integrals fest. In Zeile 13 berechnet die SciPy-Funktion dblquad(f,x1,x2,y1,y2)[0] den Wert des Zweifachintegrals. Das Listenelement [0] unterdrückt die Ausgabe der Fehlerabschätzung. Das Ergebnis wird als Fließpunktzahl ausgegeben. Es stimmt erwartungsgemäß mit dem manuell berechneten Wert überein.

Integration eines Zweifachintegrals mit SymPy

Um den Unterschied zwischen numerischer und symbolischer Berechnung eines Zweifachintegrals zu verdeutlichen, soll das obige Zweifachintegral mit der SymPy-Methode integrate(z,(...),(...)) berechnet werden. SymPy kann nur Stammfunktionen finden, die sich auch mit elementaren Methoden ermitteln lassen. Die Methode integrate() ermittelt zuerst eine Stammfunktion des Integranden, setzt dann die Grenzen ein und wertet abschließend das bestimmte Integral aus.

Listing 11.11 berechnet das Zweifachintegral für die Funktion z = x + y2 mit SymPy mit der variablen inneren Obergrenze x2 = 1 – y/2.

01  #11_zweifach_sympy.py
02 from sympy import *
03 x,y =symbols('x y')
04 z=x+y**2
05 x1,x2=0,1-y/2
06 y1,y2=0,2
07 print("Zweifachintegral von z =",z)
08 print("in den inneren Grenzen von",x1,"bis",x2)
09 print("in den äußeren Grenzen von",y1,"bis",y2)
10 V=integrate(z, (x, x1, x2), (y, y1, y2))
11 print("Volumen V =",V)

Listing 11.11     Zweifachintegral mit variablen Grenzen mit SymPy berechnet

Ausgabe
Zweifachintegral von z = x + y**2
in den inneren Grenzen von 0 bis 1 - y/2
in den äußeren Grenzen von 0 bis 2
Volumen V = 1
Analyse

In Zeile 03 wird vereinbart, dass x und y als symbolische Variablen wirken sollen. In Zeile 04 erfolgt die Funktionsdefinition z=x+y**2. In Zeile 05 wird für die obere Grenze x2 des inneren Integrals der Funktionsterm 1-y/2 eingegeben. In Zeile 10 berechnet die SymPy-Methode integrate() das Volumen. Die Grenzen und die unabhängige Variable müssen von runden oder eckigen Klammern umschlossen sein.

Das Ergebnis stimmt mit dem manuell berechneten Wert überein. Das Ergebnis ist eine ganze Zahl. Wenn Sie in Zeile 06 als Grenze eine Fließpunktzahl, z. B. 2.0, einsetzen, erhalten Sie als Ergebnis eine Fließpunktzahl V= 1.00000000000000.

SymPy eignet sich nicht für die Berechnung bestimmter Integrale, wenn die Terme des Integranden zu kompliziert aufgebaut sind.