- Der Chebyshev approximation calculator ist ein Tool, das im Web Code zur Approximation mathematischer Funktionen erzeugt
- Nutzer können mit
f(x),x min,x maxundTermsdie zu approximierende Funktion, das Intervall und die Anzahl der Terme festlegen - Über die Option
Match x min x maxund den Bereich Coefficients bietet es einen Ablauf, um Intervallgrenzen und Koeffizientenwerte zu prüfen oder anzupassen - Im Bereich Generated code werden die Berechnungsergebnisse in Codeform angezeigt; im Beispielbild sind Koeffizienten von
c0bisc10zu sehen - Ein GitHub-Repository ist verknüpft, sodass sich der Implementierungscode des Web-Tools direkt einsehen lässt
Chebyshev-Approximations-Codegenerator
- Der Chebyshev approximation calculator erzeugt Code zur effizienten Approximation mathematischer Funktionen
- In der Web-UI werden die Approximationsbedingungen eingegeben
f(x): die zu approximierende Funktionx min: Minimalwert des Intervallsx max: Maximalwert des IntervallsTerms: Anzahl der zu verwendenden TermeMatch x min x max: Option in Bezug auf die Intervallgrenzen
Koeffizienten prüfen und Code erzeugen
- Die Oberfläche ist in die Bereiche Coefficients und Generated code unterteilt
- Die im Beispiel angezeigten Koeffizienten reichen von
c0bisc10c0 = 0.16793649417016518c1 = -0.12411164956092625c2 = -0.09756341588422193c3 = 0.1800765790518846c4 = -0.06972963647223016c5 = -0.09250127939333941c6 = 0.18076946080324185c7 = 0.15990613621816677c8 = -0.028659588693985123c9 = -0.09494966104347571c10 = -0.04980429834982578
- Auf dem Bildschirm werden außerdem Koeffizienteneinträge von
c11bisc39angezeigt
Code-Repository
- Zugehöriges GitHub-Repository: stuffmatic/chebyshev-calculator
1 Kommentare
Hacker-News-Kommentare
Sehr schön. Um 1974 herum habe ich einmal eine Funktion zur Berechnung von Quadratwurzeln in IBM-360-Assembler geschrieben und dafür Geld bekommen.
Ich war im letzten Jahr meines Bachelorstudiums und man hatte mich gebeten, sie so effizient wie möglich zu machen. Ich skalierte die Eingabe auf den Bereich zwischen 0 und 1, verwendete für die Anfangsschätzung eine Tschebyscheff-Approximation und löste das Ganze dann mit zwei oder drei entfalteten Iterationen des Newton-Verfahrens. Das war mein erstes Einkommen fürs Programmieren.
Wirklich gut gemacht. Ich war fasziniert davon, wie effizient solche Approximationen sind, und habe viel besser verstanden, warum trigonometrische und andere mathematische Funktionen auf 8-Bit-Computern genau so implementiert wurden.
Es gibt auch ein großartiges Originaldokument der BBC Research Department von 1969 darüber, warum diese Methode so gut ist: https://downloads.bbc.co.uk/rd/pubs/reports/1969-10.pdf
Wenn man bisher nur Taylor-Approximationen kennengelernt hat, kann das anfangs ein wenig wie Magie wirken.
Ich habe früher mit Sollya gute Ergebnisse erzielt: https://www.sollya.org/
Die Ergebnisse waren gut, aber die Software selbst ist etwas umständlich zu benutzen.
Wenn man
Math.sin(x)/x, also die sinc-Funktion, im Intervall[-3,3]mit 7 Termen approximiert, werden alle Koeffizientenc0...c6zuNaN. Ist das ein Bug?Als Workaround habe ich für den Fall, dass
xnahe 0 liegt, einfach1.0erzwungen.if(Math.abs(x) > 1e-8 ){ Math.sin(x)/x } else { 1.0 }x_j = (xmin) + (xmax - xmin)/2(1 + cos(pi[0..j-1]/(j-1))aus, um die Tschebyscheff-Koeffizienten zu berechnen. Wenn einer davon exakt 0 ist, wirdMath.sin(0)/0berechnet, wasNaNergibt.Ein anderer Workaround ist, einen leicht asymmetrischen Bereich wie
[-3,+3.0000001]zu verwenden.x=0nicht wohldefiniert ist, und der Approximationscode scheint genau dort zu scheitern. Der Code ist etwas schade.Tschebyscheff-Polynome sind bei Approximationen so mächtig und vielseitig, dass Leute sie für zu gut halten, um wahr zu sein, und sie deshalb nicht verwenden.
Die erste Methode, die man ausprobieren sollte, sollte Tschebyscheff sein. Neuronale Netze sollten der letzte Ausweg sein.
Hervorragend. Ich wollte so etwas kürzlich machen, und es war überraschend schwer, Code zu finden, der Approximationen berechnet.
Ich habe es als Lesezeichen gespeichert, um es zu verwenden, wenn ich das nächste Mal schnell eine Funktion approximieren muss.
Tschebyscheff wirkt wie schwarze Magie. Selbst nachdem ich die Herleitung in einem Graduiertenkurs gesehen habe, fühlt es sich so an.
Chebfun von Nick Trefethen und anderen sollte unbedingt erwähnt werden. Das ist ein Werkzeug, das dieses Thema in praktisch jede denkbare Richtung erweitert.
Chebfunskann man als Gegenstücke zu Funktionen sehen, so wie Gleitkommazahlen Gegenstücke zu tatsächlichen mathematischen Zahlen sind. Eine wirklich beeindruckende Software.https://www.chebfun.org
Dadurch werden viele Verfahren möglich, etwa Lösungen von differential-algebraischen Gleichungen mit Maschinengenauigkeit zu finden oder globale Minima/Maxima eindimensionaler Funktionen zu bestimmen.
Soweit ich weiß, verwenden sie inzwischen andere Algorithmen, aber die frühere grundlegende Methodik von Chebfun findet man in Kapitel 6 von Trefethens Buch
Spectral Methods in Matlab. Die neuere Methodik mit ultrasphärischen Funktionen wird im SIAM-Review-ArtikelA Fast and Well-Conditioned Spectral Methodvon Olver und Townsend beschrieben.Ich habe eine Frage, bin mir aber nicht sicher, ob sie hierher passt. Ich habe einmal ein Video gesehen, in dem es hieß, dass der Nintendo 64 nicht die Fähigkeit hatte, die Sinusfunktion zu berechnen, und daher eine Lookup-Tabelle von 0 bis 2π verwendete, inklusive cleverer Techniken zur Verkleinerung der Tabelle.
Wäre es auch möglich gewesen, ein neuronales Netz zu trainieren und seine Gewichte zu speichern, oder eine Funktion zu erstellen und deren Koeffizienten zu speichern, um Sinus und Kosinus zu berechnen?
Wenn ein paar CPU-Zyklen übrig sind, könnte man eine hybride Approximation verwenden, bei der Werte aus einer groben Lookup-Tabelle als Anfangsschätzung dienen und dann einige Iterationen numerischer Approximationsverfahren folgen. Oder man speichert, wie im Originalbeitrag, nur einige der ersten Koeffizienten einer Polynomapproximation.
Neuronale Netze können nützlich sein, wenn man Samples einer Funktion hat, aber nicht weiß, wie man sie approximieren soll; hier ist das aber nicht der Fall.
Neuronale Netze sind eine großartige Lösung, wenn man etwas auswerten muss, das mathematisch schwer zu analysieren ist, aber für die Berechnung und Approximation trigonometrischer Funktionen gibt es bereits viele bekannte Verfahren.
Ein neuronales Netz zum Berechnen von Sinus zu trainieren ist wie die mathematische Version davon, ein LLM zum Umkehren eines Strings zu verwenden. Es geht, aber auf die Idee kommt man nur, wenn man nicht weiß, dass das Problem im Kern durch einen direkteren Ansatz gelöst ist.
Es lohnt sich immer zu prüfen, ob Mathematiker bereits eine Lösung haben, bevor man AI/ML-Verfahren einsetzt. Heutzutage wird wahrscheinlich viel Aufwand darauf verwendet, AI/ML auf Probleme anzuwenden, für die es bereits bekannte, effiziente und sogar optimale Lösungen gibt, die Entwickler nur nicht kennen.
Die Hauptstärke neuronaler Netze zeigt sich, wenn es nicht nur wenige, sondern sehr viele Eingaben gibt. Für einen einfachen Fall wie
sin(x)gibt es andere Methoden, etwa das hier vorgestellte Tool.Sehr cool. Aus Spieltrieb wollte ich sehen, wie schnell ich eine Funktion finden kann, die sich schlecht approximieren lässt.
Bisher war
Math.cos(x * Math.exp(Math.cos(x * x)))am besten. Durch die vielen Kompositionen entstehen schnelle Oszillationen und steile Gradienten, wodurch es für Tschebyscheff schwer wird, sie einfach zu approximieren.