Mathematica V13

Start der Version 13.0 von Wolfram Language + Mathematica

Der Marsch der Innovation geht weiter

by Stephen Wolfram

Erst vor wenigen Wochenhieß es 1/3 des Jahrhundertsseit Mathematica 1.0 wurde veröffentlicht. Ich freue mich, Ihnen heute die neuesten Ergebnisse unserer langjährigen Forschungs- und Entwicklungsarbeit vorstellen zu können: Version 13 von Wolfram-Sprache and Mathematica. (Ja, das 1, 3 Thema—zusammen mit der Tatsache, dass heute der 13. des Monats ist – ist amüsant, wenn auch zufällig).

207 Tage – oder etwas mehrals 6 Monate – ist es her, dass wir Version 12.3. veröffentlicht haben. Und ich freue mich, sagen zu können, dass in dieser kurzen Zeit eine beeindruckende Menge an Forschung und Entwicklung entstanden ist: nicht nurins gesamt 117 völlig neue Funktionen, sondern auch viele Hunderte von aktualisierten und verbesserten Funktionen, mehrere Tausend Fehlerbehebungen und kleine Verbesserungen und eine Vielzahl neuer Ideen, um die Nutzung des Systems noch einfacher und reibungsloser zu gestalten.

Jeden Tag, jede Woche, jeden Monat haben wir im letzten Drittel des Jahrhunderts hart daran gearbeitet, das riesige integrierte Framework, das Mathematica und die Wolfram Language sind, zu erweitern. Und jetzt können wir die Ergebnisse all diese reinzelnen Ideen, Projekte und Arbeiten sehen: einstetiger Paukenschlag der Innovation, der sich nun über mehr als ein Drittel eines Jahrhunderts erstreckt:

Dieser Plan spiegelt eine Mengeharter Arbeit wider. Aber sie spiegeltauch etwas anderes wider: den Erfolg der zentralen Designprinzipien der Wolfram Language. Denn diese haben es ermöglicht, dass das mittlerweileriesige System seine Kohärenz und Konsistenz bei behält – und immer stärker wird. Was wir heute bauen, ist nicht von Grund auf neu, sondern baut auf dem riesigen Turm von Fähigkeiten auf, den wir zu vorgebaut haben. Deshalb sind wir in der Lage, so weit zu gehen, so viel zu automatisieren und so viel zu erfinden.

In Version 1.0 gab es insgesamt 554 Funktionen Doch zwischen Version 12.0 und Version 13.0 haben wir nun insgesamt 635 neue Funktionen hinzugefügt (zusätzlich zu den 702 Funktionen, die aktualisiert und erweitert wurden).

Und es ist so gar noch beeindrucken der als das. Denn wenn wir heute eine Funktion hinzufügen, sind die Erwartungen so viel höher als 1988 – weil wir so viel mehr automatisieren können und so viel mehr in das gesamte System integrieren müssen, mit dem wir uns verbinden müssen. Und natürlich können wir heute eine vielleicht hundertmal umfangreichere und detailliertere Dokumentation schreiben, als jemals in das (gedruckte) Mathematica-Buch von 1988.
Die gesamte Spannedessen, was ist neu in Version 13 relativ zu Version 12 ist sehr umfangreich und beeindruckend. Aber ich werde mich hier nur darauf konzentrieren, was in Version 13.0 im Vergleich zu Version 12.3 neu ist; ich habe schon früher darüber geschrieben Version 12.1, Version 12.2 und Version 12.3.

Vergessen Sie die Integrale nicht!

Im Jahr 1988 war eines der Merkmale von Mathematica 1.0 was die Leute wirklichmochten, war die Möglichkeit, Integrale symbolisch zu berechnen. Im Laufe der Jahre haben wir die Palette der möglichen Integrale schrittweise erweitert. Und ein Drittel des Jahrhunderts später – in Version 13.0 – machen wir einen weiteren Sprung nachvorn.
Hier ist ein Integral, das bisher nicht „in geschlossener Form“ gelöst werden konnte, aber in Version 13.0 ist es möglich:

Jedes Integral einer algebraischen Funktion kann im Prinzip mit Hilfe unserer allgemeinen DifferentialRoot-Objekte berechnet werden. Die größere algorithmische Herausforderung besteht jedoch darin, eine „menschen freundliche Antwort“ in Form von bekannten Funktionen zu erhalten. Das ist eine heikle Angelegenheit, bei der eine kleine Änderung eines Koeffizienten eine große Auswirkung auf die möglichen Reduktionen haben kann. Aber in Version 13.0 gibt es jetzt viele Integrale, die früher nur in Form von speziellen Funktionen gelöst werden konnten, jetzt aber Ergebnisse in Form von elementaren Funktionen liefern. Hier ist ein Beispiel:

In Version 12.3 konnte das gleiche Integral immer noch durchgeführt werden, aber nur in Bezug auf elliptische Integrale:

Mathematische Funktionen: Ein Meilenstein ist erreicht

Damals, als man noch Integrale und Ähnliches von Hand machen musste, war es immer spannend, wenn man entdeckte, dass man sein Problem mit einer exotischen Formel lösen konnte “besondere Funktion” von denen man vorher noch nicht ein mal gehört hatte. Spezielle Funktionen sind in gewissem Sinne ein Weg, um Verpackung mathematischer Kenntnisse: Wenn Sie wissen, dass die Lösung Ihrer Gleichung eine Lamé-Funktionist, sagt Ihnen das sofort eine Menge mathematischer Dinge über sie.
In der Wolfram-Sprache,Wir haben Spezialfunktionen schon immer sehr ernst genommen und unterstützen nicht nur eine große Anzahl von ihnen, sondern ermöglichen auch die Auswertung dieser Funktionen nach jede numerische Präzision, und sie an einer ganzen Reihe von symbolischen mathematischen Operationen teilnehmen zu lassen.
Als ich vor etwa 45 Jahren anfing, spezielle Funktionen zu verwenden, war das Buch, das die Standardreferenz war Abramowitz & Stegun’s 1964 Handbook of Mathematical Functions. Darin waren Hunderte von Funktionen aufgelistet, einige davonweit verbreitet, andereweniger. Und im Laufe der Jahre haben wir bei der Entwicklung der Wolfram Language immer mehr Funktionen abgehakt weitere Funktionen von Abramowitz & Stegun.
Und in Version 13.0 sind wir endlich fertig! Alle Funktionen in Abramowitz & Stegun sind nun vollständig in der Wolfram Language berechen bar. Die letzten Funktionen, die hinzu gefügt wurden, waren die Coulomb wave functions (relevant für die Untersuchung von Quantenstreuungsprozessen). Hier sind sie in Abramowitz & Stegun:

Und hier ist – ab Version 13 – wie man das erste Bild in Wolfram Language erhält:

Natürlich steckt mehr dahinter, wie wir jetzt sehen können:

Eine andere Art von Zahl

Man könnte meinen, dass eine Zahle in fach eine Zahl ist. Und das stimmt im Grunde auch für ganze Zahlen. Aber wenn eine Zahl einere elle Zahl ist, ist die Geschichte komplizierter. Manchmal kann man einere elle Zahl symbolisch „benennen“, zum Beispiel. Aber die meisten reellen Zahlen haben keine „symbolischen Namen“. Und um sie genau zu benennen, müsste man eine unendliche Anzahl von Ziffernoder das Äquivalent angeben. Das führt dazu, dass man am Ende ungefährere elle Zahlen haben möchte, von denen man annehmen kann, dass sie bestimmte ganze Sammlungen von reellen Zahlen repräsentieren.

Eine einfache Möglichkeit, dies zu tun, ist die Verwendung von Zahlen mit endlicher Genauigkeit, wie in:

Ein anderer Ansatz, der in Version 12.0 ein geführt wurde, ist Around, der eine Verteilung von Zahlen darstellt, die „zufällig“ um eine bestimmte Zahl her umverteilt sind:

Wenn Sie Operationen an Rund um Zahlenwerden die „Fehler“ mit Hilfe eines bestimmten Fehlerkalküls kombiniert, das effektiv auf Gaußschen Verteilungen basiert, und die Ergebnisse sind immer in gewisser Weise statistisch.
Was aber, wenn man ungefähre Zahlen verwenden, aber den noch beweisbare Ergebnisse erhalten möchte? Ein Ansatz ist die Verwendung von Interval. In der Version 13.0 gibt es jedoch einen effizienteren Ansatz, nämlich die Verwendung von Zentriertes Intervall. Hier ist ein Zentriertes Intervall als Eingabe für eine Bessel-Funktion verwendet:

Sie können Dinge in der Wolfram Language auf viele Arten beweisen. Sie können verwenden Reduzieren Sie. Sie können verwenden FindEquationalProof. Und Sie können CenteredInterval—was in der Tat die numerische Auswertung ausnutzt. Hier ist eine Funktion, die komplizierte transzendentale Wurzeln hat:

Können wir beweisen, dass die Funktion zwischen 3 und 4 über 0 liegt? Berechnen wir die Funktion über ein zentriertes Intervall dort:

Sowie eine Menge anderer Mathe…

Wie in jeder neuen Version des Wolfram Language, Die Version 13.0 enthält viele spezifische mathematische Verbesserungen. Ein Beispiel ist eine neue, bequeme Möglichkeit, die Pole einer Funktion. Hier ist eine bestimmte Funktion in der komplexen Ebene aufgetragen:
Und hier sind die genauen Pole (und ihre Vielfachen) für diese Funktion inner halb des Einheitskreises:

Und aus der Art und Weise, wie das Intervall „im schlimmsten Fall“ berechnet wurde, er gibt sich nun ein eindeutiges Theorem.

Nun können wir die Residuen an diesen Polen summieren und verwenden Cauchy’s theorem um ein Konturintegral zu erhalten

Auch im Bereich der Infinitesimal rechnung haben wir verschiedene Erleichterungen bei der Behandlung von Differentialgleichungen eingeführt. Zum Beispiel unterstützen wir jetzt direkt Vektorvariablen in ODEs:

Mit Hilfe unserer graphentheoretischen Fähigkeiten konnten wir auch unseren Umgang mit ODE-Systemen erheblich verbessern, in dem wir Wege gefunden haben, sie in block diagonale Formen zu „entwirren“, die es unser möglichen, symbolische Lösungen in viel komplexer en Fällen als bisher zu finden.
Bei PDEs ist es in der Regel nichtmöglich, allgemeine „geschlossene“ Lösungen für nichtlineare PDEs zufinden. Aber manchmal kann man bestimmte Lösungen erhalten, die als vollständige Integrale (in denen es nur beliebige Konstanten gibt, nicht „ganze“ beliebige Funktionen). Und jetzt haben wir eine explizite Funktion, um diese zu finden:

Um von der Infinitesimal rechnung zur Algebra überzugehen, haben wir die Funktion PolynomialSumOfSquaresList die eine Art „Positivitätsnachweis“ für ein multivariates Polynom liefert. Die Idee ist, dass, wenn ein Polynom in eine Summe von Quadratenz erlegt werden kann (und das können die meisten, aber nicht alle, die niemals negativ sind), dies beweist, dass das Polynomtatsächlich immer nicht-negativ ist:

Und ja, die Summierung der Quadrate ergibt wieder das ursprüngliche Polynom

In Version 13.0 haben wir auch einige neue Matrixfunktionen hinzugefügt. Es gibt Adjugieren, was im Wesentlichen die Umkehrung einer Matrix ist, ohne jedoch durch die Determinante zu dividieren. Und es gibt DrazinInverse die die Umkehrung des nichtsingulären Teils einer Matrix angibt – wie sie ins besondere bei der Lösung von differential-algebraischen Gleichungen verwendet wird.

Mehr PDE-Modellierung: Festkörper- und Strukturmechanik

PDEs sind sowohl schwierig zu lösen als auch schwierig für bestimmte Situationen einzurichten. Im Laufevieler Jahre haben wir hochmoderne Finite-Elemente-Lösungsfunktionen für PDEs entwickelt. Wir haben auch unser bahnbrechendes System für symbolische rechnerische Geometrie die es unser möglicht, Regionen für PDEs flexibel zu beschreiben. Aber beginnend in Version 12.2 haben wir noch etwas anderes getan: Wir haben begonnen, explizite symbolische Modellierungsrahmen für bestimmte Arten von physikalischen Systemen zu schaffen, die mit PDEs modelliert werden können. Wir haben bereits Wärmeübertragung, Stofftransport und Akustik. In Version 13.0 fügenwir nun Solid- und Strukturmechanik hinzu.

Für uns ist ein klassische „Testaufgabe“ war die Verformung eines Teelöffels. Hier ist, wie wir das jetzte inrichten können. Zu nächst müssen wir unsere Variablen definieren: die Verschiebungen des Löffels in jeder Richtung an jedem x-, y- und z-Punkt:

Dann müssen wir sagen, welche Materialparameter unser Löffel hat. Und hier können wir auf unsere gesamte Wissensdatenbank zurück greifen, die detaillierte Informationen über viele Arten von Materialien enthält

Jetzt sind wir bereit, das PDE-Problem aufzustellen und zu lösen:

Das Ergebnis wird in Form einer Liste von interpolierende Funktionen für die x-, y- und z-Verschiebungen. Jetzt können wir eine neue Grafikfunktion der Version 13.0 verwenden, um dieses Ergebnis sofort zu visualisieren:

Aber in diesen Interpolationsfunktionen sind praktischer weise auch viele weitere Details über die Lösung enthalten, die wir erhalten haben. Hier ist zum Beispiel der Dehnungstensor für den Löffel, der als symmetrische Anordnung von Interpolationsfunktionen angegeben ist:

Und jetzt können wir zum Beispiel die maximale 3,3-Komponente des Dehnungstensors und die Position, an der sie erreicht wird, finden
Wie wäre es, die Verteilung der Dehnungswerte über den Löffel zu ermitteln? Eine einfache Möglichkeit ist es, zufällige Punkte auf dem Löffel zu wählen

und dann ein geglättetes Histogramm der Dehnungen an diesen Punkten zu erstellen:

(Das Maximum, das wir vorhergesehen haben, befindet sich im Heck rechts.)
Die Festkörpermechanik ist ein kompliziertes Gebiet, und wir haben in Version 13 eine gute, industrietaugliche Technologie, um damit um zugehen. Wir haben sogar eine ganze Monographie mit dem Titel „Solid Mechanics Model Verification„, die beschreibt, wie haben wir unsere Ergebnisse validiert. Wir stellen auch eine allgemeine Monographie über Festkörpermechanik zur Verfügung, in der beschrieben wird, wie man bestimmte Probleme mit unserem Technologiepaket lösen kann

Videos aus Bildern und Videos erstellen

Unter Version 12.3 haben wir Funktionen wie AnimationVideo und SlideShowVideo die es einfach machen, Videos ausgenerierten Inhalten zu erstellen. In Version 13.0 haben wir nun auch eine Sammlung von Funktionen, um Videos aus vorhandenen Bildern und Videos zu erstellen.
Übrigens, bevor wir zum Erstellen von Videos kommen, eine weitere wichtige neue Funktion in Version 13.0 ist, dass es jetzt möglich ist, Videos direkt in einem Notebook abzuspielen:
Dies funktioniert sowohl auf dem Desktop als auch in der Cloud, und Sie erhalten alle Standard-Videosteuerelemente direkt im Notizbuch, können das Video aber auch ausklappen, um es mit einem externen (z. B. bildschirmfüllenden) Viewer anzusehen. (Sie können ein Video jetzt auch einfach mit AnimatedImage um es in eine „GIF-ähnliche“ Frame-

basierte Animation zuverwandeln).
OK, also zurück zur Erstellung von Videos aus Bildern. Nehmen wir an, Sie haben ein großes Bild:

Ein guter Weg, ein solches Bild zu „erleben“, kann ein „Tour-Video“ sein, das verschiedene Teile des Bildes nach ein ander besucht. Hier ist ein Beispiel dafür, wie das geht:

Sie können sowohl zoomen als auch schwenken:
Nehmen wir als anspruchsvolleres Beispiel ein klassisches „Physikbild“:

Auf diese Weise werden die Positionen aller Gesichter ermittelt und dann eine kürzeste Tour zu jedem dieser Gesichter berechnet

Jetzt können wir eine „Gesichtstour“ durch das Bild erstellen:

Wir können nicht nur von Bildern zu Videos wechseln, sondern auch von Videos zu Videos. GridVideo
nimmt mehrere Videos auf, ordnet sie in einem Raster an und erstellt ein kombiniertes neues Video:

Wir können auch ein einzelnes Video nehmen und es als eine Reihe von Video- und Audioschnipseln zusammen fassen, die zum Beispiel in gleichen Abständen im Video ausgewählt werden. Stellen Sie sich dies als eine Video-Version von VideoFrameList vor. Hier ist ein Beispiel für die

„Zusammenfassung“ eines 75-minütigen Videos:

In Version 13.0 wurden einige praktische Funktionen für den Umgang mit Videos hinzu gefügt. Eine davon ist OverlayVideo, mit der Sie ein Video mit einem Bild als „Wasser zeichen“ versehen oder so etwas wie ein „Bild-im-Bild“-Video einfügen können:

Viele Bildoperationen lassen sich nun auch direkt auf Videos anwenden. Um beispiels weise ein Video zu beschneiden, müssen Sie nur ImageCrop verwenden:

Image Stitching

Nehmen wir an, Sie haben eine Reihe von Bildern aus verschiedenen Winkeln aufgenommen und möchten sie nun zusammenfügen. In Version 13.0 haben wir das sehr einfach gemacht – mit der Funktion ImageStitch:

Ein Teil der Arbeit beim Stitching von Bildern besteht darin, Schlüsselpunkte in Bildern zu finden. Und in Version 13.0 haben wir zwei weitere Methoden (SIFT und RootSIFT) hinzugefügt, um ImageKeypoints. Aber das Ausrichten von Schlüsselpunkten ist nicht das Einzige, was wir beim Zusammenfügen von Bildern tun. Wir führen auch Dinge wie Helligkeits aus gleich und Objektivkorrektur sowie das Überblenden von Bildern über Nahtstellen hinweg durch.
Das Zusammenfügen von Bildern kann mit folgenden Optionen verfeinert werden TransformationClass—die angeben, welche Transformationen beim Zusammenfügen der einzelnen Bilder zu lässig sein sollen.

Die Bäume wachsen weiter

In Version 12.3 haben wir Tree als grundlegendes Konstrukt eingeführt. In 13.0 erweitern wir Tree und fügen einige Erweiterungen hinzu. Zu nächst einmal gibt es jetzt Optionen für das Layout und die Visualisierung des Baums.
Hier wird zum Beispiel ein Baum radial angeordnet (da es sich um einen Baum und nicht um einen allgemeinen Graphen handelt, ist es möglich, systematischere Einbettungen vorzunehmen):

Dies fügt Optionen für die Gestaltung von Elementen hinzu, wo bei ein bestimmt es Element, das durch seine Baum positionspezifiziert ist, als blau hervorgehoben wird:

Eines der anspruchsvolleren neuen „Baumkonzepte“ ist TreeTraversalOrder. Stellen Sie sich vor, Sie wollen einen Baum „durch mustern“. In welcher Reihenfolge sollten Sie die Knoten besuchen? Hier ist das Standardverhalten. Richten Sie einen Baum ein:

Zeigen Sie nun, in welcher Reihenfolge die Knoten von TreeScan:

Da durch werden die Knoten explizit in der Reihenfolge ihres Besuchs gekennzeichnet:

Hier ist eine etwas aufwändigere Bestellung:

Warum ist das wichtig? Es stellt sich heraus, dass die „Traversalordnung“ mittiefgreifenden Fragen über Bewertungsprozesse und das, was ich jetzt Multicomputation nenne, zusammenhängt. In gewissem Sinne definiert eine Traversalordnung den „Bezugsrahmen“, durch den ein „Beobachter“ des Baumes diesen abtastet. Und ja, diese Sprache hört sich nach Physik an, und das aus gutem Grund: Das alles steht in engem Zusammenhang mit einer Reihe von Konzepten der fundamentalen Physik, die sich in unserem Physik-Projekt. Und die Parametrisierung der Traversalordnung – abgesehen davon, dasssiefüreineReihebestehenderAlgorithmennützlichist – öffnet die TürzurVerbindung von Rechenprozessen mit Ideen aus der Physik und neuen Vorstellungen über das, was ich als multicomputation.

Grafik-Färbung

Die graphentheoretischen Fähigkeiten von Wolfram-Sprache sind seit langem sehr beeindruckend (und waren zum Beispiel aus schlaggebend für die Ermöglichung unserer Physik-
Eine häufig geforderte Reihe von Fähigkeiten dreht sich um Graph-Färbung. Wie kann man zum Beispiel einem Graphen „Farben“ zuweisen, so dass kein Paar benachbarter Punkte die gleiche Farbe hat? In Version 13.0 gibt

es eine Funktion FindVertexColoring die das tut:

Und jetzt können wir das Diagramm mit diesen Farben „hervorheben“:

Das klassische Problem der „Graphenfärbung“ besteht darin, geografische Karten zu färben. Hier ist zum Beispiel der Graph, der die Grenzbeziehungen der US-Bundesstaaten darstellt:

Jetzt ist es ein Leichtes, eine 4-farbige Darstellung der US-Staaten zu finden:

Es gibt tatsächlich eine bemerkenswerte Reihe von Problemen, die sich auf Graphfärbung reduzieren lassen. Ein weiteres Beispiel ist die Planung eines „Turniers“, bei dem alle Paare gegen ein ander „spielen“, abe rjeder nur ein Spiel zur gleichen Zeit spielt. Die benötigte Sammlung von Spielen ist einfach der komplette Graph:

Jede Übereinstimmung entspricht einer Kanteim Diagramm:

Wenn wir nun eine „Kantenfärbung“ finden, haben wir eine Liste von möglichen „Zeitfenstern“, in denen jedes Spiel gespielt werden kann:

EdgeChromaticNumber sagt einem die Gesamtzahl der benötigten Streichhölzer:

Die Kartenfärbung bringt das Thema der planaren Graphen zur Sprache. Mit Version 13.0 werden neue Funktionen für die Arbeit mit planaren Graphen eingeführt. PlanarFaceList nimmt einen planaren Graphen und sagt uns, wie der Graph in „Flächen“ zerlegt werden kann:

FindPlanarColoring berechnet direkt eine Färbung für diese planaren Flächen. In zwischen, DualPlanarGraph ergibt einen Graphen, in dem jede Fläche ein Knoten ist:

Untergraphe-Isomorphismus und mehr

Das Themat aucht überall auf. (In unserem Physikprojekt ist es sogar etwas, was das Universum im gesamten Netzwerk, das den Weltraum darstellt, tatsächlich tut). Wo enthält ein bestimmter Graph einen bestimmten Untergraphen? In Version 13.0 gibt es eine Funktion, mit der man das heraus finden kann (in „Alle“ steht, dass man alle Instanzen angeben soll):

Ein typischer Bereich, in dem diese Art von Untergraphenisomorphismus auftritt, ist die Chemie. Hier ist die Graphenstruktur für ein Molekül

Jetzt können wir einen 6-Zyklus finden:

Jetzt können wir nach dem DominatorTreeGraph, die unseine Karte zeigt, auf der zusehen ist, welche Eckpunkte ausgehend von A kritisch sind, um wohin zu gelangen:

Dies sagt nun für jeden Scheitelpunkt aus, was sein „Dominator“ ist, d.h. was der nächst gelegene kritische Scheitelpunkt zu ihm ist:

Wenn die Grafik die kausale oder sonstige Abhängigkeit eines „Ereignisses“ von anderen darstellt, sind die Dominatoren praktisch Synchronisationspunkte, andenen alles durch einen „Faden der Geschichte“ laufen muss.

Schätzungen der räumlichen Felder

Stellen Sie sich vor, Sie haben Daten, die anbestimmten Punkten im Raum, z. B. auf der Erdoberfläche, erfasst werden. Die Daten könnten von Wetterstationen, Bodenproben, Mineralbohrungen oder vielen anderen Dingenstammen. In Version 13.0 haben wir eine Reihe von Funktionen zur Schätzung von „räumlichen Feldern“ aus Stichproben hinzugefügt (oder was manchmal als „Kriging“ bekannt ist).
Nehmen wir einige Beispieldaten und stellen sie dar:

Lassen Sie uns nun eine „räumliche Schätzung“ der Daten vornehmen:

Diese verhält sich ähnlich wie eine InterpolatingFunction, die wir an beliebiger Stelle abfragen können:

Um diese Schätzung zu erstellen, haben wir zwangsläufig ein Modell verwendet. Wir können das Modell ändern, wenn wir die räumliche Schätzung erstellen:

Jetzt werden die Ergebnisse anders ausfallen:

In Version 13.0 können Sie das Modell detailliert steuern, in dem Sie Optionen wie SpatialTrendFunction und SpatialNoiseLevel. Eine Schlüsselfrage ist, was bei lokalen Variationen des räumlichen Feldes an zunehmen ist – diese können Sie in symbolischer Form angeben mit VariogramModel.

Die richtige Zeit finden: Schaltsekunden und mehr

Ein Tag soll genau 24 Stunden haben. Nur dass die Erde das nicht weiß. Und ihre Rotationsperiode variiert mit der Zeit leicht (im Allgemeinen verlangsamt sich ihre Rotation). Um die „Tageszeit“ mit der Position der Sonne am Himmel in Einklang zu bringen, wurde der „Hack“ erfunden, bei dem man Folgendes addiert oder subtrahiert “Schaltsekunden”.
In gewissem Sinne ähnelt das Problem der Beschreibung eines Moments in der Zeit dem Problem der Geolokalisierung. Bei der Geolokalisierung geht es darum, eine Position im Raum zu beschreiben. Es reicht nicht aus, die Längen- und Breitengrade auf der Erde zu kennen; man muss auch ein „Geomodell“ haben (definiert durch den GeoModel Option), die beschreibt, welche Form die Erde annehmen soll, und damit, wie die Länge des Breitengrades der tatsächlichen räumlichen Position entsprechen soll.
Bei der Beschreibung eines Zeitmoments müssen wir in ähnlicher Weise angeben, wie unsere „Uhrzeit“ auf die tatsächliche „physikalische Zeit“ abgebildet wird. Zu diesem Zweck haben wir in Version 13.0 den Begriff eines Zeitsystems eingeführt, das durch die Option TimeSystem Option.
Dies definiert den ersten Moment des Dezembers 2021 im Zeitsystem UT1:

Hierist der erste Moment des Dezembers 2021 im TAI-Zeitsystem:

Aber obwohl beide mit der selben „Uhrenbeschreibung“ verbunden sind, entsprechen sie unter schiedlichen Zeitpunkten. Und wenn man sie subtrahiert, erhält man einen Wert ungleich Null:

Was ist hier eigentlich los? Nun, TAI ist ein auf Atomuhren basierendes Zeitsystem, in dem jeder Tag genau 24 Stunden lang ist, und der „Nullpunkt“ des Zeitsystems wurde in den späten 1950er Jahren fest gelegt. UT1 hingegen ist ein Zeitsystem, in dem jeder Tag eine Länge hat, die durch die tatsächliche Drehung der Erde definiert ist. Daraus geht hervor, dass sich die tatsächliche Erdrotation seit der Synchronisierung von TAI und UT1 in den späten 1950er Jahren so weit verlangsamt hat, dass sie nun etwa 37 Sekunden hinter der Zeit zurück bleibt, die sie bei einem präzisen 24-Stunden-Tag hätte.
Ein wichtiges Zeitsystem ist die UTC, die „zivile Standardzeit“ und de facto die Standardzeit des Internets. UTC folgt nicht der genauen Rotations geschwindig keit der Erde,
sondern addiert oder subtrahiert diskrete Schaltsekunden, wenn UT1 im Begriff ist, eine weitere Sekunde Abweichung von TAI zu erreichen, so dass UTC im Moment genau 37 Sekunden hinter TAI liegt:

In Version 12.3 haben wir Folgende sein geführt GeoOrientationData die auf einer Einspeisung von Daten über die gemessene Rotations geschwindigkeit der Erde beruht. Daraus er gibt sich die Abweichung der Tageslänge von 24 Stunden für das letzte Jahrzehnt:

(Und ja, dies zeigt, dass sich die Erdrotation – zum ersten Mal seit Beginn der Messungen in den späten 1950er Jahren – leicht beschleunigt).
Können wir die Schaltsekunden sehen, die hinzugefügt wurden, um diese Veränderungen zu berücksichtigen? Schauen wir uns ein Paar Sekunden gleich zu Beginn des Jahres 2017 im TAI-Zeitsystem an:

Nun wollen wir diese Zeitpunkte in ihre UTC-Darstellung konvertieren – mit der neuen Funktion TimeSystemConvert:

Sehen Sie sich das genau an. Erstens ist der Zeitpunkt, an dem 2016 endet und 2017 beginnt, in UTC etwas anders als in TAI. Aber es geht noch etwas Seltsameres vorsich. Ganz am Ende des Jahres 2016 zeigt die UTC eine Zeit von 23:59:60 an. Warum wurde diese Zeit nicht im Stil der „Uhrenarithmetik“ auf den nächsten Tag umgestellt? Antwort: Weil eine Schaltsekunde eingefügt wurde. (Was mich dazu bringt, mich zu fragen, wann in jenem Jahr in der Zeitzone 0 das Neujahrsfest gefeiert wurde….)
Wenn Sie glauben, dass dies nur eine Kleinigkeit ist, bedenken Sie einen anderen Punkt. In Ihrem Computer gibt es viele Zeitgeber, die den System betrieb steuern – und die auf der „globalen Zeit“ basieren. Und mit diesen Zeitgebern könnten schlimme Dinge passieren, wenn die globale Zeit „durch ein ander gerät“. Wie können wir das also angehen? In der Wolfram Language verwenden wir die „verschmierte UTC“ und verwischen die Schaltsekunde im Laufe eines Tages, in dem wir jede einzelne „Sekunde“ nicht genau eine „physikalische Sekunde“ lang machen.
Hier ist der Beginn der letzten Sekunde des Jahres 2016 in UTC:

Aber hierist es in verschmiertem UTC:

Und ja, man kann diese Zahl von der Anzahl der Sekunden an einem „Schaltsekunden-Tag“ ableiten:

Übrigens, Sie fragen sich vielleicht, warum man sich mit dieser ganzen Komplexität beschäftigen sollte. Im täglichen Leben sind Schaltsekunden eine Kleinigkeit. Aber wenn man sich mit Astronomie beschäftigt, können sie wirklich wichtig sein. Immer hinlegt das Licht in einer (Schalt-) Sekunde etwa 186.000 Meilen zurück….

Neue, schärfere geografische Karten

Karten enthalten eine Menge Daten, und ihre effiziente Bereitstellung und Darstellung (in geeigneten Projektionen usw.) ist eine schwierige Angelegen heit. In Version 13.0 haben wir die Karten durch die Verwendung von Vektorschriftarten für alle Beschriftungen deutlich „gestrafft“:

Zu mindestim Moment ist der Hintergrund standardmäßig noch ein Bitmap. Sie können auch „gestraffte“ Vektorgrafiken für den Hintergrund verwenden, allerdings dauert das Rendern dann länger:

Ein Vorteil der Verwendung von Vektorbeschriftungen ist, dass sie in allen Geoprojektionen funktionieren können (beachten Sie, dass in Version 13, wenn Sie die Region nicht für GeoGraphics, wird standardmäßig die ganze Welt angezeigt):

Eine weitere Neuerung in Version 13 ist die Möglichkeit, mehrere Hintergrunde benen zumischen. Hier ist ein Beispiel, das eine Straßenkarte mit einer durch scheinenden Reliefkarte darüber (und Beschriftungen darüber) enthält:

Geometrische Regionen: Anpassen und Bauen

Auf welchem Kreis befinden sich die Punkte, die auf einem Kreis liegen?
Hier sind zufällig ausgewählte Punkte auf einem Kreis:

Die neue Funktion RegionFit kann herausfinden, auf welchem Kreis die Punkte liegen:

Hier ist eine Sammlung von Punkten in 3D:

Dies passt zu einem Zylinder an diesen Punkten:

Eine weitere sehr nützliche neue Funktion in Version 13.0 ist ConcaveHullMesh—das versucht, eine Oberfläche aus einer Sammlung von 3D-Punkten zu rekonstruieren. Hier sind 1000 Punkte:

Die konvexe Hülle wird alles „einhüllen“:

Aber der konkave Rumpf führt dazu, dass die Oberfläche in die Konkavitäten hineingeht“:

Es gibt eine Menge Freiheiten, wie man die Oberflächere konstruieren kann. Eine weitere Funktion in Version 13 ist GradientFittedMesh, die Oberfläche aus einer Sammlung von abgeleiteten Oberflächen normalen bildet:

Wir haben geradeüber die Suche nach geometrischen Regionen aus „Punktdaten“ gesprochen. Eine weitere neue Funktion in Version 13.0 ist constructive solid geometry (CSG), die explizit Regionen aus geometrischen Primitiven aufbaut. Die Hauptfunktion ist CSGRegion, die eineVielzahl von Operationen mit Primitiven ermöglicht. Hier ist eine Region, die aus einer Schnittmenge von Primitiven gebildet wird:

Man beachte, dass es sich um eine „exakte“ Region handelt – es ist keine numerische Annäherunger forderlich. Wenn wir also nach seinem Volumen fragen, erhalten wir ein exaktes Ergebnis:

Kompliziertere Strukturen kann man hier archisch aufbauen:

Auch wenn die Integrale schwierig werden, ist es oft möglich, genaue Ergebnisse für Dinge wie das Volumen zu erhalten:

Bei einer hierarchisch aufgebauten geometrischen Region ist es möglich, sie mit CSGRegionTree:

Im Maschinenbau ist es sehr üblich, Teile zu fertigen, in dem man verschiedene Operationen durch führt, die sich leicht in CSG-Form darstellen lassen. Hier ist zum Beispiel ein etwas komplizierterer CSG-Baum

die zu einer tatsächlichen CSG-Region für ein typisches Konstruktionsteil „zusammengesetzt“ werden können:

Bei den Überlegungen zur CSG stellt sich die Frage, wann zwei Regionen „gleich“ sind. Auch wenn zum Beispiel eine Region als allgemeine Region dargestellt werden kann Polygon, kann es sich tatsächlich auch um einer eine Rectangle. Darüberhin aus kann sich die Region an einer anderen Stelle im Raum befinden und eine andere Ausrichtung haben.
In Version 13.0 wurde die Funktion RegionCongruent tests für diese:

RegionSimilar ermöglicht es auch, die Größe von Regionenzuändern:

Wenn man aberweiß, dass zwei Regionen ähnlich sind, könnte die nächste Frage lauten: Welche Transformation ist erforderlich, um von einer zur anderen zu gelangen? In Version 13.0, FindRegionTransform versucht, dies zu ermitteln:

Chemische Formeln und chemische Reaktionen

In Version 12 haben wir Folgende sein geführt Molecule als eine symbolische Darstellung eines Moleküls in der Chemie. In auf ein ander folgenden Versionen haben wir immer mehr Funktionenrund um Moleküle hinzugefügt. In Version 13.0 fügen wir z. B. die Möglichkeit hinzu, 2D- und 3D-Moleküldarstellungen mit zusätzlichen Informationen zu versehen:

Molecule bietet eine Darstellung für eine bestimmte Art von Molekül mit einer bestimmten Anordnung der Atomeim 3D-Raum. In Version 13.0 verallgemeinern wir jedoch auf beliebige chemische Formeln, in denen man die Anzahl der einzelnen Atomtypen beschreibt, ohne Informationen über Bindungen oder die 3D-Anordnung zugeben. Man kann eine chemische Formel einfach als Zeichenkette eingeben:

Allein aus der Formel lassen sich einige Eigenschaften berechnen, z. B. die Molekülmasse:

Bei einer chemischen Formel kann man nach bestimmten „bekannten“ Molekülenfragen, die diese Formel haben:

Oft gibt es viele solcher Moleküle, und man könnte zum Beispiel sehen, wie sie im „chemischen Merkmalsraum“ angeordnet sind:

Da wir nun sowohl mit Molekülen als auch mit chemischen Formeln um gehen können, ist der nächste große Schritt die chemische Reaktion. Und in Version 13.0 ist der Anfang davon die Möglich keit, eine chemische Reaktion symbolisch darzustellen.
Sie können eine Reaktionals Zeichenkette eingeben:

Hierist die Reaktion in Form von explizitenRegelndargestellt:

Dies ist jedoch noch keine ausgeglichene Reaktion. Um sie auszugleichen, können wir verwenden ReactionBalance:

Und, unnötig zu sagen, ReactionBalance ist recht allgemein, so dass es auch mit Reaktionen umgehen kann, deren Gleichgewicht die Lösung voleicht nicht trivialen diophantischen Gleichungen erfordert:

Bio-Sequenzen: Plots, Sekundärbindungen und mehr

Unter Version 12.2 haben wir das Konzept der BioSequence, um Moleküle wie DNA, RNA und Proteine darzustellen, die aus Sequenzen von diskreten Einheiten bestehen. In Version 13.0 fügen wir eineVielzahl neuer BioSequence Fähigkeiten. Eine ist BioSequencePlot, die eine unmittelbare visuelle Darstellung von Biosequenzen ermöglicht:

Aber über die Visualisierung hinausbietet Version 13.0 auch die Möglichkeit, Sekundärstrukturen in RNA, Proteinen und einzelsträngiger DNA darzustellen. Hier sehen Sie zum Beispiel ein Stück RNA mit zusätzlichen Wasserstoffbrückenbindungen:

Sie können die Sekundärstruktur auch mit der „Punkt-Klammer“-Notation angeben:

BioSequence unterstützt auch Hybridstränge, z. B. die Verknüpfung von DNA und RNA:

Molecule konvertiert BioSequence zu einer expliziten Sammlung von Atomen:

Hier ein Beispiel für die Vernetzung zwischen zwei Peptiden (jetzt mit Disulfidbindungen), in diesem Fall für Insulin:

Flugdaten

Eines der Ziele des Wolfram Language ist es, so viel Wissen über die Welt wie möglich zu haben. In Version 13.0 fügen wir einen neuen Bereich hinzu: Informationen über aktuelle und vergangene Flugzeugflüge (vor erst nur in den USA).
Nehmen wir an, wir wollen heraus finden, welche Flüge gestern zwischen Boston und San Diego statt gefunden haben. Wir können einfach fragen FlightData:

Schauen wir uns nun einen dieser Flüge an. Er wird als symbolische Einheit dargestellt, mit allen möglichen Eigenschaften:

Hier wird die Höhe des Flugzeugs als Funktion der Zeit dargestellt:

Und hier ist die Flugroute, der er folgte:

FlightData können wir auch aggregierte Daten abrufen. So lässt sich zum Beispiel feststellen, woher alle Flüge kamen, die gestern in Boston ankamen:

Und hier sehen Sie ein Histogramm der Abflüge von Boston gestern:

In der Zwischenzeit sind hier die Wege, die die in Boston ankommenden Flüge in der Nähe des Flughafens genommen haben:

Und ja, jetzt könnte man anfangen, sich die Landebahnrichtungen, die Windrichtungen von gestern usw. anzusehen – Daten, die wir alle in unserer Wissensdatenbank haben.

Mehrachsen- und Multipanel-Plots

Es wird schon seit Ewigkeiten gefordert. Und es gab viele Paketimplementierungen davon. Aber jetzt, in Version 13.0, haben wir mehrachsiges Plotten direkt eingebaut in Wolfram Language. Hier ist ein Beispiel:

Wie angegeben, befindet sich die Skala für die blaue Kurve auf der linken Seite und für die orangefarbene Kurve auf der rechten Seite.

Man könntem einen, dass dies ganz einfach aussieht. Ist es aber nicht. Tatsächlich gibt es mehrere Koordinatensysteme, die alle in einem Diagramm zusammen gefasst sind – und dann durch Achsen, die durch verschiedene Formen der Gestaltung mit ein ander verbunden sind, aus ein ander gehalten werden. Der letzte Schritt zur Schaffung der Grundlagen hier für wurde in Version 12.3, als wir eingeführt haben AxisObject und “körperlose Achsen”.
Hier ist ein komplizierterer Fall, jetzt mit 5 Kurven, jede mit ihrer eigenen Achse:

Und so sieht es aus, wenn einige Kurven ihre Achsenteilen:

Mit mehreren Achsen können Sie mehrere Kurven in ein einziges „Plotpanel“ packen. Mit Multipanel-Plots können Sie Kurven in separate, mit ein ander verbundene Panels mit gemeinsamen Achsenpacken. Die ersten Fälle von Multipanel-Plots wurden bereits eingeführt in Version 12.0. In der Version 13.0 erweitern wir die Multipanel-Diagramme auf andere Visualisierungstypen:

Daten und Unendlichkeiten, in Plotskalen

In Version 13.0 müssen die „Koordinaten“ in Plots nicht mehr nur Zahlen sein, sondern können auch Daten sein. Das bedeutet zum Beispiel, dass alle üblichen Plot-Funktionen „nur“ für Zeitreihen funktionieren:

Hier ist ein etwas ausführlicheres Beispiel, das ein doppelt unendliches Intervall beinhaltet:

Das funktioniert so, dass es eine  Skalierungsfunktion gibt, die das unendliche Intervall auf ein endliches Intervall abbildet. Sie können diese Funktion explizit verwenden mit ScalingFunctions:

Neue Visualisierungstypen

Wir fügenständig neue Arten von integrierten Visualisierungen hinzu – nicht zu letzt, um neue Funktionen zu unterstützen. So fügen wir in Version 13.0 beispielsweise Vektorverschiebungsdiagramme hinzu, um unsere neuen Funktionen in der Festkörpermechanik zu unterstützen:

Oder in 3D:

Die Darstellung zeigt, wie eine bestimmte Region durch ein bestimmtes Verschiebungsfeld verformt wird.
Mit VectorPoints können

Unter Version 12.3 haben wir die Funktion GeoGraphPlot eingeführt, mit der Graphen gezeichnet werden können, deren Eckpunkte Geopositionen sind. In Version 13.0 fügen wir die Funktion GeoGraphValuePlot hinzu, mit der Sie auch „Werte“ an den Kanten des Graphen visualisieren können:

Beleuchtung wird symbolisch

Die Beleuchtung ist ein entscheidendes Element für die Wahrnehmung von 3D-Grafiken. Seit Version 1.0 gibt es die grundlegende Option Beleuchtung für die Festlegung der Gesamtbeleuchtung in 3D-Szenen. Aber in Version 13.0 ermöglichen wir eine vielfeinere Steuerung der Beleuchtung – was besonders wichtig geworden ist, seit wir Material-, Oberflächen- und Schattierungseigenschaften für 3D-Objekte unterstützen.
Die Schlüsselidee ist, die Darstellung von Lichtquellen symbolisch zu gestalten. So stellt dies beispielsweise eine Konfiguration von Lichtquellen dar die sofort mit der vorhandenen Option Beleuchtung verwendet werden kann:

Neu ist jedoch die Möglichkeit, verschiedene Objekte in einer Szene separat zu beleuchten“, indem man für sie unterschiedliche symbolische Beleuchtungsstile“ festlegt

Eine weitere neue Funktion in Version 13.0 ist übrigens das eingebaute Torus Primitiv:

Inhaltsdetektoren für maschinelles Lernen

Mit Classify können Sie Klassifikatoren für „ganze Daten“ trainieren. „Ist das eine Katze?“ oder „Geht es in diesem Text um Filme?“ In Version 13.0 haben wir die Möglichkeit hinzugefügt, Inhaltsdetektoren zu trainieren, die als Klassifikatoren für Teilbereiche von Daten dienen. „Welche Katzen sind hier drin?“ „Wo wird hier über Filme gesprochen?“
Die Grundidee besteht darin, Beispiele für ganze Eingaben zu geben und jeweils zu sagen, wo in der Eingabe eine bestimmte Klasse zu finden ist. Hier ist ein grundlegendes Training für das Erkennen von Themenklassen in Texten:

Jetzt können wir den Inhaltsdetektor für bestimmte Eingaben verwenden:

Wie funktioniert das? Im Grunde genommen weiß die Wolfarm Language bereits eine ganze Menge über Texte, Wörter und Bedeutungen. Man kann ihr also einfach ein Beispiel geben, das mit Fußball zu tun hat, und sie kann aufgrund ihres eingebauten Wissens herausfinden, dass Basketball dasselbe ist.
In Version 13.0 können Sie Inhaltsdetektoren nicht nur für Text, sondern auch für Bilder erstellen. Bei Bildern ist das Problem wesentlich komplizierter, so dass es länger dauert, den Inhaltsdetektor zu erstellen. Ist er jedoch einmal erstellt, kann er schnell auf jedem Bild ausgeführt werden.
Genau wie für Text trainieren Sie einen Bildinhaltsdetektor, indem Sie Beispielbilder angeben und sagen, wo in diesen Bildern die gewünschten Klassen von Dingen vorkommen:

Nach diesem Training (das auf einem GPU-fähigen Rechner etwa 5 Minuten dauerte) können wir den soeben erstellten Detektor anwenden:
Wenn Sie den Detektor anwenden, können Sie ihn um verschiedene Informationen bitten. Hier werden Begrenzungsrahmen (Bounding Boxes) angegeben, die Sie zum Beschriften des Originalbildes verwenden können:
Übrigens ist das, was unter der Haube passiert, damit das alles funktioniert, ziemlich ausgeklügelt. Letztendlich nutzen wir eine Menge eingebautes Wissen über die Arten von Bildern, die typischerweise vorkommen. Und wenn Sie uns Beispielbilder zur Verfügung stellen, ergänzen wir diese mit allen möglichen „typisch ähnlichen“ Bildern, die durch die Umwandlung Ihrer Beispiele gewonnen wurden. Und dann trainieren wir unser Bildsystem neu, um die neuen, aus Ihren Beispielen abgeleiteten Informationen nutzen zu können.

Neue Visualisierung und Diagnostik für maschinelles Lernen

Eine der Funktionen für maschinelles Lernen, die ich ständig benutze, ist FeatureSpacePlot. Und in Version 13.0 fügen wir eine neue Standardmethode hinzu, die FeatureSpacePlot schneller und robuster macht und häufig überzeugendere Ergebnisse liefert. Hier ist ein Beispiel, wie es mit 10.000 Bildern läuft:

Eine der großartigen Eigenschaften des maschinellen Lernens in der Wolfram Language ist, dass Sie es auf eine hochgradig automatisierte Weise nutzen können. Sie geben Classify einfach eine Sammlung von Trainingsbeispielen, und es erstellt automatisch einen Klassifikator, den Sie sofort verwenden können. Aber wie genau hat es das gemacht? Ein wichtiger Teil der Pipeline besteht darin, herauszufinden, wie man Merkmale extrahiert, um Ihre Daten in Zahlenreihen zu verwandeln. Und in Version 13.0 können Sie jetzt den expliziten Merkmalsextraktor erhalten, für den er konstruiert wurde (so dass Sie ihn z. B. für andere Daten verwenden können):

Hier sind die extrahierten Merkmale für einen einzelnen Datensatz:

Dies zeigt einen Teil des Innenlebens von Classify. Sie können sich aber auch fragen, was die Ausgabe von Classify am meisten beeinflusst. Ein Ansatz hierfür ist die Verwendung von SHAP-Werten, um die Auswirkung jedes Attributs, das in den von Ihnen bereitgestellten Daten angegeben ist, auf die Ausgabe zu bestimmen. In Version 13.0 haben wir eine praktische grafische Darstellung für eine bestimmte Eingabe hinzugefügt:

Automatisierung des Problems der Verfolgung von Robotern und mehr

Der Entwurf von Kontrollsystemen ist eine komplizierte Angelegenheit. Zunächst braucht man ein Modell für das System, das man steuern will. Dann muss man die Ziele für den Regler festlegen. Und dann muss man tatsächlich einen Regler konstruieren, der diese Ziele erreicht. Mit dem ganzen Stapel an Technologie in Wolfram Language und Wolfram System Modeler sind wir an einem Punkt angelangt, an dem wir über eine beispiellos automatisierte Pipeline für diese Dinge verfügen.
Version 13.0 bietet insbesondere Funktionen für Entwicklung von Steuerungen die ein System dazu bringen, ein bestimmtes Signal zu verfolgen, z. B. einen Roboter, der einer bestimmten Flugbahn folgt.
Betrachten wir einen sehr einfachen Roboter, der aus einem fahrenden Wagen mit einer zeiger angebracht:

Zunächst benötigen wir ein Modell für den Roboter, das wir in Wolfram System Modeler (oder Import als Modelica model):

Unser Ziel ist es nun, einen Weg zu finden, um die Eingangsvariablen für den Roboter (die Kraft, die den Wagen bewegt, und das Drehmoment für den Zeiger) zu „steuern“
um ein bestimmtes Verhalten für die Ausgangsvariablen zu erreichen (die Position des Zeigerendes):
Hier ist eine Kurve, der das Ende des Zeigers im Laufe der Zeit folgen soll:

Jetzt wollen wir den Regler konstruieren – und dazu braucht man ein gewisses Maß an Kenntnissen der Regelungstheorie. Hier werden wir werden die Methode der Polplatzierung verwenden, um unseren Regler zu erstellen. Und wir werden die neue Fähigkeit der Version 13.0 nutzen, um einen „Nachlaufregler“ zu entwerfen, der bestimmte Ausgänge verfolgt (ja, um diese Zahlen festzulegen, muss man etwas über Regelungstheorie wissen):

Nun müssen wir das geschlossene System aufbauen, das den Roboter und seine Steuerung umfasst:
Nun können wir das Verhalten des gesamten Systems simulieren, indem wir Listen mit den x- und y-Koordinaten der Referenzbahn als Eingabe eingeben:
Auf der Grundlage dieser Simulation ist hier dargestellt, wo das Ende des Zeigers verläuft:

Nach einem anfänglichen Einschwingen folgt dies dem von uns gewünschten Pfad. Und ja, auch wenn das alles ein bisschen kompliziert ist, ist es unglaublich einfacher, als wenn wir direkt mit echter Hardware arbeiten würden, statt mit theoretischen “modellbasiert” entwurf.

Weniger Klammern setzen!

Wenn Sie Version 13 zum ersten Mal starten und etwas wie f[ eingeben, sehen Sie Folgendes:
In der Version 13 werden nun automatisch passende Klammern hinzugefügt, wenn das System dies für unzweideutig hält. Sie müssen nur wissen, dass Sie die Klammer dann „durchtippen“ können, d. h. wenn Sie in diesem Fall mit dem Cursor direkt vor dem automatisch hinzugefügten ] explizit ] eingeben, erscheint kein neues ]; das System tippt das ] einfach „durch“. Es gibt auch die Möglichkeit, mit ctrlspace nach rechts vor die automatisch eingefügte schließende Klammer zu gehen. Übrigens bewegt sich ctrlspace auch dann nach rechts zur nächsten schließenden Klammer, wenn sich der Cursor nicht unmittelbar neben der Klammer befindet; dies geschieht auch dann, wenn sich der Cursor tief in einer verschachtelten Struktur befindet.

Die automatische Anpassung (die Sie im Dialogfeld „Einstellungen“ deaktivieren können, wenn Sie sie wirklich nicht mögen) gilt nicht nur für [ ], sondern auch für { }, ( ), [[ ]], <| |>, (* *) und (wichtig) “ „. Und ctrlspace funktioniert auch mit all diesen Arten von Begrenzungszeichen.Für Liebhaber der Benutzerfreundlichkeit ist vielleicht ein weiterer Punkt von Interesse. Wenn Sie ctrlspace tippen, kann sich Ihr Cursor so weit bewegen, dass Ihr Auge ihn verliert. Diese Art von weiträumiger Cursorbewegung kann auch bei der Eingabe von mathematischen und anderen 2D-Daten auftreten, die in Echtzeit gesetzt werden. In den 1990er Jahren haben wir einen Mechanismus erfunden, um zu verhindern, dass man den Cursor verliert“. Intern nennen wir ihn den „unglaublich schrumpfenden Klecks“. Dabei handelt es sich um einen großen schwarzen Klecks, der an der neuen Position des Cursors erscheint und in etwa 160 Millisekunden auf den reinen Cursor schrumpft. Betrachten Sie dies als einen „Vision Hack“. Im Grunde genommen nutzen wir das menschliche prä-aufmerksame Sehsystem, das dazu führt, dass man seinen Blick automatisch auf das „plötzlich auftauchende Objekt“ richtet, ohne dass man dies wirklich bemerkt.
In Version 13 nutzen wir diesen Mechanismus nun nicht nur für den Echtzeitsatz, sondern auch für das Hinzufügen des Kleckses, wenn die „Sprungdistanz“ einen bestimmten Schwellenwert überschreitet.
Sie werden wahrscheinlich nicht einmal bemerken, dass der Blob da ist (nur ein kleiner Teil der Leute scheint ihn zu „sehen“). Aber wenn Sie es rechtzeitig bemerken, werden Sie folgendes sehen:

Fortschritte bei der Beobachtung des Progress of Computations…

Fortschritts von Berechnungen…

Sie führen eine lange Berechnung durch. Was passiert dabei? Wir haben eine langfristige Initiative, um eine interaktive Fortschrittsüberwachung für so viele Funktionen wie möglich anzubieten, die lange Berechnungen durchführen.

Ein Beispiel in Version 13.0 ist, dass Sie bei ParallelMap, ParallelTable usw. automatisch eine Fortschrittsüberwachung erhalten:

Die Anzeige ist vorübergehend; sie ist nur da, solange die Berechnung läuft, und verschwindet dann wieder. Es gibt noch viele andere Beispiele dafür, und es werden noch mehr kommen. Es gibt eine Fortschrittsüberwachung in Videos, maschinelles Lernen, Zugriff auf die Wissensdatenbank, Import/Export und verschiedene algorithmische Funktionen:

Im Allgemeinen ist die Fortschrittsüberwachung eine gute Sache; sie hilft Ihnen zu wissen, was passiert, und ermöglicht Ihnen zu überprüfen, ob die Dinge aus dem Ruder gelaufen sind. Aber manchmal kann es verwirrend sein, vor allem, wenn es eine interne Funktion gibt, von der Sie nicht einmal wussten, dass sie aufgerufen wurde, und Sie plötzlich eine Fortschrittsüberwachung für sie sehen. Lange Zeit dachten wir, dass dieses Problem eine weit verbreitete Fortschrittsüberwachung zu einer schlechten Idee machen würde. Aber der Wert, zu sehen, was vor sich geht, scheint fast immer die potenzielle Verwirrung zu überwiegen, wenn man sieht, dass etwas „unter der Haube“ passiert, von dem man nichts wusste. Und es ist wirklich hilfreich, dass die Fortschrittsanzeigen einfach verschwinden, sobald eine Operation beendet ist, so dass in Ihrem endgültigen Notizbuch kein Hinweis auf sie zu finden ist.
Übrigens hat jede Funktion mit Fortschrittsüberwachung eine Option ProgressReporting, die Sie auf False setzen können. Außerdem, there is eine globale Variable $ProgressReporting, die den Standard für das gesamte System festlegt. Es ist erwähnenswert, dass es verschiedene Stufen der „Sind wir schon da?“-Überwachung gibt, die gegeben werden können. Einige Funktionen durchlaufen eine systematische Abfolge von Schritten, z. B. die Verarbeitung jedes Bildes in einem Video. In solchen Fällen ist es möglich, den „Fertigstellungsgrad“ als Fortschrittsanzeige anzuzeigen. Manchmal ist es auch möglich, zumindest eine Vermutung über den „Bruchteil der Fertigstellung“ (und damit die erwartete Fertigstellungszeit) anzustellen, indem man „statistisch“ betrachtet, was bisher in Teilen der Berechnung geschehen ist. Und das ist zum Beispiel die Art und Weise, wie ParallelMap etc. den Fortschritt überwacht. Natürlich ist es im Allgemeinen nicht möglich zu wissen, wie lange eine beliebige Berechnung dauern wird; das ist die Geschichte der rechnerischen Irreduzibilität und von Dingen wie der Unentscheidbarkeit des Halteproblems für Turing-Maschinen. Aber unter der Annahme (die sich in den meisten Fällen als ziemlich gut herausstellt), dass es eine ziemlich gleichmäßige Verteilung der Laufzeiten für verschiedene Teilberechnungen gibt, ist es dennoch möglich, vernünftige Schätzungen abzugeben. (Und ja, das „sichtbare Zeichen“ einer möglichen Unentscheidbarkeit ist, dass der Prozentsatz der vollständigen Berechnung mit der Zeit sowohl nach unten als auch nach oben gehen kann).

Wolfram|Alpha Notizbücher

Viele Jahre lang hatten wir Mathematica + Wolfram Language, und wir hatten Wolfram|Alpha. Ende 2019 haben wir dann Wolfram|alpha Notebook Edition als eine Art Mischung aus beidem. Und in der Tat Neben den Standard-Desktop- und Cloud-Implementierungen von Mathematica und Wolfram|Alpha gibt es jetzt auch das Konzept eines Wolfram|Alpha-Mode Notebooks, bei dem die Grundidee darin besteht, dass man Dinge in freier natürlicher Sprache eingeben kann, aber die Möglichkeiten der Wolfram Language zur Darstellung und zum Aufbau von Berechnungen erhält:

n Version 13.0 wurde den Wolfram|Alpha-Mode Notebooks eine ganze Menge hinzugefügt. Zunächst gibt es Paletten für die direkte Eingabe von 2D-Mathe-Notation:

Außerdem ist es jetzt möglich, direkt aus sprachlichen Freiform-Eingaben umfangreiche dynamische Inhalte zu generieren:

Zusätzlich zu „maßgeschneiderten“ interaktiven Inhalten kann man in Wolfram|Alpha-Mode Notebooks auch sofort auf interaktive Inhalte aus den über 12.000 Demonstrationen im Wolfram-Demonstrationsprojekt:

Die Wolfram|Alpha Notebook Edition ist besonders stark für die Bildung. Und in Version 13.0 enthalten wir eine erste Sammlung
Wolfram|Alpha Notebook Edition is particularly strong for education. And in Version 13.0 we’re including a first collection of interactive quizzes, specifically about plots:

Alles für Quizspiele direkt in der Sprache

Version 13.0 führt die Möglichkeit ein, Quiz direkt in der Wolfram Language zu erstellen, einzusetzen und zu bewerten, sowohl auf dem Desktop als auch in der Cloud. Hier ist ein Beispiel für ein eingesetztes Quiz:
Wie wurde das hergestellt? Es gibt eine Autorennotizbuch, das so aussieht:

Das Ganze basiert auf den Funktionen des Formularnotizbuchs, das wir in Version 12.2. Aber es gibt noch ein zusätzliches Element: QuestionObject. A QuestionObject eine symbolische Darstellung einer Frage, die zu stellen ist, zusammen mit einer AssessmentFunction auf die gegebene Antwort anzuwenden, um sie zu bewerten, zu benoten oder anderweitig zu verarbeiten.
Im einfachsten Fall ist die „zu stellende Frage“ nur eine Zeichenkette. Sie kann aber auch ausgefeilter sein, und es gibt eine Liste von Möglichkeiten (die ständig erweitert wird), die Sie im Authoring

Das Konstrukt QuestionInterface können Sie im Detail steuern, wie die „Frageaufforderung“ eingerichtet wird). Sobald Sie Ihr Quiz im Autoren-Notebook erstellt haben (und natürlich muss es nicht nur ein „Quiz“ im Sinne der Kursunterlagen sein), müssen Sie es bereitstellen. In den Einstellungen können Sie verschiedene Optionen festlegen:

Wenn Sie dann auf „Generieren“ klicken, erhalten Sie sofort eine einsatzbereite Version Ihres Quiz, auf die zum Beispiel direkt im Internet zugegriffen werden kann. Außerdem erhalten Sie ein Ergebnisnotizbuch, das Ihnen zeigt, wie Sie die Ergebnisse der Teilnehmer des Quiz abrufen können.

Was passiert eigentlich, wenn jemand das Quiz macht? Jedes Mal, wenn die Person auf „Submit“ drückt, wird ihre Antwort bewertet und an das von Ihnen angegebene Ziel übermittelt – das kann ein Cloud-Objekt, eine Databin usw. sein (Sie können auch festlegen, dass die Person, die das Quiz bearbeitet, ein lokales Feedback erhält).
Nachdem also mehrere Personen ihre Antworten eingereicht haben, sehen die Ergebnisse folgendermaßen aus:

Alles in allem bietet Version 13.0 nun einen optimierten Arbeitsablauf für die Erstellung einfacher und komplexer Quizze. Die Quizze können alle möglichen Arten von Antworten enthalten – insbesondere auch lauffähigen Wolfram Language-Code. Und die Bewertungen können auch anspruchsvoll sein – zum Beispiel mit Codevergleichen. Um einen Eindruck davon zu vermitteln, was möglich ist, hier eine Frage, bei der eine Farbe ausgewählt werden muss, die mit der richtigen Antwort innerhalb einer bestimmten Toleranz verglichen wird:

Entwirrung von E-Mails, PDFs und mehr

Wie sehen E-Mail-Threads wirklich aus? Das habe ich mich schon lange gefragt. Und jetzt, in Version 13.0, haben wir eine einfache Möglichkeit, MBOX-Dateien zu importieren und die Thread-Struktur von E-Mails zu sehen. Hier ist ein Beispiel aus einer internen Mailingliste von uns:

Jetzt können wir die Standardgraphenoperationen darauf anwenden:

Eine wichtige neue Funktion von Version 12.2 war die Möglichkeit, PDFs in einer Vielzahl von Formen zu importieren – einschließlich Seitenbildern und einfachem Text. In Version 13.0 fügen wir die Möglichkeit hinzu, PDFs als Vektorgrafiken zu importieren.
Hier ist ein Beispiel für Seiten, die als Bilder importiert wurden:

Hier ist nun eine Seite, die als Vektorgrafik importiert wurde:
Um zu beweisen, dass es sich um eine Vektorgrafik handelt, können wir sie bis hin zu den Strichen der einzelnen Glyphen verändern:

Jetzt, wo wir Video in Wolfram Language haben, wollen wir so viele Videos wie möglich importieren können. Wir unterstützen bereits eine sehr vollständige Liste von Videocontainern und Codecs. In Version 13.0 fügen wir auch die Möglichkeit hinzu, FLV-Videos (Flash) zu importieren und sie in moderne Formate zu konvertieren.

CloudExpression geht in den Mainstream

Sie haben einen Ausdruck, den Sie sitzungsübergreifend manipulieren möchten. Eine Möglichkeit, dies zu tun, besteht darin, den gesamten Ausdruck mithilfe von PersistentValue persistent zu machen – oder ihn explizit in einer Datei oder einem Cloud-Objekt zu speichern und bei Bedarf wieder einzulesen. Es gibt jedoch eine viel effizientere und nahtlosere Möglichkeit, dies zu tun, bei der Sie sich nicht ständig mit dem gesamten Ausdruck befassen müssen, sondern stattdessen in einzelnen Teilen „stochern“ und „spähen“ können – und das ist die Verwendung von CloudExpression.
Wir haben CloudExpression erstmals im Jahr 2016 in Version 10.4. Damals war es als eine recht temporäre Möglichkeit gedacht, um relativ kleine Ausdrücke zu speichern. Aber wir haben herausgefunden, dass es viel nützlicher ist als wir erwartet haben, und deshalb bekommt es in Version 13.0 ein größeres Upgrade, das es noch effizienter und robuster macht.
Es ist erwähnenswert, dass es mehrere andere Möglichkeiten gibt, Dinge in der Wolfram Language persistent zu speichern. Sie können PersistentValue verwenden, um ganze Ausdrücke dauerhaft zu speichern. Sie können die Wolfram Data Drop-Funktionalität verwenden, um schrittweise Databins hinzuzufügen. Sie können ExternalStorageUpload verwenden, um Dinge in externen Speichersystemen wie S3 oder IPFS zu speichern. Oder Sie können eine externe Datenbank einrichten (z. B. eine SQL- oder dokumentenbasierte) und dann Wolfram Language-Funktionen verwenden, um auf diese zuzugreifen und sie zu pflegen. CloudExpression bietet jedoch eine viel einfachere und dennoch allgemeine Möglichkeit, persistente Ausdrücke einzurichten und zu bearbeiten. Die Grundidee besteht darin, einen Cloud-Ausdruck zu erstellen, der dauerhaft in Ihrem Cloud-Konto gespeichert wird, und dann in der Lage zu sein, Operationen mit diesem Ausdruck durchzuführen. Wenn der Cloud-Ausdruck aus Listen und Assoziationen besteht, können Sie mit Standardoperationen der Wolfram Language effizient Teile des Cloud-Ausdrucks lesen oder schreiben, ohne dass Sie das Ganze in Ihrer Sitzung in den Speicher holen müssen. So wird ein Cloud-Ausdruck aus einer Tabelle von, in diesem Fall, Polynomen erstellt:

Daraus ergibt sich der 5. Teil der Tabelle:
Wir können sie zurücksetzen:
Dadurch wird die ganze Wolke zum Ausdruck gebracht:

Der wichtige Punkt ist jedoch, dass das Abrufen und Setzen von Teilen des Cloud-Ausdrucks nicht erfordert, dass der Ausdruck in den Speicher gezogen wird. Jede Operation wird stattdessen direkt in der Cloud ausgeführt. In einem herkömmlichen relationalen Datenbanksystem müssten die Daten eine gewisse „Rechteckigkeit“ aufweisen. Aber in einem Cloud-Ausdruck (wie in einer NoSQL-Datenbank) können Sie jede verschachtelte Listen- und Assoziationsstruktur haben, und darüber hinaus können die Elemente beliebige symbolische Ausdrücke sein. CloudExpression ist so eingerichtet, dass die von Ihnen verwendeten Operationen atomar sind, so dass Sie z. B. gefahrlos zwei verschiedene Prozesse gleichzeitig in denselben Cloud-Ausdruck lesen und schreiben lassen können. Das Ergebnis ist, dass CloudExpression ein guter Weg ist, um Daten zu verarbeiten, die durch Dinge wie APIFunction und FormFunction aufgebaut wurden.
Übrigens ist CloudExpression letztlich auch nur ein Cloud-Objekt, so dass es die gleichen Berechtigungsmöglichkeiten wie CloudObject hat. Das bedeutet zum Beispiel, dass Sie anderen Personen erlauben können, einen von Ihnen erstellten Cloud-Ausdruck zu lesen oder zu schreiben. (Die mit CloudExpression verknüpften Daten werden in Ihrem Cloud-Konto gespeichert, obwohl es sein eigenes Speicherkontingent verwendet, das von dem für CloudObject getrennt ist).
Angenommen, Sie speichern viele wichtige Daten als Unterliste in CloudExpression. CloudExpression ist so einfach zu benutzen, dass Sie sich Sorgen machen könnten, Sie würden einfach etwas wie ce[„Kunden“]=7 eingeben und plötzlich würden Ihre kritischen Daten überschrieben werden. Um dies zu vermeiden, CloudExpression hat die Möglichkeit PartProtection, mit dem Sie beispielsweise festlegen können, ob die Struktur des Ausdrucks oder nur seine „Blattelemente“ geändert werden sollen”.

Der Fortschritt des Funktions-Repository

Als wir die Wolfram Function Repository im Jahr 2019 wussten wir nicht, wie schnell es wachsen würde. Aber ich freue mich, sagen zu können, dass es ein großer Erfolg ist – mit vielleicht 3 neuen Funktionen pro Tag, die veröffentlicht werden, was bis heute eine Gesamtzahl von 2259 Funktionen ergibt. Dies sind Funktionen, die nicht Teil des Kernprogramms sind Wolfram Language, sondern können sofort von jedem Wolfram Language-System aus aufgerufen werden.
Es handelt sich um Funktionen, die von Mitgliedern der Community beigetragen und von uns geprüft und kuratiert wurden. Und in Anbetracht der Fähigkeiten der Wolfram Language ist es bemerkenswert, was mit einer einzigen Funktion erreicht werden kann. Die Funktionen haben meist nicht den vollen Umfang und die Robustheit, die für eine Integration in die Wolfram-Kernsprache nötig wären (obwohl Funktionen wie Adjugieren in Version 13.0 wurden aus „Prototypen“ im Function Repository entwickelt). Sie verfügen jedoch über einen stark beschleunigten Bereitstellungsprozess, der es ermöglicht, praktische neue Funktionen in neuen Bereichen extrem schnell zur Verfügung zu stellen. Einige der Funktionen im Function Repository erweitern die algorithmischen Möglichkeiten. Ein Beispiel dafür ist FractionalOrderD für die Berechnung von fraktionalen
Ableitungen:

Es gibt eine Menge in FractionalOrderD. Aber es ist in gewisser Weise sehr spezifisch – in dem Sinne, dass es auf einer bestimmten Art von fraktionaler Differenzierung basiert. In Zukunft werden wir vielleicht eine vollständige fraktionale Differenzierung in das System einbauen, aber das erfordert eine Vielzahl neuer Algorithmen. Was FractionalOrderD im Function Repository ist es, eine Form der gebrochenen Differenzierung zu liefern. Hier ist ein weiteres Beispiel für eine Funktion aus dem Function Repository, diesmal eine, die auf den Fähigkeiten von Wolfram|Alpha

Einige Funktionen bieten erweiterte Visualisierungsmöglichkeiten. Hier ist VennDiagram:

Es gibt viele Möglichkeiten, sich die Bearbeitung komplizierterer Fälle vorzustellen; diese Funktion trifft eine besondere Wahl:

Ein weiteres Beispiel für eine Visualisierungsfunktion ist die folgende TruthTable— für die visuelle Darstellung der Ergebnisse der Kernsprache BooleanTable funktion:

Einige Funktionen bieten praktische – wenn auch vielleicht nicht ganz allgemeine – Erweiterungen für bestimmte Merkmale der Sprache. Hier ist IntegerChop die reelle Zahlen, die „ausreichend nahe an ganzen Zahlen“ liegen, auf exakte ganze Zahlen reduziert:

Hier ist ein Beispiel für eine Funktion, die vielleicht eines Tages in der Kernsprache enthalten sein wird. Aber im Moment werden die häufigsten Fälle von einer Function Repository-Funktion bereitgestellt:

Es gibt viele Funktionen im Function Repository, die spezifische Erweiterungen für Bereiche der Funktionalität in der Kernsprache bieten. BootstrappedEstimate, bietet zum Beispiel eine nützliche, spezifische Erweiterung der Statistikfunktionalität:

Hier ist eine Funktion, die die Mandelbrot set— mit FunctionCompile weiter zu gehen als MandelbrotSetPlot:

Es gibt einige Funktionen, die definitiv als „Nische“ erscheinen, aber äußerst nützlich sind, wenn Sie sie brauchen:

Dann gibt es Funktionen, die „aktuelle Ausgaben“ bequem machen. Ein Beispiel ist MintNFT:

Es gibt auch „Funktionen zum Spaß“ (die durchaus auch nützlich sein können):
Und es gibt Funktionen, die man als „Insider“-Humor bezeichnen könnte:

Übrigens ist nicht nur das Function Repository mit vielen großartigen Beiträgen gewachsen: Es gibt auch das Data Repository und Neural Net Repository, die ebenfalls energisch vorangetrieben wurden.

Einführung von Tools für die Erstellung von Paclets

Die Function Repository geht es darum, einzelne Funktionen zu erstellen, die Funktionalität hinzufügen. Was aber, wenn Sie eine ganz neue Welt der Funktionalität schaffen wollen, mit vielen miteinander verknüpften Funktionen? Und vielleicht auch eine, die nicht nur Funktionen, sondern zum Beispiel auch Änderungen an Elementen Ihrer Benutzeroberfläche beinhaltet. Seit vielen Jahren haben wir intern viele Teile der Wolfram Language system mit einer Technologie, die wir paclets— die in der Tat Funktionspakete liefern, die automatisch auf dem System eines jeden Benutzers installiert werden können.
Unter Version 12.1 haben wir das Paclet-System geöffnet, das spezifische Funktionen bietet wie PacletFind und PacletInstall für die Verwendung von Paclets. Aber die Erstellung von Paclets war immer noch so etwas wie eine schwarze Kunst. In Version 13.0 veröffentlichen wir nun eine erste Runde von Werkzeuge zur Erstellung von Paclets, und Ihnen die Möglichkeit zu geben, sie als Dateien oder über die Wolfram Cloud.
Die Paclet-Tools selbst sind (natürlich) in einem Paclet enthalten, das nun standardmäßig in jeder Wolfram Language-Installation enthalten ist. Im Moment befinden sich die Werkzeuge noch in einem separaten Paket, das Sie laden müssen:
Um ein Paclet zu erstellen, definieren Sie einen „Paclet-Ordner“, der alle Dateien enthält, aus denen Ihr Paclet besteht:

Damit ist die grundlegende Gliederung Ihres Paclets festgelegt, der Sie dann Dateien hinzufügen können:
Alternativ können Sie einige Komponenten in Ihrem Paclet gleich bei der ersten Erstellung des Paclets angeben:

Es gibt alle möglichen Elemente, die in Paclets enthalten sein können, und in zukünftigen Versionen wird es immer mehr Werkzeuge geben, die die Erstellung dieser Elemente erleichtern. In Version 13.0 wird jedoch ein wichtiger Teil der Werkzeuge geliefert, und zwar Documentation Tools, das Werkzeuge für die Erstellung der gleichen Art von Dokumentation bietet, die wir für die eingebauten Systemfunktionen haben. Sie können diese Werkzeuge direkt über das Hauptmenü der Systempaletten aufrufen:

Jetzt können Sie in Ihrem paclet Funktionsreferenzseiten, Anleitungsseiten, technische Hinweise und andere Dokumentationselemente als Notizbücher erstellen. Sobald Sie diese erstellt haben, können Sie sie in die fertige Dokumentation einbauen, indem Sie PacletDocumentationBuild. Dann können Sie sie als Notizbuchdateien, eigenständige HTML-Dateien oder als in der Cloud bereitgestelltes Material verwenden.
In Kürze wird es zusätzliche Werkzeuge für die Erstellung von Paclets sowie ein öffentliches Paclet-Repository für von Nutzern erstellte Paclets geben. Ein wichtiger Funktion, die das Paclet-Repository unterstützt und die bereits mit privat eingesetzten Paclets genutzt werden kann, ist die neue Funktion PacletSymbol.
Für das Function Repository können Sie verwenden ResourceFunction[„name“] um auf jede Funktion im Repository zuzugreifen. PacletSymbol ist ein Analogon dazu für Paclets. Eine Möglichkeit, ein Paclet zu verwenden, besteht darin, alle seine Assets explizit zu laden. Aber PacletSymbol ermöglicht es Ihnen, ein Paclet „tief aufzurufen“, um auf eine einzelne Funktion oder ein Symbol zuzugreifen. Genau wie bei ResourceFunction, Hinter den Kulissen werden weiterhin alle Arten von Assets geladen, aber in Ihrem Code können Sie einfach PacletSymbol ohne jegliche sichtbare Initialisierung. Ein neues Muster ist übrigens, eine Sammlung voneinander abhängiger Function Repository-Funktionen mit einem Paclet zu „unterstützen“, wobei der Zugriff auf die einzelnen Funktionen aus dem Code im Function Repository mit PacletSymbol.

Einführung von Kontextaliasen

Wenn Sie einen Namen wie x für etwas verwenden, stellt sich immer die Frage: „Welches x?“ Von Anfang an, in Version 1.0, gab es immer die Vorstellung eines Kontextes für jedes Symbol. Standardmäßig werden Symbole im globalen Kontext erstellt, so dass der vollständige Name für das von Ihnen erstellte x Global`x lautet.
Wenn Sie Pakete erstellen, möchten Sie diese in der Regel so einrichten, dass die Namen, die sie einführen, nicht mit anderen Namen kollidieren, die Sie verwenden. Um dies zu erreichen, ist es typisch, dass Pakete ihre eigenen Kontexte definieren. Sie können sich dann immer auf ein Symbol innerhalb eines Pakets mit seinem vollen Namen beziehen, z.B.Paket`Unterpaket`x usw. Aber wenn Sie einfach nach x fragen, was bekommen Sie dann? Das ist definiert durch die Einstellung für $Context und $ContextPath.
Aber manchmal möchte man einen Zwischenfall. Anstatt einfach x für Paket`x stehen zu lassen, wie es der Fall wäre, wenn Paket` im Kontext pfad wäre $ContextPath, Sie möchten auf x „in seinem Paket“ verweisen können, ohne den potenziell langen Namen des Pakets einzugeben (oder sehen zu müssen).
In Version 13.0 führen wir den Begriff der Kontext-Aliase ein, um Ihnen dies zu ermöglichen. Die Grundidee ist denkbar einfach. Wenn Sie Needs[„Context`“] um das Paket zu laden, das einen bestimmten Kontext definiert, können Sie einen „Kontext-Alias“ hinzufügen, in dem Sie Needs[„Context`“->“alias`“]. Dies hat zur Folge, dass Sie auf jedes Symbol in diesem Kontext als alias`name verweisen können. Wenn Sie keinen Kontext-Alias angeben, Needs fügt den von Ihnen gewünschten Kontext zu $ContextPath so dass die Symbole in der Form „nur x“ verfügbar sind. Wenn Sie jedoch mit vielen verschiedenen Kontexten arbeiten, die Symbole mit sich überschneiden den Namen haben könnten, ist es besser, für jeden Kontext Kontext-Aliase zu verwenden. Wenn Sie kurze Aliasnamen definieren, müssen Sie nicht viel mehr tippen, aber Sie können sicher sein, dass Sie immer auf das richtige Symbol verweisen. Dies lädt ein Paket, das dem Kontext „ComputerArithmetic“ entspricht, und fügt diesen Kontext standardmäßig zu $ContextPath:

Jetzt können Symbole mit Computer Arithmetik verwendet werden, ohne etwas über ihren Kontext zu sagen:

Da durch wird das Paket geladen und ein Kontext-Alias für das Paketdefiniert:
Jetzt können Sie mit dem Alias auf seine Symbole verweisen

Das globale Symbol $ContextAliases gibt alle Aliasnamen an, die Sie der Zeit verwenden:

Übrigens, genau wie bei unserer Konvention, dass die Namen von Symbolen mit Großbuchstaben beginnen, ist es eine allgemeine Konvention, dass die Kontextnamen für Pakete ebenfalls mit Großbuchstaben beginnen. Jetzt, wo wir auch Kontext-Aliase haben, schlagen wir die Konvention vor, für diese Kleinbuchstaben zu verwenden.

Symbolischer Aufbau einer Webseite

Wenn Sie ein Notizbuch in eine Webseite umwandeln möchten, müssen Sie nur Folgendes tun CloudPublish es. Wenn Sie ein Formular im Web erstellen möchten, können Sie einfach CloudPublish mit FormFunction (oder FormPage). Und es gibt noch eine Reihe anderer Direct-to-Web-Funktionen, die schon seit langem in das System integriert sind Wolfram Language.
Was aber, wenn Sie eine Webseite mit aufwendigen Webelementen erstellen wollen? Eine Möglichkeit ist die Verwendung von XMLTemplate um Wolfram Language-Ausgaben in eine HTML-Datei einzufügen usw. Aber in Version 13.0 beginnen wir damit, symbolische Spezifikationen für eine vollständige Webseitenstruktur zu erstellen, die es Ihnen ermöglichen, das Beste aus der Wolfram Language und den Web-Fähigkeiten und -Frameworks herauszuholen.
Hier ein ganz kleines Beispiel:

Und hier ist die Webseite, die er erzeugt:

Die Grundidee besteht darin, Webseiten aus verschachtelten Kombinationen von WebColumn, WebRow und WebItem. Jede von ihnen hat verschiedene Wolfram Language-Optionen. Sie erlauben aber auch den direkten Zugriff auf CSS-Optionen. Also zusätzlich zu einer Wolfram Language Background->LightBlue Option können Sie auch eine CSS-Option wie „border-right“->“1px solid #ddd“ verwenden. Es gibt eine weitere wichtige Funktion: InterfaceSwitched. Dies ist der Kern der Möglichkeit, responsive Webseiten zu erstellen, die ihre Strukturändern können, wenn sie auf verschiedenen Geräten angezeigt werden. InterfaceSwitched ist ein symbolisches Konstrukt, das Sie überall innerhalb der WebItem, WebColumn, usw. und die sich beim Zugriff über eine andere Schnittstelle unterschiedlich verhalten können. So wird zum Beispiel als 1, wenn es von einem Gerät mit einer Breite zwischen 0 und 480 Pixeln aufgerufen wird, und so weiter. Sie können dies in Aktion sehen, in dem Sie CloudPublish

und dann einfach die Größe des Fensters ändern, in dem Sie das Ergebnis betrachten:

Und jetzt… NFTs!

Eines der Dinge, die in der Welt seit der Veröffentlichung von Version 12.3 ist die allgemeine Verbreitung der Idee der NFTs. Wir haben bereits seit einigen Jahren Tools zur Unterstützung von NFTs – und Token im Allgemeinen – auf Blockchains. Aber in Version 13.0 haben wir die NFT-Tools weiter optimiert, ins besondere im Zusammenhang mit unsere Verbindung mit der Cardano-Blockchain..
Die Grundidee eines NFT („non-fungible token“) besteht darin, einen einzigartigen Token zu haben, der zwischen Nutzern übertragen, aber nicht repliziert werden kann. Es ist wie eine Münze, aber jeder NFT kann einzigartig sein. Die Blockchain bietet ein permanentes Buch darüber, wer welche NFT besitzt. Wenn Sie eine NFT übertragen was Sie Dabei wird lediglich etwas zur Blockchain hinzugefügt, um diese Transaktion auf zuzeichnen.
Wofür können NFTs verwendet werden? Für eine ganze Reihe von Dingen. Zum Beispiel, wir haben „NFT-Zertifikate“ ausgestellt für Personen, die unser Programm „abgeschlossen“ haben Summer School und Summer Camp dieses Jahr. Wir haben auch NFTs ausgestellt, um die Eigentumsverhältnisse für einige zellulare Automatenkunstwerke zu dokumentieren, die wir in einem Livestream erstellt haben. Und im Allgemeinen können NFTs als dauerhafte Aufzeichnungen für alles Mögliche verwendet werden: Eigentumsrechte, Referenzen oder einfach nur zum Gedenken an eine Leistung oder ein Ereignis.
In einem typischen Fall gibt es eine kleine „Nutzlast“ für die NFT, die direkt in der Blockchain gespeichert wird. Bei größeren Vermögens werten, wie z. B. Bildern, werden diese auf einem verteilten Speichersystem wie IPFS gespeichert, und die Nutzlast auf der Blockchain enthält einen Zeiger auf sie.
Hier ist ein Beispiel, das mehrere unserer Blockchain-Funktionen – sowie die neue Verbindung zur Cardano-Blockchain – nutzt, um das Bild einer NFT, die wir vor einigen Wochengeprägt haben, aus dem IPFS abzurufen:

Wie können Sie selbsteinesolche NFT prägen? Die Wolfram Language verfügt über die nötigen Mittel. ResourceFunction[„MintNFT„] im Wolfram Function Repository bietet einen gemeinsamen Arbeitsablauf (speziell für den CIP 25 Cardano NFT-Standard) – und es werden noch weitere folgen.
Die ganze Geschichte der Blockchain unterhalb der Ebene der „reinen Verbraucher“ ist kompliziert und technisch. Aber die Wolfram Language bietet einen einzigartigen, rationalisierten Weg, damit um zugehen, basierend auf symbolischen Darstellungen von Blockchain-Konstrukten, die direkt mit allen Standardfunktionen der Wolfram Language manipuliert werden können. Es gibt auch viele verschiedene Blockchains, mit unterschiedlichen Aufbauten. Aber durch die vielen Anstrengungen, die wir in den letzten Jahren unternommen haben, ist es unsgelungen, ein einheitliches Framework zu schaffen, das zwischen verschiedenen Blockchains interoperabel ist und den noch den Zugriff auf alle ihre speziellen Funktionen ermöglicht. Funktionen. Jetzt stellen Sie einfach eine andere BlockchainBase (Bitcoin, Ethereum, Cardano, Tezos, ARK, Bloxberg, …) und Sie sind bereit, mit einer anderen Blockchain zu interagieren

Schlankeres, schnelleres Herunterladen

Alles, worüber ich hier gesprochen habe, ist heute sofort verfügbar in der Wolfram Cloud und auf dem Desktop – für macOS, Windows und Linux (und für macOS sind das sowohl Intel als auch „Apple Silicon“ ARM). Aber wenn Sie zum Download gehen (zu mindest für macOS und Windows) gibt es eine neue Option: Download ohne lokale Dokumentation. Das eigentliche ausführbare Paket, das Wolfram Desktop oder Mathematica ist etwa 1,6 GB für Windows und 2,1 GB für macOS (für macOS ist es größer, weil es „universelle“ Binärdateien enthält, die sowohl Intel als auch ARM abdecken). Aber dann ist da noch die Dokumentation. Und davon gibt es eine ganze Menge. Und wenn Sie alles herunterladen, sind es weitere 4,5 GB, die heruntergeladen werden müssen, und 7,7 GB, wenn sie auf Ihrem System installiert sind.
Die Tatsache, dass es all diese Dokumentation gibt, ist sehr wichtig, und wir sind stolz auf ihren Umfang und ihre Tiefe. Und es ist wirklich praktisch, diese Dokumentation direkt auf Ihrem Computer zu haben – in Form von Notizbüchern, die Sie sofort aufrufen und bearbeiten können, wenn Sie wollen. Aber da unsere Dokumentation immer umfang reicher geworden ist (und wir arbeiten daran, sie noch umfang reicher zu machen), ist es manchmal besser, den lokalen Speicherplatz auf Ihrem Computer zu sparen und statt dessen Dokumentation aus dem Internet zu beziehen.
Daher führen wir in Version 13.0 dokumentationslose Downloads ein, die einfach ins Internet gehen und die Dokumentation in Ihrem Browser anzeigen. Wenn Sie Mathematica zum ersten Mal installieren oder Wolfram|One können Sie das „vollständige Paket“ einschließlich der lokalen Dokumentation wählen. Oder Sie können nur das ausführbare Paket ohne Dokumentation installieren. Wenn Sie es sich später anders überlegen, können Sie die Dokumentation jederzeit über den Punkt Lokale > Dokumentation installieren im Menü > Hilfe herunterladen und installieren.(Neben beibe merkt, die Wolfram Engine war schon immerd okumentationsfrei – und unter Linux beträgt die Download – Größegerade einmal 1,3 GB, was ich in Anbetracht der gesamten Funktionalität für unglaublich gering halte).