Projet personnelPersonal project JavaScript
Quel acier ai-je entre les mains ? What steel am I holding?
Un laboratoire reçoit un échantillon métallique et doit dire de quelle nuance il s'agit. La réponse est dans sa composition chimique — mais des milliers de nuances commerciales existent, et les comparer une à une à des tables de référence est long, fastidieux et dépend de qui le fait. Cet outil fait la comparaison : il classe les nuances les plus proches, chacune avec son score. Il sert au laboratoire, à mes collègues comme à moi. A laboratory receives a metal sample and has to say which grade it is. The answer lies in its chemical composition — but thousands of commercial grades exist, and comparing them one by one against reference tables is slow, tedious and depends on who is doing it. This tool does the comparison: it ranks the closest grades, each with its own score. It is in use at the laboratory, by my colleagues as well as by me.
- Nuances de référenceReference grades
- 386
- 203 aciers au carbone et faiblement alliés, 183 inoxydables. Fichiers data/fe01.json et data/fe30.json du dépôt. 203 carbon and low-alloy steels, 183 stainless. The repository's data/fe01.json and data/fe30.json.
- Éléments chimiques comparésChemical elements compared
- 18
- Du carbone au bore. Chacun porte un poids métallurgique, qui décide de ce qu'il pèse dans le score. From carbon to boron. Each carries a metallurgical weight, which decides how much it counts in the score.
- Nuances avec exigences normaliséesGrades with standard requirements
- 330
- 2 222 contraintes de composition au total, extraites du classeur source. Fichiers *_requis.json du dépôt. 2,222 composition constraints in total, extracted from the source workbook. The repository's *_requis.json files.
- Le carbone contre une traceCarbon against a trace element
- 50×
- Un écart sur le carbone pèse cinquante fois un écart sur le plomb. C'est le métier, écrit dans le bloc weights des fichiers de données. A gap on carbon counts fifty times a gap on lead. That is trade knowledge, written into the weights block of the data files.
Le savoir-faire tenait dans une tête The know-how lived in one person's head
Un spectromètre d'émission optique rend une vingtaine de teneurs : tant de carbone, tant de manganèse, tant de chrome. Reste à traduire cette liste en un nom de nuance — un 1045, un 316L, un 4140. Cette traduction, dans beaucoup de laboratoires, repose sur l'expérience d'une ou deux personnes : elles reconnaissent une signature chimique comme on reconnaît un visage. An optical-emission spectrometer returns some twenty values: this much carbon, this much manganese, this much chromium. What remains is turning that list into a grade name — a 1045, a 316L, a 4140. In many laboratories, that translation rests on the experience of one or two people: they recognise a chemical signature the way you recognise a face.
C'est rapide, c'est souvent juste, et ce n'est pas reproductible. Deux techniciens peuvent proposer deux nuances différentes sur le même échantillon, sans que l'un ait tort. Un jour de charge, la comparaison se fait plus vite et moins bien. Et le jour où la personne part, la compétence part avec elle. It is fast, it is often right, and it is not reproducible. Two technicians can propose two different grades for the same sample, without either being wrong. On a busy day, the comparison gets faster and worse. And the day that person leaves, the skill leaves with them.
« L'outil fait passer un savoir-faire spécialisé de quelques experts à un processus que l'organisation possède entièrement. » "[The tool] transfers specialized know-how from individual experts into a process fully owned by the organization." README du dépôt Materials-explorerMaterials-explorer repository README
Essayez-le, il tourne ici Try it, it runs right here
Pas de spectromètre sous la main ? « Charger un exemple » remplit la grille avec une composition plausible. Changez de base pour passer des aciers au carbone aux inoxydables, et ouvrez le second onglet pour prendre le problème par l'autre bout : partir d'une nuance et lire ce que la norme lui impose. No spectrometer at hand? "Load an example" fills the grid with a plausible composition. Switch database to move from carbon steels to stainless, and open the second tab to take the problem from the other end: start from a grade and read what the standard requires of it.
Passer l'applicationSkip the applicationL'ouvrir en plein écranOpen it full screen (nouvel onglet) (new tab)
Pourquoi le carbone pèse cinquante fois le plomb Why carbon counts fifty times more than lead
La comparaison, prise naïvement, consiste à mesurer l'écart élément par élément et à en faire une moyenne. Elle donne des résultats absurdes. Dans un acier au carbone, une erreur de 0,01 % sur le carbone change la nuance ; la même erreur sur le plomb ne change rien du tout — le plomb est une impureté résiduelle. Une moyenne simple traite les deux de la même façon. Taken naïvely, the comparison means measuring the gap element by element and averaging it. That gives absurd results. In a carbon steel, a 0.01 % error on carbon changes the grade; the same error on lead changes nothing at all — lead is a residual impurity. A plain average treats the two identically.
Chaque élément porte donc un poids métallurgique, visible sous son symbole dans la grille de saisie : 500 pour le carbone, 10 pour le plomb, l'étain ou le bore. Ces poids ne sortent pas d'un apprentissage statistique : ils viennent du pouvoir discriminant réel de chaque élément. C'est la connaissance du métier, écrite dans une table plutôt que gardée dans une tête. Each element therefore carries a metallurgical weight, shown under its symbol in the input grid: 500 for carbon, 10 for lead, tin or boron. These weights do not come out of statistical training: they come from how much each element actually discriminates. It is trade knowledge, written into a table rather than kept in someone's head.
Et ce pouvoir discriminant dépend de la famille : les deux bases n'ont pas la même table de poids. Le chrome pèse 150 chez les aciers au carbone, où il n'est qu'un élément d'appoint — et 350 chez les inoxydables, où il fait la nuance. Le manganèse suit le chemin inverse, de 400 à 100. Changer de base ne change donc pas seulement la liste des références comparées : cela change la façon de comparer. And that discriminating power depends on the family: the two databases do not share a weight table. Chromium counts 150 among carbon steels, where it is only a minor addition — and 350 among stainless steels, where it defines the grade. Manganese goes the other way, from 400 down to 100. Switching database therefore changes more than the list of references compared: it changes how they are compared.
Le score d'une nuance est alors la moyenne pondérée des similarités élément par élément, la similarité d'un élément valant le rapport de la plus petite valeur sur la plus grande. Deux conséquences utiles : le résultat reste entre 0 et 100 %, et seuls les éléments réellement saisis entrent dans le calcul — une lecture partielle produit quand même un classement. A grade's score is then the weighted average of the element-wise similarities, an element's similarity being the ratio of the smaller value to the larger. Two useful consequences: the result stays between 0 and 100 %, and only the elements actually entered take part in the calculation — a partial reading still produces a ranking.
Ce que l'outil refuse de deviner What the tool refuses to guess
Un test automatisé soumet à l'outil la composition exacte de chacune des 386 nuances de référence et vérifie qu'elle se reconnaît elle-même. Elle se reconnaît à chaque fois — mais 21 fois sur 386, elle arrive à égalité avec une autre nuance. Ce n'est pas un défaut du calcul : ces nuances-là ont, dans cette base, la même composition. La chimie ne suffit pas à les séparer, et aucun score ne le pourra. An automated test feeds the tool the exact composition of each of the 386 reference grades and checks that it recognises itself. It does, every time — but 21 times out of 386, it comes back tied with another grade. That is not a flaw in the calculation: within this database, those grades share the same composition. Chemistry alone cannot separate them, and no score ever will.
De la même façon, l'outil affiche un avertissement dès que la meilleure correspondance passe sous 50 % : l'échantillon n'appartient probablement pas à la famille choisie, ou trop peu d'éléments discriminants ont été saisis. Il aurait été plus flatteur d'afficher un premier résultat sans réserve. Un score faible doit avoir l'air faible — sinon l'outil fabrique de la confiance au lieu d'en mesurer. In the same spirit, the tool raises a warning as soon as the best match falls below 50 %: the sample probably does not belong to the chosen family, or too few discriminating elements were entered. It would have been more flattering to show a first result with no caveat. A weak match must look weak — otherwise the tool manufactures confidence instead of measuring it.
Enfin, l'outil identifie une nuance probable : il ne délivre pas un certificat. Le second onglet, lui, répond à une question différente et plus stricte — cette composition satisfait-elle les exigences de telle nuance ? Le verdict y est booléen : conforme seulement si toutes les exigences sont satisfaites, sans exception et sans moyenne. Finally, the tool identifies a probable grade: it does not issue a certificate. The second tab answers a different and stricter question — does this composition meet the requirements of that grade? There the verdict is boolean: a pass only if every requirement is met, with no exception and no averaging.
Sous l'interface Under the interface
L'outil est né d'un classeur Excel piloté en VBA, que j'avais construit ; son algorithme a été relevé formule par formule avant d'être réécrit. Il n'y a ni dépendance, ni étape de construction, ni serveur : le calcul se fait entièrement dans le navigateur, et aucune teneur saisie ne quitte la page. C'est une propriété, pas une limite — une composition de client n'a pas à transiter par un service tiers. The tool grew out of an Excel workbook driven by VBA, which I had built; its algorithm was lifted formula by formula before being rewritten. There is no dependency, no build step and no server: everything is computed in the browser, and no value you enter ever leaves the page. That is a property, not a limitation — a client's composition has no business travelling through a third-party service.
Le moteur de calcul est isolé du reste, sans DOM ni effet de bord, ce qui le rend testable : c'est ce qui permet au test d'identité des 386 nuances de tourner en une seconde, sous Node, sans navigateur. The calculation engine is isolated from the rest, with no DOM and no side effects, which makes it testable: that is what lets the 386-grade identity test run in a second, under Node, with no browser.
D'où viennent les chiffres de cette page Where the figures on this page come from
-
386 nuances de référence — 203 dans
data/fe01.jsonet 183 dansdata/fe30.json, dépôt publicWealthFinPilot/Materials-explorer. 386 reference grades — 203 indata/fe01.jsonand 183 indata/fe30.json, public repositoryWealthFinPilot/Materials-explorer. -
18 éléments, leurs poids, et le rapport de 50 — bloc
weightsdes deux mêmes fichiers. Le carbone y pèse 500 dans les deux bases, et le plus léger — aluminium, plomb, étain, bore — 10 : d'où le rapport de cinquante. Le chrome, lui, passe de 150 à 350 d'une base à l'autre, et le manganèse de 400 à 100. 18 elements, their weights, and the ratio of 50 — theweightsblock of those same two files. Carbon counts 500 in both databases, and the lightest — aluminium, lead, tin, boron — counts 10: hence the ratio of fifty. Chromium, for its part, goes from 150 to 350 between the two, and manganese from 400 to 100. -
330 nuances normalisées, 2 222 contraintes — 159 nuances et 889 contraintes dans
data/fe01_requis.json, 171 et 1 333 dansdata/fe30_requis.json. 330 standardised grades, 2,222 constraints — 159 grades and 889 constraints indata/fe01_requis.json, 171 and 1,333 indata/fe30_requis.json. -
386/386 au test d'identité, dont 365 seules en tête —
test/engine.test.mjs, exécuté sous Node : 203/203 avec 198 résultats uniques pour les aciers au carbone, 183/183 avec 167 uniques pour les inoxydables. 386/386 on the identity test, 365 of them alone on top —test/engine.test.mjs, run under Node: 203/203 with 198 unique results for carbon steels, 183/183 with 167 unique for stainless. - Compositions de référence — matériaux de référence certifiés des séries BCS, IARM et CRM, d'après le README du dépôt. L'outil de cette page est servi depuis ce site, pas depuis un service extérieur. Reference compositions — certified reference materials of the BCS, IARM and CRM series, per the repository README. The tool on this page is served from this site, not from an outside service.
Le dépôt du projetThe project repository (site externe, nouvel onglet) (external site, new tab)