Infinitesimalrechnung mit Julia
(jverzani.github.io)- Lernnotizen, die dabei helfen, die Infinitesimalrechnung aus mehreren Perspektiven zu verstehen; sie nutzen die leicht zugängliche Syntax und Rechenleistung von Julia für Graphen und numerische Experimente
- Orientiert am Harvard-Ansatz der rule of four werden grafische, numerische, algebraische und sprachliche Perspektiven gemeinsam behandelt; mit Julia werden vor allem grafische und numerische sowie teilweise algebraische Aspekte gezeigt
- Während Computer-Algebra-Systeme wie Mathematica, Maple und Sage stark in symbolischer Verarbeitung sind, betrachtet diese Notizsammlung Julia als vorwiegend numerisches Werkzeug und ergänzt bei Bedarf algebraische Verarbeitung
- Lernende können anhand der Installations- und Interface-Anleitungen ihre Umgebung vorbereiten und mit dem Paket
CalculusWithJuliawiederkehrende Aufgaben und gemeinsame Funktionen vereinfachen - Jede Seite behandelt wie ein Buchabschnitt ein fokussiertes Konzept; am Ende lässt sich mit selbstbewerteten Aufgaben prüfen, ob die für Einstiegsaufgaben in der Infinitesimalrechnung nötigen Rechenkonzepte sitzen
Ansatz: Infinitesimalrechnung mit Julia lernen
- Calculus with Julia ist eine Sammlung von Notizen zum Lernen von calculus mit der Sprache
Julia - Julia ist eine Open-Source-Programmiersprache; in diesen Notizen werden ihre leicht erlernbare Syntax und ihre Rechenfunktionen als für das Lernen der Infinitesimalrechnung geeignetes Werkzeug eingesetzt
- Begleitend werden Dokumente zur Vorbereitung des Lernens bereitgestellt
- Getting started with Julia: Anleitung zur Installation und Benutzereinrichtung von Julia
- Julia interfaces: Anleitung zu verschiedenen Möglichkeiten, mit einer Julia-Installation zu interagieren
- Seit Mitte der 1990er-Jahre gibt es in der Lehre der Infinitesimalrechnung eine Entwicklung hin zur gemeinsamen Nutzung mehrerer Perspektiven; die Harvard-artige „rule of four“ soll möglichst grafische, numerische, algebraische und sprachliche Elemente gemeinsam einbeziehen
- Diese Notizen sind so aufgebaut, dass man mit Julia grafische und numerische Aspekte der Infinitesimalrechnung und gelegentlich auch algebraische Aspekte untersuchen kann
Unterschiede zu Computer-Algebra-Systemen
- Es gibt viele Beispiele dafür, Computer-Algebra-Systeme wie Mathematica, Maple und Sage in das Lernen der Infinitesimalrechnung zu integrieren
- WolframAlpha ruft Funktionen von Mathematica auf, erlaubt dabei aber eine flexible informelle Syntax und kann auch als Backend für Funktionen von Apple Siri dienen
- Solche Systeme modellieren algebraische und symbolische Verarbeitung im Lernkontext gut und bieten auch Mittel, numerische Aspekte zu veranschaulichen
- Diese Notizen verwenden Julia dagegen hauptsächlich als Werkzeug für numerisches Rechnen und ergänzen algebraische bzw. symbolische Verarbeitung darauf aufbauend
- Der Prozess, symbolische Verarbeitung selbst von Hand durchzuführen, kann für das Lernen nützlich sein; Computer-Algebra-Systeme können jedoch fertige Ergebnisse leicht erzeugen und diese Übung dadurch redundant erscheinen lassen
Lernumfang und Seitenaufbau
- Ziel ist es, mithilfe von Technologie an Konzepte der Infinitesimalrechnung heranzugehen, ohne an mechanische Details einer Computersprache gebunden zu sein
- Die Julia-Syntax wird als Sprache behandelt, deren Einstieg kaum schwieriger ist als die Nutzung eines Taschenrechners, die aber deutlich mehr Erweiterungsmöglichkeiten bietet
- Die Notizen reduzieren die Rechenkonzepte auf eine begrenzte Menge
- Schon mit dieser Menge lassen sich viele Aufgaben der Infinitesimalrechnung lösen
- Viele Aspekte der Programmierung werden nicht umfassend behandelt
- Lernende mit weitergehendem Interesse können mit Julia tiefer einsteigen
- Zu den begrenzten Rechenkonzepten gehören Operatoren, die Berechnungen der Infinitesimalrechnung auf Funktionsaufrufe der Form
action(function, arguments...)reduzieren - Mit einer kleinen, kombinierbaren Menge von Aktionen (actions) lassen sich viele Einstiegsaufgaben der Infinitesimalrechnung bearbeiten
- Jede Seite ist wie ein Buchabschnitt um ein relativ fokussiertes einzelnes Konzept aufgebaut
- Am Ende jeder Seite gibt es Aufgaben zum Selbstlösen; alle haben eine begrenzte Zahl selbstbewerteter Antworten
- Ideen stammen von Strang, Knill, Schey, Hass u. a., Rogawski u. a., Angenent, verschiedenen Wikipedia-Seiten und weiteren Quellen
Bereitgestellte Materialien und Ausführung
- Zu den Notizen gehört das Julia-Paket
CalculusWithJulia- Es stellt einfache Funktionen bereit, die häufige Aufgaben vereinfachen
- Es lädt nützliche Pakete, die wiederholt verwendet werden
- Die Notizen werden im Format eines Quarto book bereitgestellt; Informationen zu Quarto-Büchern finden sich in der Quarto-Dokumentation
- Zwar lässt sich mit Quarto eine PDF-Datei kompilieren, doch dafür müssen mehrere Teile aufeinander abgestimmt werden; das Ergebnis ist nicht optimal und die Datei ist ziemlich groß
- Eine PDF-Version zum Download wird bereitgestellt
- Beiträge können über den Link „Edit this page“ in Form von Vorschlägen für zusätzliche Themen, Fehlerkorrekturen oder Tippfehlerkorrekturen geleistet werden; Mitwirkende werden unter contributors aufgeführt
- Julia lässt sich einfach mit dem Dienstprogramm
juliaupinstallieren - Es werden auch Links zu
binder.org-Instanzen angeboten, mit denen Julia im Web ausgeführt werden kann; dabei gibt es jedoch Ressourcenbeschränkungen- Image ohne SymPy
- Image mit SymPy, längere Ladezeit
1 Kommentare
Meinungen auf Hacker News
Mein Kind kommt in die 11. Klasse und belegt gerade SVC, daher wirkt das Material für mich persönlich sehr passend.
Falls der Autor diesen Thread liest, würde mich interessieren, ob es auch für Schülerinnen und Schüler mit nur einer Einführung in Python geeignet ist.
Wichtiger ist, Aufgaben selbst zu lösen und über die Grundkonzepte nachzudenken, statt sich mit Code-Syntax zu beschäftigen; durch Üben von Hand verinnerlicht man den Stoff besser.
Der Programmierteil ist in Ordnung, aber beim schnellen Durchsehen scheinen die mathematischen Erklärungen so geschrieben zu sein, dass sie für jemanden, der Analysis nicht bereits kennt, sehr verwirrend wären; ein Schüler könnte dadurch denken, er sei schlecht in Mathematik, obwohl die Erklärung eigentlich nur unzureichend ist.
Zum Beispiel zeigt die Abbildung in [1] eine Kurve, die durch einen L-förmig schattierten Kasten ohne Achsenbeschriftungen verläuft; anschließend wird mit parametrischen Gleichungen und mehreren Substitutionen die Formel für partielle Integration hergeleitet.
Selbst wenn man partielle Integration gut kennt, ist das als Herleitung oder Erklärung der Formel so ziemlich eine der verwirrendsten Varianten, und wer das Konzept nicht schon verstanden hat, dem hilft auch die Abbildung kaum.
Wenn man schon einmal hervorragende Diagramme und klare Erklärungen wie in James Stewarts „Calculus“ gesehen hat, ist der Unterschied sehr deutlich.
Üblicherweise beginnt eine Erklärung der partiellen Integration, wie beim Autor, mit der Produktregel; man rechnet aber zuerst einige Beispiele zur Produktableitung durch, um eine Intuition für die Form der Stammfunktion des Ergebnisses aufzubauen, und leitet dann die Formel her, indem man beide Seiten integriert und das Integral aufteilt[2].
Das ist deutlich klarer und leichter nachzuvollziehen; wenn man Studierenden wirklich helfen möchte, sollte man ihnen außerdem Methoden wie die Tabellenmethode bzw. „DI“-Methode beibringen, damit sie bei mehrfacher partieller Integration nicht an den Vorzeichen verzweifeln.
[1] https://jverzani.github.io/CalculusWithJuliaNotes.jl/integra...
[2] Hier sind die Herleitungsnotizen, die ich mir beim Lernen gemacht habe. Sie sind nicht als Erklärung für Anfänger gedacht, sondern persönliche Notizen, aber dennoch viel leichter nachzuvollziehen als das obige Beispiel: https://publish.obsidian.md/uncarved/3+Resources/Public/Inte...
Daher würde ich Kleppner und Ramseys Quick Calculus empfehlen.
Kein anderes Buch, das ich benutzt habe, kam diesem Buch nahe, wenn es darum ging, Intuition für erstmals gelernte Konzepte aufzubauen.
Sobald man das verinnerlicht hat, ist jedes gute Buch in Ordnung; auch James Stewarts Buch ist hervorragend, aber es ist so umfangreich, dass man es besser wie ein Nachschlage- und Übungsbuch nutzt, aus dem man geeignete Lesestücke und Aufgaben auswählt, statt ab Seite 1 jede Aufgabe zu bearbeiten.
Entscheidend ist, von Anfang an ein solides Verständnis dafür zu bekommen, was Ableitungen, Integrale und Grenzwerte eigentlich sind; darin war Quick Calculus überragend.
Wenn der Schüler an Programmierung interessiert ist, kann man dieses Julia-Buch oder ein ähnliches Buch gut nutzen, um nach eigenem Ermessen passende Übungen auszuwählen und Stewart zu ergänzen; wenn gewünscht, lassen sie sich auch problemlos in Python lösen.
Ich habe im selben Alter als Methode zur Festigung meiner Analysis-Kenntnisse einen numerischen Integrator und einen symbolischen Differenzierer in Python implementiert; beides war lehrreich und hat Spaß gemacht.
Besonders symbolische Differentiation fühlte sich wie Magie an, bestand am Ende aber daraus, zu parsen und nach und nach jede Regel aus der Mathematik hinzuzufügen.
Die Analysis, die ich in der Schule in den letzten zwei Jahren gelernt habe, ähnelte den vorherigen Jahrgängen: Man lernte verschiedene Algorithmen zum Manipulieren von Symbolen, brauchte etwas Intuition und einige Fakten über Steigungen und Flächen, um Textaufgaben zu lösen.
Das Erste, was wir lernten, war die Regel, dass die Ableitung von x^n gleich n x^(n-1) ist, als Teil eines Ableitungsalgorithmus.
An der Universität hieß dasselbe Fach Analysis und bestand darin, verschiedene Begriffe zu definieren und ihre Eigenschaften zu beweisen.
Solche Kurse folgen im Allgemeinen einer dreiteiligen Struktur: Folgen und Reihen sowie Konvergenz gegen Grenzwerte, Stetigkeit von Funktionen und Grenzwerte von Funktionen, Differentiation und Integration sowie vielleicht Teile des Satzes von Taylor.
Seit Cauchy in seinem Lehrbuch viele „moderne“ Definitionen eingeführt hat, hat sich diese Struktur kaum verändert; eine offensichtliche Ausnahme ist höchstens das Integral, das als Riemann-Integral bekannt ist.
Ich weiß nicht, um welche Art von Kurs es sich hier handelt, aber da er mit Grenzwerten beginnt, könnte er eher zur letzteren Variante gehören; in diesem Fall bin ich nicht sicher, wie nützlich Julia wäre.
Der entscheidende Punkt bei der Eignung scheint mir zu sein, dass eher mathematische Reife als Programmierung verlangt werden könnte.
Mit mathematischer Reife meine ich hier in etwa die Fähigkeit, mit präzisen Definitionen und abstrakten Konzepten umzugehen, ohne daraus massenhaft falsche Schlussfolgerungen zu ziehen, und Argumentationen in Form mathematischer Beweise folgen zu können.
Ich habe ein wenig in dem Buch herumgeblättert, fand es interessant und könnte mir vorstellen, Kindern zu empfehlen, Analysis auf diese Weise zu lernen.
Allerdings macht mich die Aussage im ersten Absatz des Vorworts neugierig: „Julia ist eine Open-Source-Programmiersprache mit leicht zu erlernender Syntax und eignet sich gut für diese Aufgabe.“
Warum ist Julia besser geeignet als andere Sprachen?
Wie in der üblichen mathematischen Notation wird es als implizite Multiplikation verstanden, wenn man einen Skalar vor eine Variable setzt; wenn x zum Beispiel 2 ist, wird 3x zu 6 ausgewertet.
Auch die Unicode-Unterstützung ist umfangreich: Operatoren wie ∈ und ∉ mögen etwas übertrieben wirken, funktionieren aber wie erwartet; π ist vordefiniert und sogar ein irrationaler Datentyp, und auch √ kann als Operator verwendet werden, sodass √2 ein gültiger Ausdruck ist, der zu einem Gleitkommawert wird.
Julia unterstützt diese Syntax nicht nur, sondern bietet auch einfache Möglichkeiten, sie einzugeben.
Etwas weniger direkt mit Analysis verbunden, aber Vektoren und Matrizen sind First-Class-Datentypen, wodurch sie sich viel einfacher eingeben und visuell erfassen lassen als in Python.
Es ist der Unterschied zwischen
m = [1 2 3; 4 5 6; 7 8 9]undm = [[1, 2, 3], [4, 5, 6], [7, 8, 9]].Die Transposition geht mit dem Ein-Zeichen-Operator
', das Skalarprodukt ist mit dem Punktoperatorm ⋅ nmöglich, undA\bverhält sich wie in Matlab.Außerdem unterstützt Julia Broadcasting und hat auch Comprehensions, aber persönlich brauchte ich dank Broadcasting Comprehensions seltener.
Rationale Zahlen sind ebenfalls eingebaut und verwenden eine sehr einfache Syntax wie
1//2.Der wichtigste „Konkurrent“, Python, ist berüchtigt für seine wenig gelungene Syntax für mathematische Operationen; die Mathematikunterstützung in der Standardbibliothek ist klein, das Typsystem eingeschränkt und die Ausführungsgeschwindigkeit sehr schlecht.
Julia löst diese Probleme und bietet zugleich eine relativ gut lesbare Sprache, ähnelt oft mathematischer Notation und hat ziemlich ordentliche Performance.
f’undf’’ermöglicht.Nach meiner persönlichen Erfahrung ist das beste „Analysis-Buch“ Learn Physics with Functional Programming, das nicht Julia, sondern Haskell verwendet und nur von einer Bibliothek zum Zeichnen von Graphen abhängt.
https://www.lpfp.io/
Julia ist als „Programmiersprache für Mathematik“ bekannt, und diese Ausrichtung hat einen großen Teil der Entwicklung geprägt.
Explizit unterstützt sie viele mathematische Notationen, die zu Handschrift oder LaTeX-Symbolen passen.
Implizit scheint damit eine im Python-Stil vereinfachte Syntax gemeint zu sein, breite Interoperabilität, die Nutzung von SymPy, dem in diesem Tutorial viel Arbeit überlassen wird, eingebaute Grundbausteine für paralleles Rechnen sowie JIT-Kompilierung, die schnelles Iterieren und Erkunden ermöglicht.
https://computationalthinking.mit.edu/Spring21/
Sehr kurz gesagt: Die Sprache ist Python in gewisser Weise ähnlich und ebenso leicht zu schreiben, hat aber eine deutlich reichhaltigere Syntax, um Mathematik direkt auszudrücken.
Auch die Notebooks sind reichhaltiger.
Der zentrale Unterschied ist, dass man in Python-Notebooks Zellen ausführt, während Julia-Notebooks Dinge wie Abhängigkeiten behandeln.
Wenn man x in eine Zahl oder einen Slider ändert, wird alles Abhängige aktualisiert.
Definiert man einen Graphen und fügt einen Slider hinzu, funktioniert es einfach.
Ich bin auch kein Julia-Experte und arbeite meist mit Python und JavaScript, aber in ähnlichen Kursen treten diese beiden Punkte sehr deutlich hervor.
Dazu kommt die sehr häufig genutzte Unicode-Unterstützung, und in vielen Fällen kann es absichtlich wie Pseudocode aussehen.
Interessanterweise habe ich, weil ich ML lernen möchte, kürzlich begonnen, Mathematik wieder aufzufrischen, also lineare Algebra, Analysis und Statistik.
Während ich die verschiedenen Inhalte lerne, probiere ich auch einfache Python-Implementierungen aus; peinlicherweise hatte ich vorher noch nie Python benutzt.
Es ist ziemlich schön, Vektoren drehen und Funktionen mit matplotlib zeichnen zu können.
Von Hand könnte ich sie auch zeichnen, aber nicht so hübsch.
Bei der Gestaltung solcher Kurse muss man etwas vorsichtig sein.
Meist ist es wahrscheinlich für Leute am interessantesten, die bereits sowohl Analysis als auch Programmierung bis zu einem gewissen Grad kennen; wer eigentlich zur erwarteten Zielgruppe gehört und eines von beidem lernt, ist auf so einen Kurs möglicherweise weniger vorbereitet.
Als ich persönlich versucht habe, ein etwas exotisches Computeralgebrasystem wie Maxima oder Sagemath in einen Analysis-Kurs einzubauen, war die Reaktion bestenfalls lauwarm.
Ein Teil des Problems war meiner Ansicht nach, dass Erstsemester wenig Interesse daran haben, für ein Fach, das kein Informatikkurs ist, Software zu installieren.
In etwas fortgeschritteneren Kursen kann es als optionales Element allerdings recht gut funktionieren, und in einem Kurs zu gewöhnlichen Differentialgleichungen habe ich mit Python-Projekten sehr gute Ergebnisse erzielt.
Dass Python keine Nischensprache ist, hat sicher ebenfalls geholfen.
Trotzdem denke ich, dass sich diese Herausforderung am Ende lohnt und besser ist, als alles von Hand berechnen und Werte in Tabellen nachschlagen zu lassen.
Ich würde mich freuen, wenn du Referenzmaterial teilen könntest, ganz gleich ob Vorlesungsnotizen, Code, Folien, Bücher oder Ähnliches.
Passend dazu gibt es, falls man Emacs verwendet, das Calc-Paket mit Unterstützung für Computeralgebra.
Kürzlich habe ich eine Oberfläche veröffentlicht, die Calc deutlich leichter nutzbar macht, und hier darüber geschrieben:
http://yummymelon.com/devnull/mathing-in-emacs-with-casual.h...
https://www.emacswiki.org/emacs/MaximaMode
Das Konzept gefällt mir
Allerdings wäre es meiner Meinung nach viel besser gewesen, wenn dieses Material auf etwas wie MOOCulus aufgebaut worden oder daraus hervorgegangen wäre
https://ximera.osu.edu/mooculus/calculus1
Insgesamt bevorzuge ich MOOCulus
Trotzdem ist der Mehrwert von Calculus with Julia groß
Es wäre schön, wenn sich die beiden irgendwie integrieren ließen
Der Kern von MOOCulus ist, dass die Qualität der Texte besser ist, sie deutlich weniger ausschweifend sind und die integrierten Übungsaufgaben die Studierenden dazu bringen, den Inhalten sorgfältig zu folgen
Es wird häufig im Unterricht eingesetzt und ist auch ziemlich ausgereift
Wenn man es forken und Julia ergänzen würde, wäre das eine sehr große Verbesserung; Gleiches dürfte für zusätzliche Anwendungsbeispiele gelten
Außerdem enthält schon das erste angeklickte „Equal or Not?“ einen Fehler
Auch die Kombination aus Maxima und Gnuplot samt mitgelieferter Dokumentation ist ziemlich gut
Ich erinnere mich, dass es auch eine recht gelungene PDF-Einführung/einen Leitfaden zu Maxima gab
Kann Julia für jemanden, der Matlab verwendet hat, ein brauchbarer Ersatz sein?
Die detaillierten Unterschiede findet man unter https://docs.julialang.org/en/v1/manual/noteworthy-differenc...
Es ist etwa so, als würde man jemandem in der Hölle ein Glas Eiswasser reichen
Um Steve Jobs’ Aussage über iTunes für Windows zu bemühen — wobei iTunes damals natürlich noch nicht das spätere Chaos war
Ich habe großen Respekt vor dem, was Cleve Moler und Matlab geleistet haben, insbesondere dafür, LINPACK und EISPACK usw. leicht zugänglich gemacht zu haben
Anfangs gab es nur einen einzigen Datentyp, nämlich Matrizen, und es wurde auch viel unternommen, um diese Einschränkung zu überwinden
Aber Julia ist als moderne Allzwecksprache deutlich angenehmer zum Arbeiten und behält zugleich fast die gesamte Stärke von Matlab
Es ist deutlich schneller, hat als Programmiersprache im Allgemeinen viele bessere Funktionen, und Parallelisierung ist viel einfacher
Aus der Perspektive von jemandem, der beide beruflich genutzt hat, würde ich sagen, dass Julia heute in der Regel die bessere Wahl ist
Allerdings gibt es in Sprachen wie Matlab oder Stata bereits eine enorme Zahl implementierter bestehender Algorithmen, und es kann sein, dass es in Julia keine entsprechende Implementierung gibt
Wenn man genau einen davon braucht, ist es oft schwer, die Nutzung einer anderen Sprache zu rechtfertigen
In der Praxis war es meist ziemlich einfach, Matlab-/Python-/Stata-Code nach Julia zu portieren
Julia-Code kann deutlich besser aussehen und deutlich performanter sein als Matlab-Code
Wenn nicht, fühlt sich Julia gut an und wird ein ausreichender Ersatz sein
Die Syntax ist in gewissem Maß ähnlich, und es bietet viele der Komfortfunktionen von MATLAB im Umgang mit Arrays
Außerdem bietet es ein gutes Typsystem und eine deutlich bessere Handhabung allgemeiner Programmierung; Dinge wie etwa der Speicherort von Funktionen verhalten sich nicht seltsam
Ich empfehle, es selbst auszuprobieren
Der PDF-Link im Seitenkopf führt zu einem 404
„Diese Notizen können über Quarto zu einer PDF-Datei kompiliert werden. Da das Ergebnis ziemlich groß ist, wird keine Datei zum Download bereitgestellt. Interessierte Leser können das Repository herunterladen, die Umgebung instanziieren und anschließend im Unterverzeichnis quarto Quarto ausführen, um es als PDF zu rendern; dadurch wird die Datei erzeugt. Das dauert eine Weile.“
„Rechnen ist eine Versuchung, der man so lange wie möglich widerstehen sollte“
— J.P. Boyd