- Chebyshev approximation calculator est un outil qui génère sur le web du code d’approximation de fonctions mathématiques
- L’utilisateur peut définir la fonction à approximer, l’intervalle et le nombre de termes avec
f(x),x min,x max,Terms - L’option
Match x min x maxet la zone Coefficients permettent de vérifier ou d’ajuster les valeurs des coefficients ainsi que les bornes de l’intervalle - La zone Generated code affiche le résultat du calcul sous forme de code, et l’écran d’exemple montre les coefficients de
c0àc10 - Un dépôt GitHub est lié, ce qui permet de consulter directement le code d’implémentation de l’outil web
Générateur de code d’approximation de Chebyshev
- Chebyshev approximation calculator génère du code pour approximer efficacement des fonctions mathématiques
- Les conditions d’approximation sont saisies dans l’interface web
f(x): fonction à approximerx min: valeur minimale de l’intervallex max: valeur maximale de l’intervalleTerms: nombre de termes à utiliserMatch x min x max: option liée aux bornes de l’intervalle
Vérification des coefficients et code généré
- L’écran est divisé en une zone Coefficients et une zone Generated code
- Dans l’exemple affiché, on peut voir les coefficients de
c0àc10c0 = 0.16793649417016518c1 = -0.12411164956092625c2 = -0.09756341588422193c3 = 0.1800765790518846c4 = -0.06972963647223016c5 = -0.09250127939333941c6 = 0.18076946080324185c7 = 0.15990613621816677c8 = -0.028659588693985123c9 = -0.09494966104347571c10 = -0.04980429834982578
- Des entrées de coefficients allant de
c11àc39sont également affichées à l’écran
Dépôt de code
- Dépôt GitHub associé : stuffmatic/chebyshev-calculator
1 commentaires
Commentaires sur Hacker News
Super. Vers 1974, j’ai été payé pour écrire une fonction de calcul de racine carrée en assembleur IBM 360.
J’étais en dernière année de licence, et on m’avait demandé de la rendre aussi efficace que possible. Après avoir mis l’entrée à l’échelle entre 0 et 1, j’utilisais une approximation de Tchebychev pour l’estimation initiale, puis j’appliquais deux ou trois itérations déroulées de la méthode de Newton pour obtenir la solution. C’était le premier argent que j’ai gagné en écrivant du code.
Vraiment très bien fait. Je suis fasciné par l’efficacité de ce type d’approximation, et j’ai beaucoup mieux compris pourquoi les implémentations des fonctions trigonométriques ou d’autres fonctions mathématiques sur les ordinateurs 8 bits étaient faites de cette manière.
Il existe aussi un excellent document original du BBC Research Department datant de 1969 qui explique pourquoi cette approche est si bonne : https://downloads.bbc.co.uk/rd/pubs/reports/1969-10.pdf
Si l’on n’a vu que les approximations de Taylor, cela peut sembler un peu magique au début.
J’ai déjà obtenu de bons résultats avec Sollya : https://www.sollya.org/
Cela dit, même si les résultats étaient bons, le logiciel lui-même est un peu pénible à utiliser.
Si l’on approxime
Math.sin(x)/x, c’est-à-dire la fonction sinc, sur l’intervalle[-3,3]avec 7 termes, tous les coefficientsc0...c6deviennentNaN. C’est un bug ?Comme contournement temporaire, j’ai simplement forcé la valeur à
1.0quandxest proche de 0.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))pour calculer les coefficients de Tchebychev ; si l’un d’eux vaut exactement 0, il calculeMath.sin(0)/0, ce qui donneNaN.Une autre solution de contournement consiste à utiliser un intervalle légèrement asymétrique, comme
[-3,+3.0000001].x=0, et le code d’approximation semble trébucher à cet endroit. Le code est un peu décevant.Les polynômes de Tchebychev sont tellement puissants et polyvalents pour l’approximation que les gens ont l’impression que c’est trop beau pour être vrai, et finissent par ne pas les utiliser.
La première méthode à essayer devrait être Tchebychev. Les réseaux de neurones devraient être le dernier recours.
Excellent. J’avais récemment envie de faire ce genre de chose, et il était étonnamment difficile de trouver du code pour calculer les approximations.
Je l’ai ajouté à mes favoris pour la prochaine fois que j’aurai besoin d’approximer rapidement une fonction.
Tchebychev, c’est de la magie noire. Même après avoir vu la dérivation en cours de master, c’est toujours l’impression que ça me donne.
Il faut absolument mentionner aussi Chebfun, de Nick Trefethen et d’autres. C’est un outil qui étend cette idée dans presque toutes les directions imaginables.
On peut voir les
Chebfunscomme l’équivalent, pour les fonctions, des nombres en virgule flottante pour les nombres mathématiques réels. C’est un logiciel vraiment impressionnant.https://www.chebfun.org
Cela permet par exemple de trouver des solutions d’équations algébro-différentielles à la précision machine, ou les minimums/maximums globaux de fonctions à une dimension.
Je crois qu’ils utilisent aujourd’hui d’autres algorithmes, mais la méthodologie de base qu’utilisait Chebfun auparavant se trouve au chapitre 6 du livre de Trefethen,
Spectral Methods in Matlab. La méthodologie plus récente fondée sur les fonctions ultrasphériques est décrite dans l’article d’Olver et Townsend dans SIAM Review,A Fast and Well-Conditioned Spectral Method.J’ai une question, je ne sais pas si je peux la poser ici. J’avais vu une vidéo expliquant que la Nintendo 64 n’avait pas la capacité de calculer la fonction sinus, donc elle utilisait une table de correspondance de 0 à 2π, avec aussi des techniques astucieuses pour réduire la taille de la table.
Aurait-il été possible d’entraîner un réseau de neurones et de stocker ses poids, ou de construire une fonction et de stocker ses coefficients, pour calculer sinus et cosinus ?
S’il reste quelques cycles CPU, on peut utiliser une approximation hybride : prendre les valeurs d’une table clairsemée comme estimation initiale, puis appliquer quelques itérations de méthodes d’approximation numérique. Ou bien, comme dans l’article d’origine, stocker seulement les premiers coefficients d’une approximation polynomiale.
Les réseaux de neurones peuvent être utiles quand on a des échantillons d’une fonction mais qu’on ne sait pas comment l’approximer ; ici, ce n’est pas le cas.
Les réseaux de neurones sont une excellente solution quand il faut évaluer quelque chose qui n’est pas facile à analyser mathématiquement, mais il existe déjà de nombreuses techniques connues pour calculer et approximer les fonctions trigonométriques.
Entraîner un réseau de neurones pour calculer le sinus, c’est un peu l’équivalent mathématique d’utiliser un LLM pour inverser une chaîne de caractères. C’est possible, mais c’est une idée qui vient surtout si l’on ignore qu’il existe une approche plus directe qui résout fondamentalement le problème.
Avant d’utiliser des techniques IA/ML, il vaut toujours la peine de vérifier si les mathématiciens n’ont pas déjà une solution. De nos jours, il est probable que beaucoup d’efforts soient consacrés à appliquer de l’IA/ML à des problèmes pour lesquels il existe déjà des solutions connues, efficaces, voire optimales, simplement parce que les développeurs ne les connaissent pas.
La principale force des réseaux de neurones apparaît quand il y a non pas quelques entrées, mais énormément. Pour un cas simple comme
sin(x), il existe d’autres méthodes, comme l’outil présenté ici.Très sympa. Par jeu, j’ai voulu voir à quelle vitesse je pouvais fabriquer une fonction difficile à bien approximer.
Jusqu’ici, la meilleure que j’aie trouvée est
Math.cos(x * Math.exp(Math.cos(x * x))). Avec toutes ces compositions, elle produit des oscillations rapides et des pentes raides, ce qui la rend difficile à approximer facilement avec Tchebychev.