Im Elektrotechnik Studium erstellten wir viele Grafiken und Berechnungen mit MATLAB. Während dem Studium habe ich mir eine Studentenlizenz gekauft, um den «Luxus» von MATLAB jederzeit zu nutzen. Sobald ich jedoch etwas für einen Kunden evaluieren will, darf ich diese Lizenz nicht mehr benutzen. Steht keine MATLAB-Lizenz zur Verfügung, bedeutet das, dass man eine Alternative braucht.
Natürlich kenne ich die freie alternative Octave. Octave ist zu einem Grossteil kompatibel zu MATLAB und der Einstieg daher einfach. Erfahrungen mit Octave habe ich bisher wenig gemacht. Ich hatte einmal eine Simulation aus Neugierde in Octave implementiert und festgestellt, dass die Berechnung wesentlich länger dauerte als mit MATLAB. Diese Erkenntnis aufgrund meines Tests zu generalisieren, wage ich mich jedoch nicht.
Python war in meinem Studiumalltag nicht präsent. Eingesetzt hatte ich es nur 2-3 mal um .csv Files nach vorgegebenen Mustern zu editieren und schätzte die umfangreichen Möglichkeiten einen Task zu lösen.
Idealerweise kennt man alle drei Tools sehr gut und kann sich vor Beginn für die effizienteste und die kostengünstigste Variante entscheiden. Da MATLAB wegen der hohen Lizenzkosten nicht als erstes in Frage kommt, bleiben noch Octave und Python. Da ich von Python nur sehr wenig kenne, versuche ich den Einstieg hier zusammenzufassen und die ersten Erkenntnisse zu ziehen. So kann ich mich später fundierter für eine Variante entscheiden.
Die Installation kann man ziemlich klein halten, wenn man Python direkt installiert und die zusätzlich benötigten Pakete mit «pip» hinzufügt. Der Versuch die Spyder IDE mit «pip» auf meinen beiden Rechnern zu installieren scheiterte auf einem. Den Unterschied in der Installation konnte ich nicht ausfindig machen. Auf der offiziellen Spyder Homepage wird auf die Anaconda Distribution als empfohlene Installationsvariante verwiesen. Anaconda installiert die für den Anfang benötigten Pakete, sowie die Spyder IDE. Es ist also empfehlenswert mit Anaconda (Version Python 3.7) zu beginnen.
Spyder lässt sich nun entweder via den Anaconda Navigator oder direkt unter Windows→Spyder starten. Unter Ansicht→Fensterlayouts→Matlab Layout kann das Layout so angepasst werden, dass es für MATLAB Nutzer vertrauter aussieht. Plots werden standardmässig im Konsolenfenster angezeigt, da Spyder im Hintergrund IPython nutzt. Will man die Plots wie in MATLAB in einem neuen Fenster, kann man unter Werkzeuge→Voreinstellungen→IPython-Konsole im Tab Grafik das Grafik-Backend von Inline auf Automatisch stellen. Damit die Änderung übernommen wird, muss der Kernel neu gestartet werden: Konsolen→Kernel neu starten.
Das nachfolgende Skript generiert eine Gausskurve im Bereich [-4, 4] und zeigt so bereits einige Unterschiede zu MATLAB. Als erstes fällt auf, dass in Python, je nach verwendeten Funktionen, die entsprechenden Pakete importiert werden müssen. Für dieses Beispiel sind es die Funktionen figure
, plot
und weitere aus matplotlib.pyplot
sowie die Funktionen linspace
, sqrt
und exp
aus numpy. Um die Schreibarbeit klein zu halten und trotzdem mögliche Namenskonflikte mit verschiedenen Paketen zu vermeiden, importieren wir hier die Funktion, respektive die Funktionssammlung aus dem Submodule pyplot, von matplotlib.pyplot
als plt
und alles aus numpy als np
. Diese Kürzel sind praktisch Standards, da sie bereits in den Beispielen der Pakete so verwendet werden.
# Import required packages import matplotlib.pyplot as plt import numpy as np # Gaussian curve constants mu = 0 sig = 1 # X- and y-axes to be plotted x = np.linspace(-4,4,81) # X-axis: Create 81 Points in the range [-4, 4] # Y-axis: Evaluate desired function over the x-range fx = 1/(np.sqrt(2*np.pi*sig**2)) * np.exp(-1/2 * ((x-mu)/sig)**2) fig = plt.figure(1) # Set up new figure 1 and save the figure handle plt.clf() # Clear the current figure plt.plot(x,fx, label='Normal distribution') # or ax.plot(x,fx) to plot on specific axis plt.legend() # Display legend plt.xlabel('Deviation') # Label current x-axis plt.ylabel('Probability') # Label current y-axis plt.title('Plot Demo') # Set current axis title # Show plot plt.show()
Im 2. Beispiel werden einige Kurven mehr gezeichnet, Subplots verwendet und Achsen im LaTeX Format angeschrieben.
# Import required packages import matplotlib.pyplot as plt import numpy as np # Define a function def gauss(mu, sig, x): # Probability density function of the normal distribution # mu equals the mean # sig equals the standard deviation # x equals the point being evaluated return ( 1 / (np.sqrt(2*np.pi*sig**2)) * np.exp(-1/2 * ((x-mu)/sig)**2)) # Gaussian curve parameters to be evaluated # mu = 0.0, 2.5, 2.0, -0.7 # sig = 1.0, 3.0, 0.5, 0.8 simParamPairs = [[0,1], [2.5,3], [2,0.5],[-0.7,0.8]] xmin = -4 # Minimum of x-axis xmax = 4 # Maximum of x-axis nrPoints = 81 # Number of points to be evaluated along x-axis x = np.linspace(xmin,xmax,nrPoints) # Create x-axis array dxArea = (xmax-xmin)/(nrPoints-1) # Calculate space between x-points # Create new figure 1, clear if it already exists and save figure handle fig = plt.figure(num=2, clear=True) plt.suptitle('Normal Distribution for Plot Demonstration', fontsize=16) # Set main title # Create 2 Subplots in 2 rows and 1 column and save axis handles ax1 = plt.subplot(2,1,1) # 2 rows, 1 column, figure 1 ax2 = plt.subplot(2,1,2, sharex=ax1) # 2 rows, 1 column, figure 2, Link x-axis labels = [] # Create empty label array # Iterate over all parameter pairs for simParamPair in simParamPairs: fx = gauss(simParamPair[0],simParamPair[1],x) # Evaluate each parameter pair ax1.plot(x,fx) # Plot fx along x # Plot the cumulative sum of fx. To respect the area multiply by the distance # between two points. Note that this is not accurate, just for demonstration ax2.plot(x,np.cumsum(fx)*dxArea) # Generate and append the label for the current graph, formatted like LaTeX labels.append(r'$\mu = %.1f, \sigma = %.1f$' % (simParamPair[0], simParamPair[1])) ax1.grid(b=True, which='major', axis='both') # Enable both major grids ax1.set_xlim(xmin,xmax) # Set x limits ax1.set_ylabel(r'$\varphi_{\mu,\sigma^2}(X)$') # Set y label, formatted like LaTeX ax1.set_xlabel(r'$X$') # Set x label, formatted like LaTeX ax1.set_title('Probability density function') # Set subplot title ax1.legend(labels, loc='upper left', fontsize=9) # Add legend ax2.grid(b=True, which='major', axis='both') # Enable both major grids ax2.set_xlim(xmin,xmax) # Set x limits ax2.set_ylabel(r'$\Phi_{\mu,\sigma^2}(X)$') # Set y label, formatted like LaTeX ax2.set_xlabel(r'$X$') # Set x label, formatted like LaTeX ax2.set_title('Cumulative distribution function') # Set subplot title ax2.legend(labels, loc='upper left', fontsize=9) # Add legend # Adjust the spacings between and around the subplot area plt.subplots_adjust(top=0.88, bottom=0.1, left=0.12, right=0.95, hspace=0.5, wspace=0.5) # Save plot as png. Possible are: png, eps, pdf, pgf, ps, raw and svg fig.savefig("gaussExtended.png") plt.show() # Show plot
Schreiben Sie einen Kommentar