Matrizen

Anhand von zwei Beispielen soll gezeigt werden, wie mit Python und Julia Matrizen multipliziert und lineare Gleichungen gelöst werden können. NumPy und Julia unterstützen auch Berechnungen mit komplexen Zahlen.

Matrizenmultiplikation

Das Programmbeispiel zeigt, wie mit den Ketten-Parametern die Eingangsspannung U1 und die Eingangsstromstärke I1 einer π-Schaltung berechnet werden.

pi-schaltung

Für den Querwiderstand gilt:


\[A_{q}=\left( \begin{matrix}1&0\\ Y&1\end{matrix} \right) \]

Für den Längswiderstand gilt:


\[A_{l}=\left( \begin{matrix}1&R\\ 0&1\end{matrix} \right) \]

Lösung mit Python

Das Programm multipliziert die Matrix des ersten Quergliedes mit der Matrix des Längsgliedes und der Matrix des zweiten Quergliedes.

#pi_schaltung.py
import numpy as np
from numpy.linalg import multi_dot
R1=1. #Querwiderstand am Eingang
R2=2. #Längswiderstand
R3=1. #Querwiderstand am Ausgang
U2=1. #Ausgangsspannung
I2=1. #Ausgangsstrom
#Matrizen der Kettenparameter
A1q=np.array([[1., 0],
            [1./R1, 1.]])
Al=np.array([[1, R2],
            [0, 1.]])
A2q=np.array([[1., 0],
            [1./R3, 1.]])
#Matrizenmultiplikation
A=A1q@Al@A2q                #1        
b=np.array([[U2],[I2]])     #2
E=A@b                       #3
U1,I1=E[0,0],E[1,0]
#Ausgabe
print("Kettenform A\n",A)
print("Eingangsgrößen\n",E)
print("Eingangsspannung U1=%3.2f V" %U1)
print("Eingangsstrom    I1=%3.2f A" %I1)

Ausgabe

Kettenform A
 [[3. 2.]
 [4. 3.]]
Eingangsgrößen
 [[5.]
 [7.]]
Eingangsspannung U1=5.00 V
Eingangsstrom    I1=7.00 A

Analyse

Die Matrizenmultiplikation erfolgt in der Zeile #1 mit dem NumPy-Infixoperator @. In #2 steht der Inhomogenitätsvektor. In #3 werden die Einganggrößen U1 und I1 berechnet.

Lösung mit Julia

Der Operator für die Matrizenmultiplikation ist das Asterisk-Symbol *.

#pi_schaltung.jl
using LinearAlgebra
R1,R2,R3=1,2,1
U2 = 1
I2 = 1
A1q=[1   0
    1/R1 1]
Al =[1   R2
     0   1]
A2q=[1   0
    1/R3 1]
A=A1q*Al*A2q
b = [U2,I2]
E=A*b
println("A = ",A)
println("E = ",E)
println("U1 = ",E[1]," V")
println("I1 = ",E[2]," A")

Ausgabe

A = [3.0 2.0; 4.0 3.0]
E = [5.0, 7.0]
U1 = 5.0 V
I1 = 7.0 A

Lösen eines linearen Gleichungssystems

Für das Netzwerk mit den acht komplexen Wechselstromwiderständen sollen die vier Maschenströme berechnet werden.

wechselstromnetzwerk

Aus der Schaltung kann folgendes Gleichungssystem abgelesen werden:

\[\left( \begin{gathered}Z_{1}+Z_{2}+Z_{4}\ -Z_{2}\ -Z_{4}\ \ 0\\ -Z_{2}\ \ \ Z_{2}+Z_{3}+Z_{5}\ \ 0\ -Z_{5}\\ -Z_{4}\ \ 0\ \ \ Z_{4}+Z_{6}+Z_{7}\ -Z_{7}\\ \ \ \ \ 0\ -Z_{5}\ -Z_{7}\ \ \ Z_{5}+Z_{7}+Z_{8}\end{gathered} \right) \bullet \left( \begin{gathered}\begin{gathered}I{}_{1}\\ I_{2}\\ I_{3}\end{gathered}\\ I_{4}\end{gathered} \right) =\left( \begin{gathered}U_{1}\\ U_{2}\\ U_{3}\\ U_{4}\end{gathered} \right) \]

Lösung mit Python

Das Python-Programm maschenstromverfahren.py berechnet die vier Maschenströme I1 bis I4.

#maschenstromverfahren.py
import numpy as np
import numpy.linalg
U1=230
U2=-230
U3=230
U4=-230
Z1=1+2j
Z2=2-4j
Z3=3+4j
Z4=2+5j
Z5=1+5j
Z6=2+5j
Z7=4-5j
Z8=1+5j
#Koeffizientenmatrix
Z=np.array([[Z1+Z2+Z4,-Z2,-Z4, 0],
            [-Z2,Z2+Z3+Z5, 0,-Z5],
            [-Z4, 0,Z4+Z6+Z7,-Z7],
            [0,-Z5,-Z7,Z5+Z7+Z8]])
#Inhomogenitätsvektor
U=np.array([U1,-U2,U3,-U4])
I=np.linalg.solve(Z,U)             #1
I=np.round(I,decimals=2)
#Ausgabe
print("Maschenstrom 1:",I[0],"A")
print("Maschenstrom 2:",I[1],"A")
print("Maschenstrom 3:",I[2],"A")
print("Maschenstrom 4:",I[3],"A")     

Ausgabe

Maschenstrom 1: (33.16-52.04j) A
Maschenstrom 2: (19.63-49.35j) A
Maschenstrom 3: (20.09-41.98j) A
Maschenstrom 4: (18.09-51.66j) A

Analyse

In Zeile #1 wird das Gleichungssystem mit der NumPy-Funktion solve(Z,U) gelöst. Als erster Parameter wird die Koeffizientenmatrix und als zweiter Parameter wird der Spaltenvektor der Spannungsquellen übergeben. Der Lösungsvektor wird in dem Objekt I gespeichert.

Lösung mit Julia

Das Julia-Programm maschenstromverfahren.jl berechnet die vier Maschenströme I1 bis I4.
#maschenstromverfahren.jl
using LinearAlgebra
U1 = 230
U2 = -230
U3 = 230
U4 = -230
Z1 = 1 + 2im                            #1
Z2 = 2 - 4im
Z3 = 3 + 4im
Z4 = 2 + 5im
Z5 = 1 + 5im
Z6 = 2 + 5im
Z7 = 4 - 5im
Z8 = 1 + 5im
#Koeffizientenmatrix
Z = [(Z1+Z2+Z4) -Z2 -Z4 0;
    -Z2 (Z2+Z3+Z5) 0 -Z5;
    -Z4 0 (Z4+Z6+Z7) -Z7;
    0 -Z5 -Z7 (Z5+Z7+Z8)]
#Inhomogenitätsvektor
U = [U1, -U2, U3, -U4]
I = Z \ U                               #2
I = round.(I; digits=2, base=10)
#Ausgabe
println("Maschenstrom 1: ", I[1], " A") #3
println("Maschenstrom 2: ", I[2], " A")
println("Maschenstrom 3: ", I[3], " A")
println("Maschenstrom 4: ", I[4], " A")

Ausgabe

Maschenstrom 1: 33.16 - 52.04im A
Maschenstrom 2: 19.63 - 49.35im A
Maschenstrom 3: 20.09 - 41.98im A
Maschenstrom 4: 18.09 - 51.66im A  

Analyse

Komplexe Zahlen werden durch das Suffix im (=Imaginärteil einer komplexen Zahl) vereinbart (#1). Das Gleichungssystem wird in #2 gelöst. In Julia wird ein lineares Gleichungssystem mit dem Backslash-Operator \ gelöst. Der Backslash-Operator steht zwischen der Koeffizientenmatrix und dem Inhomogenitätsvektor. Bei der Ausgabe der Maschenströme muss berücksichtigt werden, dass bei Julia-Vektoren die Indexierung mit einer 1 beginnt (#3). Erwartungsgemäß berechnen beide Programme die gleichen Lösungen.

Besuchen Sie die Seite von NumPy.

Besuchen Sie die Seite von Julia.


Startseite | Funktionsplots | Differenzieren | Integrieren | Differenzialgleichungen | Animationen | Literaturverzeichnis | Impressum