Suche

Ich benutze MATLAB seit über 25 Jahren. (Und davor habe ich sogar MATRIXx benutzt, einen späten, unglücklichen Versuch eines Spin-offs oder vielleicht eines Ripoffs.) Es ist nicht die erste Sprache, in der ich programmieren gelernt habe, aber es ist die Sprache, mit der ich mathematisch aufgewachsen bin. MATLAB-Kenntnisse haben meiner Karriere sehr gut getan.

Der Aufstieg von Python im wissenschaftlichen Rechnen ist jedoch nicht zu übersehen. MathWorks muss das genauso sehen: Sie haben nicht nur die Möglichkeit geschaffen, Python direkt aus MATLAB heraus aufzurufen, sondern auch einige Sprachfunktionen übernommen, wie z.B. die aggressivere Übertragung von Operanden für binäre Operatoren.

Es ist ein Punkt erreicht, an dem ich meine weitere Verwendung von MATLAB in Forschung und Lehre in Frage stelle. Es fällt mir so viel leicht, und ich habe so viel in Material dafür investiert, dass es schwer war, die Motivation aufzubringen, wirklich etwas Neues zu lernen.

Das MATLAB-basierte Lehrbuch, an dem ich mitgeschrieben habe, enthält über 40 Funktionen und 160 Funktionen für die Einführung in die Mathematik. Das Buch enthält über 40 Funktionen und 160 Berechnungsbeispiele und vermittelt meiner Meinung nach eine gründliche Einführung in die Verwendung von MATLAB für numerische wissenschaftliche Berechnungen. Zum Teil, um mich selbst zu verbessern, und zum Teil, um den Nutzen des Buches zu erhöhen, habe ich mich dieses Jahr daran gemacht, die Codes in Julia und Python zu übersetzen. Diese Erfahrung hat mich zu einer besonderen Sichtweise der drei Sprachen in Bezug auf das wissenschaftliche Rechnen geführt, die ich im Folgenden darzustellen versuche.

Ich werde die Fragen der Kosten und der Offenheit weitgehend beiseite lassen. MATLAB ist, im Gegensatz zu Python und Julia, weder bier- noch sprachfrei. Das ist in der Tat ein großer Unterschied – für manche sogar ein entscheidender – aber ich möchte die technischen Vorzüge betrachten. Viele Jahre lang war MATLAB in vielerlei Hinsicht nützlicher als jedes freie Produkt, und wenn man produktiv sein wollte, dann waren die Kosten egal. Das ist eine andere Überlegung als die platonische Anziehungskraft einer Sprache und eines Ökosystems.

Wenn man die Kosten beiseite lässt, liegt ein nützlicher Rahmen für viele der Unterschiede zwischen diesen Sprachen in ihren Ursprüngen. MATLAB, die älteste der Sprachen, legte den Schwerpunkt auf Mathematik, insbesondere auf numerisch orientierte Mathematik. Python, das in den späten 1980er Jahren entstand, stellte die Informatik in den Mittelpunkt. Julia, das 2009 eingeführt wurde, versucht, ein Gleichgewicht zwischen diesen beiden Seiten herzustellen.

MATLAB

Ursprünglich war jeder Wert in MATLAB ein Array aus doppelt präzisen Fließkommazahlen. Beide Aspekte dieser Wahl, Arrays und Fließkommazahlen, waren geniale Designentscheidungen.

Der IEEE 754-Standard für Fließkommazahlen wurde erst 1985 verabschiedet, und der Speicher wurde in K und nicht in G gemessen. Außerdem mussten Variablen nicht deklariert und Speicher nicht explizit zugewiesen werden. Indem man diese Aufgaben dem Computer überließ und die Datentypen aus dem Weg räumte, hatte man den Kopf frei, um über die Algorithmen nachzudenken, die mit den Daten arbeiten sollten.

Arrays waren wichtig, weil numerische Algorithmen in der linearen Algebra in Form von LINPACK und EISPACK zu ihrem Recht kamen. Aber der Zugriff auf sie mit dem Standardprogramm für wissenschaftliches Rechnen, FORTRAN 77, war ein mehrstufiger Prozess, der die Deklaration von Variablen, den Aufruf kryptisch benannter Routinen, die Kompilierung des Codes und die Untersuchung von Daten und Ausgabedateien erforderte. Eine Matrixmultiplikation als A*B zu schreiben und die Antwort sofort ausgedruckt zu bekommen, war ein großer Fortschritt.

MATLAB machte auch Grafiken einfach und viel zugänglicher. Keine fummeligen maschinenspezifischen Bibliotheken mit Low-Level-Aufrufen, sondern einfach plot(x,y) das, was jeder andere MATLAB-Anwender auch sehen würde. Weitere Innovationen wie die Integration komplexer Zahlen, dünnbesetzter Matrizen, Werkzeuge zur Erstellung plattformübergreifender grafischer Benutzeroberflächen und eine führende Suite von ODE-Lösern machten MATLAB zum idealen Werkzeug für wissenschaftliches Rechnen mit hoher Denkgeschwindigkeit.

Das für interaktive Berechnungen, selbst für langwierige, ideale Design war jedoch nicht immer förderlich für die Entwicklung guter und leistungsfähiger Software. Das Verschieben von Daten zwischen vielen Funktionen erforderte das Jonglieren mit vielen Variablen und das häufige Konsultieren der Dokumentation über Ein- und Ausgabeargumente. Eine Funktion pro Plattendatei in einem flachen Namespace war für ein kleines Projekt erfrischend einfach, bereitete aber bei einem großen Projekt Kopfschmerzen. Bestimmte Programmiermuster (Vektorisierung, Vorabzuweisung von Speicher) mussten angewandt werden, wenn man Geschwindigkeitsengpässe vermeiden wollte. Wissenschaftliches Rechnen wurde nun in viel mehr Bereichen angewandt, mit riesigen Mengen verschiedener nativer Datentypen.

MathWorks reagierte darauf mit weiteren Innovationen in MATLAB: Inline-Funktionen, verschachtelte Funktionen, Variablenschließungen, zahlreiche Datentypen, objektorientierte Funktionen, Unit-Testing-Frameworks und so weiter und so fort. Jede Innovation war wahrscheinlich die Lösung für ein wichtiges Problem. Aber die Anhäufung von 40 Jahren dieser Änderungen hatte den Nebeneffekt, dass die Einfachheit und Einheitlichkeit des Konzepts untergraben wurde. Im Jahr 2009 habe ich ein Buch geschrieben, das auf weniger als 100 Seiten die meiner Meinung nach wesentlichen Aspekte von MATLAB abdeckt. Soweit ich weiß, sind all diese Dinge immer noch verfügbar. Aber man muss jetzt viel mehr wissen, um sich als kompetent zu bezeichnen.

Python

In gewisser Weise scheint die Geschichte von Python fast ein Spiegelbild der von MATLAB zu sein. Beide verfügten über eine interaktive Befehlszeile (heute allgemein als REPL bezeichnet, für „read-eval-print loop“) und waren frei von Variablendeklarationen und Kompilierung. MATLAB wurde jedoch als Spielwiese für numerische Analytiker entwickelt, während Python für Hacker gedacht war. Beide haben sich dann durch Überarbeitungen und Erweiterungen dem jeweils anderen Publikum angenähert.

In meinen Augen fehlt es Python immer noch an mathematischem Reiz. Es gibt Hässlichkeiten und kleine Ärgernisse wie ** statt ^, @ für die Matrixmultiplikation (eine Neuerung!), ein shape statt der Größe einer Matrix, zeilenorientierte Speicherung usw. Wenn Sie glauben, dass V.conj().T@D**3@V eine elegante Art ist, $V^*D^3V$ zu schreiben, dann sollten Sie vielleicht einen Arzt aufsuchen. Und es gibt eine Null-Indexierung (im Gegensatz zu Indizes, die bei 1 beginnen). Ich habe die Argumente gelesen, und ich finde sie nicht entscheidend. Es ist eindeutig eine Frage der Vorliebe – der Stoff, aus dem heilige Kriege im Internet gemacht sind -, denn man kann für jede der beiden Konventionen plumpe Beispiele anführen. Was ich entscheidend finde, ist, dass wir jahrzehntelange mathematische Praxis haben, Vektoren und Matrizen von einem aus zu indizieren, und der meiste Pseudocode geht von dieser Annahme aus.

Abgesehen von den kleinen Ärgernissen finde ich das Python+NumPy+SciPy-Ökosystem unübersichtlich und inkonsistent. Ein Beispiel dafür ist die Tatsache, dass es trotz der Tatsache, dass die Sprache eher objektorientiert ist, eine Matrixklasse gibt, von deren Verwendung abgeraten wird und die veraltet sein wird. Vielleicht hat MATLAB mich einfach korrumpiert, aber ich finde Matrizen als Objekttyp wichtig genug, um sie beizubehalten und zu fördern. Ist es nicht ein wesentliches Verkaufsargument für OOP, dass man * für Arrays und Matrizen unterschiedliche Dinge tun kann? In dieser Hinsicht gibt es noch viele andere Ungereimtheiten. (Warum brauche ich einen Befehl namens spsolve? Kann ich nicht einfach solve für eine dünnbesetzte Matrix aufrufen? Und so weiter und so fort.)

Es gibt auch Stellen, an denen mir das numerische Ökosystem ein wenig dünn erscheint. Zum Beispiel sehen die Quadratur- und ODE-Löser wie ein minimaler Satz im Jahr 2019 aus. AFAICT gibt es keine Methoden für DAEs, DDEs, symplektische Löser oder implizite Löser, die innere Krylov-Iterationen erlauben. Werfen Sie einen Blick auf die Referenzen für diese Funktionen; sie sind meist 30 oder mehr Jahre alt – immer noch gut, aber bei weitem nicht vollständig. Das Matplotlib-Paket ist ein erstaunliches Stück Arbeit, und eine Zeit lang sah es besser aus als MATLAB, aber ich finde, dass es in 3D immer noch ziemlich mangelhaft ist.

Einige Experten argumentieren, dass es tiefgreifende Gründe dafür gibt, warum Python-Code bei der Ausführungsgeschwindigkeit mit kompilierten Sprachen mithalten kann. Ich bin amüsiert über die Ergebnisse der Suche nach „Python ist zu langsam“. Die Befürworter von Python bringen viele der gleichen Argumente/Entschuldigungen vor, die damals für MATLAB angeführt wurden. Das heißt nicht, dass sie falsch liegen, aber es gibt mehr als nur ein Wahrnehmungsproblem.

Ich glaube, ich verstehe, warum Python für viele Leute im wissenschaftlichen Rechnen so aufregend ist. Es hat eine MATLAB-ähnliche Syntax und Leistung, die über eine REPL verfügbar ist. Es verfügt über großartige Werkzeuge und lässt sich gut mit anderen Sprachen und Bereichen der Datenverarbeitung kombinieren. Und das zum Nulltarif und mit einer viel besseren langfristigen Reproduzierbarkeit. Es ist klar, dass es für viele Leute gut funktioniert, die wahrscheinlich wenig Grund sehen, zu wechseln.

Aber für die Dinge, die ich im wissenschaftlichen Rechnen zu tun weiß, fühlt sich Python viel mühsamer an, als ich es gewohnt bin zu lernen und zu benutzen. Wir werden in nächster Zeit nicht wissen, ob der Siegeszug von Python weitergehen wird oder ob er seinen Höhepunkt bereits erreicht hat. Ich habe keine besonderen Vorhersagefähigkeiten, aber ich bin pessimistisch.

Julia

Julia hat die Vor- und Nachteile, ein Nachzügler zu sein. Ich applaudiere den Julia-Schöpfern dafür, dass sie dachten, sie könnten es besser machen:

Wir wollen eine Sprache, die Open Source ist, mit einer liberalen Lizenz. Wir wollen die Geschwindigkeit von C mit der Dynamik von Ruby. Wir wollen eine Sprache, die homoikonisch ist, mit echten Makros wie Lisp, aber mit offensichtlicher, vertrauter mathematischer Notation wie Matlab. Wir wollen eine Sprache, die für die allgemeine Programmierung so gut geeignet ist wie Python, für die Statistik so einfach wie R, für die Zeichenkettenverarbeitung so natürlich wie Perl, für die lineare Algebra so leistungsfähig wie Matlab und für das Zusammenfügen von Programmen so gut wie die Shell. Etwas, das einfach zu erlernen ist, aber auch die ernsthaftesten Hacker zufrieden stellt. Wir wollen es interaktiv und wir wollen es kompiliert haben.

Ich glaube, das ist ihnen zum großen Teil gelungen. Auf dem Weg zu Version 1.0 schienen sie die REPL ein wenig herunterzuspielen, und es gab einige fast grundlose Abkehr von MATLAB. (Wie genau ist LinRange besser als linspace?) Das sind allerdings Spitzfindigkeiten.

Dies ist die erste Sprache, die ich benutze, die über ASCII hinausgeht. Die Verwendung von Variablen wie ϕ und Operatoren wie bereitet mir immer noch eine unangemessene Freude. Es ist mehr als nur kosmetisch; die Möglichkeit, den mathematischen Ausdrücken, die wir schreiben, ähnlicher zu werden, ist ein echtes Plus, auch wenn es den Unterricht und die Dokumentation etwas erschwert.

Die Arbeit mit Julia hat mir gezeigt, dass ich einige Programmiergewohnheiten aufgrund der Entscheidungen von MATLAB übernommen habe und nicht wegen der inhärenten Überlegenheit. Die Vektorisierung ist für viele Dinge nicht selbstverständlich. Es ist erstaunlich, dass man in Julia jede Funktion vektorisieren kann, indem man einfach einen Punkt an ihren Namen anhängt. Die Konstruktion einer Matrix durch eine Comprehension lässt verschachtelte Schleifen (oder meshgrid-Tricks) im Vergleich dazu wie fehlerhafte Peitschenhiebe aussehen, und die völlige Vermeidung einer Matrix durch einen Generator für eine einfache Summierung fühlt sich an, als ob man etwas umsonst bekommt. (Mir ist bewusst, dass Python ähnliche Sprachmerkmale hat.)

Das große Merkmal der Mehrfachabfertigung macht einige Dinge viel einfacher und klarer als die Objektorientierung. Nehmen wir zum Beispiel an, Sie haben die Klassen Wall und Ball in einer traditionellen objektorientierten Sprache. Welche Klasse soll eine Kollision eines Balls mit einer Wand erkennen? Oder brauchen Sie eine Raumklasse, um den Schiedsrichter zu spielen? Diese Art von Fragen können mich zur Verzweiflung bringen. Bei Multiple Dispatch werden die Daten in Objekttypen verpackt, aber die Methoden, die mit den Daten arbeiten, sind nicht an eine Klasse gebunden. So weiß

function detect_collision(B::Ball,W::Wall)

über die Typen Bescheid, ist aber unabhängig von ihnen definiert. Ich habe ziemlich viel programmiert, um zu begreifen, wie interessant und potentiell wichtig der Begriff der mehrfachen Abfertigung für die Erweiterung der Sprache ist.

Das numerische Ökosystem hat sich schnell entwickelt. Mein bestes Beispiel ist DifferentialEquations.jl, geschrieben von dem erstaunlichen Chris Rackauckas. Wenn diese Software nicht bald den Wilkinson-Preis gewinnt, ist das System kaputt. Gehen Sie einfach auf die Website und bereiten Sie sich darauf vor, konvertiert zu werden.

Ich habe noch nicht die großen Geschwindigkeitsgewinne gegenüber MATLAB gesehen, die Julia verspricht. Das liegt zum Teil an meiner relativen Unerfahrenheit und der Art der Aufgaben, die ich erledige, zum Teil aber auch daran, dass MathWorks unglaubliche Arbeit bei der automatischen Code-Optimierung geleistet hat. Es ist sowieso kein Aspekt der Programmierung, auf den ich mich die meiste Zeit konzentriere.

Es hat eine Weile gedauert, bis ich mich mit der Programmierung in Julia wohlgefühlt habe (vielleicht werde ich einfach alt und kristallisiert). Es zwingt mich dazu, mehr über Datentypen nachzudenken, als mir lieb ist, und es gibt immer den heimlichen Verdacht, dass ich den richtigen Weg für etwas übersehen habe. Aber für den täglichen Gebrauch ist die Wahrscheinlichkeit, dass ich mich Julia zuwende genauso groß wie MATLAB.

Das Fazit

MATLAB ist die Lösung für Unternehmen, besonders für Ingenieure. Es ist wahrscheinlich immer noch die am einfachsten zu erlernende Software für grundlegende numerische Aufgaben. Eine sorgfältige Dokumentation und jahrzehntelange Lernwerkzeuge sind definitiv wichtig.

MATLAB ist die BMW-Limousine der wissenschaftlichen Computerwelt. Es ist teuer, und das ist noch bevor man über das Zubehör (Toolboxen) spricht. Sie zahlen für eine grundsolide, reibungslose Leistung und einen guten Service. Es zieht auch eine unverhältnismäßig große Menge an Hass auf sich.

Python ist ein Ford Pickup. Er ist allgegenwärtig und wird von vielen (in den USA) geliebt. Er kann alles, was man will, und er ist für einige Dinge gebaut, die andere Fahrzeuge nicht können. Wahrscheinlich werden Sie ihn ab und zu ausleihen wollen. Aber ein großartiges reines Fahrerlebnis bietet er nicht.

Julia ist ein Tesla. Er wurde mit dem kühnen Ziel gebaut, die Zukunft zu verändern, und das könnte er auch. Vielleicht wird er aber auch nur eine Fußnote sein. Aber in der Zwischenzeit werden Sie stilvoll und mit viel Power ans Ziel kommen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.