Le sac postal d'ingénierie
Épisode 3 : John Jacob Jingleheimer… Graphiques Smith !
De temps en temps, nous, ingénieurs système, sommes confrontés à des questions intéressantes qui sortiraient quelque peu du cadre habituel des problèmes. JMP usage. Ces applications sont généralement intelligentes et montrent souvent que l’utilisation des données ne se limite pas à des problèmes commerciaux ou techniques. D’autres fois, les questions ne sont que des problèmes inattendus et difficiles. J'appelle cela des « boules courbes ».
J'adore les bonnes balles courbes.
Je voulais partager celui-ci en particulier pour plusieurs raisons. Tout d’abord, c’est un exemple de la façon de réutiliser les personnalisations de graphiques pour atteindre un objectif. Et deuxièmement, je vais illustrer le processus de réflexion que je traverse lorsque je résout des problèmes en utilisant JMP . Bref, c’est un de ces cas où le voyage est nettement plus instructif que le résultat. Donc, sans autre qualification, vous trouverez ci-dessous un exemple d'une très bonne courbe d'un autre collègue de l'État de New York que j'ai pensé qu'il serait amusant de partager.
… Et pour mémoire, Nick, ce n'était pas une « question rapide » !! ;D
La question
Mike [JMP],Question rapide : savez-vous s'il existe un module complémentaire ou un script pour JMP permettant de tracer des graphiques de types coordonnées polaires ? À savoir chercher à faire des tracés de contour sur un tracé de Smith, exemple collé ci-dessous, pour une analyse d'impédance RF.... Nous pouvons accepter la conversion en coordonnées rectangulaires pour le moment, mais j'ai pensé que cela valait la peine de vous demander si vous l'avez déjà vu ou si vous connaissez quelqu'un chez JMP qui pourrait vous aider.


Modèle de graphique Smith – existe-t-il un moyen de tracer deux champs de données (valeurs de coordonnées réelles et imaginaires) sur un graphique Smith ?
J'ai trouvé un exemple de tracé de contour sur Google. On dirait que JMP pourrait faire quelque chose…
Merci,
Nick [Utilisateur]
Ma réponse:
Salut Nick,Pouvez-vous partager les données que vous avez utilisées pour créer ce tracé de contour ?
je pourrait être capable de créer un fichier de formes qui correspondrait à la superposition de la grille sur les données. (Aucune promesse, mais j'aurais besoin des données pour vérifier si je l'ai fait correctement.)
Meilleur,
M.
Qu'est-ce qu'un graphique Smith ?
C'est exactement ce à quoi je pensais en voyant cette question. Pour être honnête, j'avais vu les questions qu'il mentionnait dans la Communauté. J'ai jeté un coup d'œil à la question de la Communauté et j'ai pensé : « Non. C'est pour quelqu'un d'autre. Apparemment, la vie avait d’autres idées. Alors, convenablement réprimandé, j’ai commencé par comprendre quels étaient ces complots. C'est une lecture assez intéressante, mais pour être honnête, les détails essentiels n'ont pas vraiment d'importance pour cette discussion.
À un niveau élevé, un diagramme de Smith est une sorte de tracé de coordonnées polaires utilisé pour l'ingénierie électrique. ( Cela me paraissait logique. ) Il s'avère également qu'ils sont constitués de cercles et d'arcs de cercle superposés où le rayon d'un cercle donné est lié aux grandeurs physiques mesurées. ( Encore une fois, pas de problème, en particulier parce qu'un aimable professeur avait publié sur son site Web ses notes de cours, qui comprenaient les équations requises pour relier les grandeurs physiques aux rayons des cercles. ) De plus, il est assez courant que les personnes qui travaillent avec ces éléments convertissent les données du système de coordonnées polaires (points de données tracés en rayon et en angle) en un système cartésien (points de données tracés en x et y) pour un traçage plus facile.
Le processus de développement
Une fois mes recherches terminées, j'ai découvert que je devais d'une manière ou d'une autre construire un groupe de cercles avec des rayons spécifiques, et j'avais besoin que ces rayons correspondent à un ensemble de données fourni par l'utilisateur. Plus j'y pensais, moins mon idée initiale de créer un fichier de formes pour Graph Builder semblait être une bonne solution. Cela a ensuite été validé par un collègue qui pensait que cela poserait problème. Mais pourquoi? Eh bien, tout d'abord, les données devraient être redimensionnées à la même échelle que le système de coordonnées du fichier de formes. Même avec une documentation détaillée, cela semblait être un véritable champ de problèmes. Cela aurait finalement nécessité que je construise un complément complètement autonome qui mettait tout à l'échelle en coulisses, ou que je construise le fichier de formes, le jette par-dessus la clôture et espère qu'il fonctionnera sans problème. Je n’étais fou d’aucune de ces options. Deuxièmement, je devrais trouver comment configurer ces arcs pour qu'ils commencent et se terminent correctement aux intersections avec les cercles. Ce n’est pas une tâche facile.
Les preuves ont indiqué que j’ai dû abandonner mon idée initiale – avant même d’avoir les données que j’avais demandées ! Où irais-je à partir d’ici ? Retour au début! J'ai commencé par une simple série de questions pour reformuler mon problème.
- Puis-je tracer les données ? Oui, parce que je peux m'attendre à ce que les utilisateurs convertissent les données en coordonnées cartésiennes, je peux utiliser l'une des plates-formes standard (Graph Builder ou Contour Plot) pour générer un tracé des données.
- Que dois-je faire sur l'intrigue pour en faire un graphique de Smith ?Je dois créer une série de cercles, d'arcs et de lignes et les étiqueter.
- Comment dessiner tout ça ?J'ai deux options. Graph Builder me permettrait d'utiliser des fichiers de formes, mais nous avons déjà éliminé cette option. Un fichier de formes ne me permettrait pas non plus d'utiliser facilement des étiquettes de texte. Des scripts graphiques pourraient être utilisés pour annoter l'intrigue existante, mais cela nécessiterait un script qui pourrait être intimidant pour un utilisateur.
- Et si je construisais un petit complément qui ferait l'annotation ?Plus j’examinais ce problème de près, plus je réalisais que c’était la direction que je devais prendre. Mais j'ai également réalisé que si je m'engageais à créer un complément, je pourrais recycler une grande partie du code de support de ma version la plus récente du Semiconductor Tool Kit.(Conservez toujours votre code, les enfants !)
Scripts graphiques
Ouvrez un tracé dans JMP – n'importe quel tracé 2D... Allez-y, j'attendrai....
Prêt?
Droite! Faites un clic droit sur la zone graphique et regardez vers le bas. Voyez-vous l’option « Personnaliser… » ? Avez-vous déjà exploré cette option ? La plupart des gens ne l'ont pas fait. Je m'attends à ce que cela commence à changer grâce à JMP 14 ( Carte des limites ), mais jusqu'à présent, je ne pense pas que ce soit un domaine d'utilisation très courant dans JMP. Ce qui est dommage, car on peut faire tellement de choses avec les personnalisations. Et il s'avère qu'un graphique Smith est vraiment facile à créer en ajoutant des scripts graphiques aux personnalisations d'un tracé.Maintenant, certains d’entre vous ont probablement eu des sueurs froides parce que j’ai utilisé le « mot en S » – non, pas que épée – Je voulais dire « scripts ». Mais rappelez-vous que tout ce dont nous avons besoin sont des cercles, une ligne et des étiquettes, et ceux-ci sont faciles à écrire. Je vais également ajouter une forme pour créer un masque autour des éléments dont nous n'avons pas besoin et pour rendre les étiquettes plus faciles à voir. Voici comment nous réalisons chacun de ces éléments, comme le montre le tableau de Smith ci-dessous.
Représenter graphiquement les données
Les scripts graphiques ont d'abord besoin d'un graphique. Donc, l'étape 1 (comme il se doit toujours soit le cas) consiste à représenter graphiquement les données. Dans ce cas, j'ai utilisé une formule lissée dans un tracé de contour (plus d'informations sur ce petit flux de travail ici : Toutes les cartes de plaquettes sont fausses : une aventure dans la visualisation des données sur les semi-conducteurs ). À partir de là, vous ouvrez les personnalisations du graphique.Pour ajouter un script graphique dans les personnalisations, appuyez simplement sur le bouton « + » dans la liste des calques sur la gauche. Cela vous donne une nouvelle entrée dans la pile et un champ de script vide sur la droite. Vous pouvez nommer le script, si vous le souhaitez, en double-cliquant sur le titre (je vous le recommande – c'est juste une bonne organisation). Il existe des modèles et des exemples que vous pouvez explorer dans les listes déroulantes au-dessus du champ de script avec lesquels vous pouvez jouer pour trouver des idées. L’ordre dans lequel les calques apparaissent dans la pile détermine ce qui se trouve en haut. Les couches du bas sont les plus proches de votre globe oculaire (remarque : c'est en arrière ce que font la plupart des logiciels d'arts graphiques !) Enfin, même si j'utilise quelques scripts graphiques, il y en a d'autres. Ils se trouvent dans le groupe Graphiques du guide de script (Dans JMP - Aide > Guide de script. Sélectionnez la catégorie Fonctions pour faciliter la recherche).
Dessiner des cercles
Les cercles utilisent le Cercle({,},) commande dans un script graphique. Voici le script que j'ai utilisé pour les cercles avec leurs centres sur la ligne y = 0 dans l'exemple (le texte vert décrit ce que fait chaque partie).
// make a list of circles using a desired step and range of resistances
inc = 0.2;
resCircs = Index( 0, 5, 0.2 );
// set line color and weight
Pen Color( "Gray" );
Pen Size( 1 );
// loop through the list of resistances, calculate and plot a circle for each one
For( i = 1, i <= N Items( resCircs ), i++,
Circle( {resCircs[i] / (1 + resCircs[i]), 0}, 1 / (1 + resCircs[i]) )
);
Le code des arcs est en fait aussi des cercles. (N'oubliez pas qu'un arc n'est qu'une partie d'un cercle.) La différence réside uniquement dans la façon dont le centre et le rayon sont calculés. Deux cercles sont également créés par entrée dans la liste – un pour la courbe positive et un pour la courbe négative.
inc = 0.2;
reactCircs = Index( 0, 5, 0.2 );
Pen Color( "Gray" );
Pen Size( 1 );
For( i = 1, i <= N Items( reactCircs ), i++,
Circle( {1, 1 / reactCircs[i]}, 1 / reactCircs[i] );
Circle( {1, 1 / -reactCircs[i]}, 1 / -reactCircs[i] );
);
Ensuite, je vais créer une forme pour masquer les parties des cercles dont je n'ai pas besoin.
Dessiner des formes irrégulières (polygones)
Les formes irrégulières utilisent le Polygone([],[]) commande. Vous pouvez également définir l'emplacement de chaque sommet en utilisant une notation {x,y}, mais cela était pénible à utiliser. Le code ressemble à ceci (avec les matrices supprimées pour plus de lisibilité) :
// define the fill color
Fill Color( "white" );
// define the polygon using matrices
Polygon([… xmatrix…],[…ymatrix…]);
Les coordonnées omises définissent un carré avec un cercle expulsé du centre de la même taille que le plus grand des cercles centrés sur la ligne y = 0. Placer le script de polygone sous les scripts de cercle (c'est-à-dire plus près du haut de la pile) masque les parties des cercles qui ne sont pas nécessaires pour le tracé de Smith.
Dessiner des marqueurs et du texte
Les marqueurs (points de données) utilisent la commande Marqueur (État de couleur (), [], []) . L'argument Color State est facultatif mais vous permet de contrôler les couleurs des marqueurs indépendamment de tout autre script. Mettre des étiquettes de texte sur un graphique utilise Texte(, {,}, ) . L'argument de justification est facultatif et l'emplacement {x,y} correspond au centre du champ de texte. Dans l'exemple, les coordonnées sont les mêmes entre les marqueurs et le texte et j'ai juste incorporé quelques décalages et ajustements de justification pour aligner correctement les choses (ce qui a donné naissance à cette instruction if à la fin). Pour faciliter cela, j'ai utilisé une seule matrice contenant la coordonnée x,y et l'étiquette sous forme de nombre.
// coordinate matrix [x, y, label]
mat = [<MATRIX>];
// set line color and weight and the text size
Pen Color( "Gray" );
Pen Size( 1 );
Text Size( 8 );
// make the markers
Marker( Color State( "Gray" ), mat[0, 1], mat[0, 2] );
// make the labels using the matrix with some offsets and rounding
For( j = 1, j <= N Rows( mat ), j++,
If( Round( mat[j, 2], 1 ) < 0,
string = " -" || Char( Round( mat[j, 3] * 1, 2 ) ) || " ",
string = " " || Char( Round( mat[j, 3] * 1, 2 ) ) || " "
);
If(
Round( mat[j, 1], 1 ) <= 0 & Round( mat[j, 2], 1 ) > 0,
Text( Right Justified, {mat[j, 1], mat[j, 2] + 0.03}, string ),
Round( mat[j, 1], 1 ) > 0 & Round( mat[j, 2], 1 ) > 0 & mat[j, 3] <= 2,
Text( {mat[j, 1], mat[j, 2] + 0.03}, string ),
Round( mat[j, 1], 1 ) > 0 & Round( mat[j, 2], 1 ) < 0 & mat[j, 3] <= 2,
Text( {mat[j, 1], mat[j, 2] - 0.05}, string ),
Round( mat[j, 1], 1 ) <= 0 & Round( mat[j, 2], 1 ) < 0,
Text( Right Justified, {mat[j, 1], mat[j, 2] - 0.05}, string ),
Round( mat[j, 1], 1 ) <= 0 & Round( mat[j, 2], 1 ) == 0,
Text( Center Justified, {mat[j, 1], mat[j, 2] + 0.03}, string ),
Round( mat[j, 1], 1 ) > 0 & Round( mat[j, 2], 1 ) == 0 & mat[j, 3] <= 1.4,
Text( Center Justified, {mat[j, 1], mat[j, 2] + 0.03}, string )
);
);</MATRIX>
Tracer des lignes
Une ligne utilise la commande Ligne({,},{,}) .Dans l'exemple, j'ai mis ma ligne avec quelques autres éléments dans le script « Errata » :
// set line color and weight
Pen Color( "Gray" );
Pen Size( 1 );
// draw the line, circle, and center marker
Line( {-1, 0}, {1, 0} );
Circle( {0 / (1 + 0), 0}, 1 / (1 + 0) );
Marker( Color State( "red" ), {0, 0} );
Tout mettre ensemble
En utilisant la partie Annoter du Semiconductor Tool Kit (qui fait exactement la même chose que nous faisons ici), il était assez facile de remplacer les calculs dans le code existant et de créer une nouvelle application à l'aide d'Application Builder (recyclez toujours votre code, mes amis). !). Les personnalisations sont appliquées à une zone graphique vierge en guise d'aperçu. Lorsque vous êtes satisfait des résultats, vous pouvez cliquer sur le bouton Annoter qui copiera les scripts graphiques dans les personnalisations de vos tracés.

Dernières pensées
Alors, qu’ai-je appris dans cette petite aventure ? Premièrement, suivez les faits ; cela inclut la partie cadrage d'un problème. Mon idée initiale était complètement fausse, mais pendant que j’apprenais à quel point elle était fausse, je rassemblais les informations nécessaires pour trouver une solution appropriée. Deuxièmement, n'ayez pas peur de brûler l'homme de paille. N'ayez pas peur d'abandonner votre concept initial s'il ne fonctionne pas. Troisièmement, je suis constamment étonné par tout ce qui peut être fait avec les personnalisations.
Le Complément générateur de graphiques Smith est disponible si vous souhaitez le bricoler.
Une note de l'auteur
Pour ceux d'entre vous qui lisent ceci, non vous n'êtes pas fou, le titre a un peu changé.J'ai reçu une demande de mise à jour du titre afin qu'il soit plus facile à trouver pour nos moteurs de recherche.Je ne peux que supposer que cela est dû au fait que certains moteurs de recherche sont des incarnations modernes de bibliothécaires de référence du XIXe siècle, sans aucun sens de l'humour.Toutes mes excuses pour tout inconvénient.-M
PSNos plus sincères excuses pour les vers d’oreille « John Jacob Jingleheimer Schmit » que vous pourriez rencontrer.-M.
Note de l'éditeur: Avez-vous lu le autres versements de notre série Engineering Mailbag ? Découvrez comment Mike aide un utilisateur qui utilisait JMP pour décider de s'inscrire ou non à un service de déneigement et développer des visualisations uniques pour les programmes éducatifs STEAM.
Générateur de graphiques (
Taille (466, 456),
Afficher le panneau de configuration (0),
Variables( X( :S11_r ), Y( :S11_x ) ),
Éléments( Points( X, Y, Légende( 7 ) ) ),
EnvoyerToReport(
Expédition(
{},
"S11_r",
ScaleBox,
{Min ( -1 ), Max ( 1 ), Inc ( 0,5 ), Ticks mineurs ( 1 )}
),
Expédition(
{},
"S11_x",
ScaleBox,
{Min ( -1 ), Max ( 1 ), Inc ( 0,2 ), Ticks mineurs ( 0 )}
),
Expédition(
{},
"Constructeur de graphiques",
Boîte de cadre,
{Ajouter un script graphique (
2,
Description( "Smith Chart" ), // dresse une liste de cercles en utilisant un pas et une plage de résistances souhaités
augmentation = 0,2 ;
resCircs = {0, 0,33, 1, 2, 5} ;
// définit la couleur et l'épaisseur de la ligne
Couleur du stylo( "Gris" );
Taille du stylo (1) ;
// parcourt la liste des résistances, calcule et trace un cercle pour chacune
Pour( i = 1, i <= N Items( resCircs ), i++,
Cercle(
{resCircs[i] / (1 + resCircs[i]), 0},
1 / (1 + resCircs[i])
)
);
Pour( i = 1, i <= N Items( resCircs ), i++,
Cercle( {1, 1 / resCircs[i]}, 1 / resCircs[i] );
Cercle( {1, 1 / -resCircs[i]}, 1 / -resCircs[i] );
);
Ligne( {-1, 0}, {1, 0} );
Cercle( {0, 0}, 1 );
Marqueur( État de couleur( "rouge" ), {0.5, 0} );
)}
)
)
);