Der technische Postsack
Folge 3: John Jacob Jingleheimer…Smith Charts!
Hin und wieder stoßen wir Systemingenieure auf interessante Fragen, die etwas außerhalb des typischen Spektrums liegen würden JMP Verwendung. Diese Anwendungen sind im Allgemeinen clever und machen oft deutlich, dass die Nutzung von Daten nicht nur geschäftlichen oder technischen Problemen dient. In anderen Fällen handelt es sich bei den Fragen lediglich um unerwartete, herausfordernde Probleme. Ich nenne diese „Curveballs“.
Ich liebe einen guten Curveball.
Ich wollte dieses besondere aus mehreren Gründen mit Ihnen teilen. Erstens ist es ein Beispiel dafür, wie Diagrammanpassungen umfunktioniert werden können, um ein Ziel zu erreichen. Und zweitens werde ich den Denkprozess veranschaulichen, den ich beim Lösen von Problemen durchlaufe JMP . Kurz gesagt, dies ist einer der Fälle, in denen die Reise deutlich lehrreicher ist als das Ergebnis. Also, ohne weitere Einschränkung, unten ist ein Beispiel für einen wirklich guten Curveball von einem anderen Kollegen aus dem Bundesstaat New York, von dem ich dachte, dass es Spaß machen würde, ihn zu teilen.
…Und fürs Protokoll, Nick, das war keine „schnelle Frage“!! ;D
Die Frage
Mike [JMP],Kurze Frage: Wissen Sie, ob es für JMP ein Add-on oder ein Skript zum Plotten von Diagrammen mit Polarkoordinaten gibt? Ich möchte nämlich Konturdiagramme auf einem Smith-Diagramm erstellen, Beispiel unten eingefügt, für eine HF-Impedanzanalyse ... Mit der Konvertierung in rechtwinklige Koordinaten können wir vorerst leben, aber wir dachten, es lohnt sich zu fragen, ob Sie es schon einmal gesehen haben oder jemanden bei JMP kennen, der Ihnen vielleicht helfen kann.


Vorlage für ein Smith-Diagramm – gibt es eine Möglichkeit, zwei Datenfelder (reale und imaginäre Koordinatenwerte) in einem Smith-Diagramm darzustellen?
Habe bei Google ein Beispiel für ein Konturdiagramm gefunden. Scheint etwas zu sein, was JMP tun könnte ...
Danke,
Nick [Benutzer]
Meine Antwort:
Hallo Nick,Können Sie uns die Daten mitteilen, die Sie zur Erstellung dieses Konturdiagramms verwendet haben?
ICH könnte in der Lage sein, ein Shapefile zu erstellen, das der Aufgabe entspricht, das Raster über die Daten zu legen. (Kein Versprechen, aber ich brauche die Daten, um zu überprüfen, ob ich es richtig gemacht habe.)
Am besten,
M
Was zum Teufel ist ein Smith-Diagramm?
Das ist genau das, was ich dachte, als ich diese Frage sah. Ehrlich gesagt hatte ich die Fragen, die er erwähnte, in der Community gesehen. Ich warf einen Blick auf die Community-Frage und dachte: „Nein. Das ist für jemand anderen.“ Offenbar hatte das Leben andere Vorstellungen. Entsprechend gezüchtigt begann ich also damit, herauszufinden, was diese Verschwörungen waren. Es ist eine ziemlich interessante Lektüre, aber um ehrlich zu sein, sind die Details für diese Diskussion eigentlich egal.
Auf hoher Ebene ist ein Smith-Diagramm eine Art Polarkoordinatendiagramm, das in der Elektrotechnik verwendet wird. ( Das ergab für mich Sinn. ) Es stellt sich auch heraus, dass sie aus überlappenden Kreisen und Kreisbögen bestehen, wobei der Radius eines bestimmten Kreises mit gemessenen physikalischen Größen in Beziehung steht. ( Auch hier kein Problem, insbesondere weil ein freundlicher Professor seine Vorlesungsunterlagen auf seiner Website veröffentlicht hatte, die die erforderlichen Gleichungen enthielten, um die physikalischen Größen mit den Radien der Kreise in Beziehung zu setzen. ) Darüber hinaus ist es für Leute, die mit diesen Dingen arbeiten, ziemlich üblich, die Daten vom Polarkoordinatensystem (in Radius und Winkel dargestellte Datenpunkte) in ein kartesisches System (in x und y dargestellte Datenpunkte) umzuwandeln, um die Darstellung zu erleichtern.
Der Entwicklungsprozess
Als ich mit meiner Recherche fertig war, hatte ich herausgefunden, dass ich irgendwie eine Gruppe von Kreisen mit bestimmten Radien erstellen musste, und ich brauchte diese Radien, um mit einem vom Benutzer bereitgestellten Datensatz übereinzustimmen. Je mehr ich darüber nachdachte, desto weniger schien meine ursprüngliche Idee, ein Shapefile für Graph Builder zu erstellen, zu passen. Dies wurde von einem Kollegen weiter bestätigt, der der Meinung war, dass dies problematisch sein würde. Aber warum? Nun, zunächst müssten die Daten auf den gleichen Maßstab wie das Shapefile-Koordinatensystem neu skaliert werden. Selbst mit detaillierter Dokumentation schien dies ein Minenfeld voller Probleme zu sein. Letztendlich wäre es erforderlich gewesen, dass ich entweder ein völlig eigenständiges Add-In erstellt hätte, das alles hinter den Kulissen skaliert, oder dass ich das Shapefile erstellt, es über den Zaun geworfen und gehofft hätte, dass es ohne Probleme lief. Ich war von keiner dieser Optionen begeistert. Zweitens müsste ich herausfinden, wie ich diese Bögen so einrichten kann, dass sie an den Schnittpunkten mit den Kreisen richtig beginnen und enden. Keine leichte Aufgabe.
Die Beweise deuteten darauf hin, dass ich meine ursprüngliche Idee verwerfen musste – bevor ich überhaupt über die Daten verfügte, nach denen ich gefragt hatte! Wohin würde ich von hier aus gehen? Zurück zum Anfang! Ich begann mit einer einfachen Fragestellung, um mein Problem neu zu formulieren.
- Kann ich die Daten grafisch darstellen? Ja, da ich davon ausgehen kann, dass die Benutzer die Daten in kartesische Koordinaten umwandeln, kann ich eine der Standardplattformen (Graph Builder oder Contour Plot) verwenden, um ein Diagramm der Daten zu erstellen.
- Was muss ich mit dem Diagramm tun, um daraus ein Smith-Diagramm zu machen?Ich muss eine Reihe von Kreisen, Bögen und Linien erstellen und diese beschriften.
- Wie zeichne ich das alles?Ich habe zwei Möglichkeiten. Mit Graph Builder könnte ich Shapefiles verwenden, aber wir haben diese Option bereits eliminiert. Ein Shapefile würde es mir auch nicht ermöglichen, Textbeschriftungen einfach zu verwenden. Grafikskripte könnten verwendet werden, um den vorhandenen Plot mit Anmerkungen zu versehen, aber das würde eine Skripterstellung erfordern, die für einen Benutzer einschüchternd sein könnte.
- Was wäre, wenn ich ein kleines Add-In erstellen würde, das die Anmerkung übernimmt?Je genauer ich mir dieses Problem ansah, desto klarer wurde mir, dass dies die Richtung war, in die ich gehen musste. Aber mir wurde auch klar, dass ich, wenn ich mich dazu verpflichten würde, ein Add-In zu erstellen, eine Menge Support-Code aus meinem letzten Build des Semiconductor Tool Kit wiederverwenden könnte.(Speichern Sie Ihren Code immer, Kinder!)
Grafikskripte
Öffnen Sie einen Plot in JMP – einen beliebigen 2D-Plot ... Weiter, ich warte ...
Bereit?
Rechts! Klicken Sie mit der rechten Maustaste auf den Diagrammbereich und schauen Sie nach unten. Sehen Sie die Option „Anpassen…“? Haben Sie diese Option schon einmal ausprobiert? Die meisten Leute haben es nicht getan. Ich gehe davon aus, dass sich das aufgrund von JMP 14 ändern wird ( Grenzkarte ), aber bisher glaube ich nicht, dass dies ein sehr häufiger Anwendungsbereich in JMP war. Das ist schade, da man mit Anpassungen so viel machen kann. Und es stellt sich heraus, dass ein Smith-Diagramm wirklich einfach zu erstellen ist, indem man den Anpassungen eines Plots Grafikskripte hinzufügt.Nun sind einige von euch wahrscheinlich ins Schwitzen geraten, weil ich das „S-Wort“ verwendet habe – nein, nicht Das Schwert – Ich meinte „Skripte“. Aber denken Sie daran: Alles, was wir brauchen, sind Kreise, eine Linie und Beschriftungen, und diese lassen sich leicht als Skript erstellen. Ich werde außerdem eine Form hinzufügen, um eine Maske um die Teile zu erstellen, die wir nicht benötigen, und um die Beschriftungen besser sichtbar zu machen. Hier erfahren Sie, wie wir jedes davon herstellen, wie in der Smith-Tabelle unten zu sehen ist.
Grafische Darstellung der Daten
Grafikskripte benötigen zunächst ein Diagramm. Also, Schritt 1 (wie sollte stets (falls dies der Fall ist) besteht darin, die Daten grafisch darzustellen. In diesem Fall habe ich eine geglättete Formel in einem Konturdiagramm verwendet (mehr zu diesem kleinen Arbeitsablauf hier: Alle Wafer-Maps sind falsch: Ein Abenteuer in der Visualisierung von Halbleiterdaten ). Von dort aus öffnen Sie die Anpassungen für das Diagramm.Um ein Grafikskript zu den Anpassungen hinzuzufügen, klicken Sie einfach auf die Schaltfläche „+“ in der Liste der Ebenen auf der linken Seite. Dadurch erhalten Sie einen neuen Eintrag im Stapel und ein leeres Skriptfeld auf der rechten Seite. Sie können dem Skript bei Bedarf einen Namen geben, indem Sie auf den Titel doppelklicken (ich empfehle Ihnen, dies zu tun – es ist nur eine gute Organisation). Es gibt einige Vorlagen und Beispiele, die Sie in den Dropdown-Listen über dem Skriptfeld erkunden und mit denen Sie experimentieren können, um Ideen zu erhalten. Die Reihenfolge, in der die Ebenen im Stapel angezeigt werden, bestimmt, was oben liegt. Die Schichten unten sind Ihrem Augapfel am nächsten (Achtung: Das ist rückwärts (im Gegensatz zu dem, was die meisten Grafikprogramme leisten!) Zu guter Letzt: Während ich einige der Grafikskripte verwende, gibt es noch andere. Sie finden sie in der Gruppe „Grafiken“ im Skript-Handbuch (in JMP – Hilfe > Skript-Handbuch). Wählen Sie die Kategorie „Funktionen“ aus, um das Auffinden zu erleichtern.
Kreise zeichnen
Kreise verwenden das Kreis({,},) Befehl in einem Grafikskript. Hier ist das Skript, das ich im Beispiel für die Kreise verwendet habe, deren Mittelpunkte auf der Linie y = 0 liegen (der grüne Text beschreibt, was die einzelnen Teile bewirken).
// 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]) )
);
Der Code für die Bögen sind eigentlich auch Kreise. (Denken Sie daran, dass ein Bogen nur ein Teil eines Kreises ist.) Der Unterschied besteht lediglich darin, wie Mittelpunkt und Radius berechnet werden. Außerdem werden pro Eintrag in der Liste zwei Kreise erstellt – einer für die positive Kurve und einer für die negative Kurve.
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] );
);
Als Nächstes erstelle ich eine Form, um die Teile der Kreise auszublenden, die ich nicht benötige.
Zeichnen unregelmäßiger Formen (Polygone)
Unregelmäßige Formen verwenden die Polygon([],[]) Befehl. Sie können jede Scheitelpunktposition auch mithilfe einer {x,y}-Notation definieren, aber die Arbeit damit war mühsam. Der Code sieht so aus (wobei die Matrizen zur besseren Lesbarkeit entfernt wurden):
// define the fill color
Fill Color( "white" );
// define the polygon using matrices
Polygon([… xmatrix…],[…ymatrix…]);
Die weggelassenen Koordinaten definieren ein Quadrat mit einem Kreis aus der Mitte, der die gleiche Größe hat wie der größte der Kreise mit Mittelpunkt auf der Linie y = 0. Wenn Sie das Polygonskript unterhalb der Kreisskripte platzieren (dh näher am oberen Rand des Stapels), werden die Teile der Kreise ausgeblendet, die für das Smith-Diagramm nicht benötigt werden.
Zeichenmarkierungen und Text
Marker (Datenpunkte) verwenden den Befehl Marker( Farbstatus(), [], []) . Das Argument „Farbstatus“ ist optional, ermöglicht Ihnen jedoch die Steuerung der Markierungsfarben unabhängig von anderen Skripten. Das Anbringen von Textbeschriftungen in einem Diagramm verwendet Text(, {,}, ) . Das Ausrichtungsargument ist optional und die Position {x,y} bezieht sich auf die Mitte des Textfelds. Im Beispiel stimmen die Koordinaten zwischen den Markierungen und dem Text überein, und ich habe nur einige Versätze und Ausrichtungsanpassungen vorgenommen, um die Dinge richtig auszurichten (was zu dieser haarsträubenden if-Anweisung am Ende führte). Um dies zu vereinfachen, habe ich eine einzelne Matrix verwendet, die die x-, y-Koordinate und die Beschriftung als Zahl enthielt.
// 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>
Linien zeichnen
Eine Zeile verwendet den Befehl Linie({,},{,}) .Im Beispiel habe ich meine Zeile mit einigen anderen Teilen in das „Errata“-Skript eingefügt:
// 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} );
Alles zusammenfügen
Mit dem Annotate-Teil des Semiconductor Tool Kit (der genau das Gleiche tut wie wir hier) war es ziemlich einfach, die Berechnungen in den vorhandenen Code einzufügen und mit Application Builder eine neue Anwendung zu erstellen (recyceln Sie Ihren Code immer, Leute). !). Die Anpassungen werden als Vorschau auf ein leeres Diagrammfeld angewendet. Wenn Sie mit den Ergebnissen zufrieden sind, können Sie auf die Schaltfläche „Anmerken“ klicken, um die Grafikskripte in die Anpassungen für Ihre Diagramme zu kopieren.

Abschließende Gedanken
Was habe ich also in diesem kleinen Abenteuer gelernt? Erstens – folgen Sie den Fakten; Dazu gehört auch der Scoping-Teil eines Problems. Meine ursprüngliche Idee war völlig falsch, aber während ich herausfand, wie falsch sie war, sammelte ich die Informationen, die ich brauchte, um eine richtige Lösung zu finden. Zweitens – haben Sie keine Angst, den Strohmann zu verbrennen. Scheuen Sie sich nicht, Ihr ursprüngliches Konzept aufzugeben, wenn es nicht funktioniert. Drittens: Ich bin immer wieder erstaunt, wie viel man mit Anpassungen erreichen kann.
Der Smith-Diagrammgenerator-Add-In ist verfügbar, wenn Sie daran herumbasteln möchten.
Eine Anmerkung des Autors
Für diejenigen unter Ihnen, die das noch einmal lesen: Nein, Sie sind nicht verrückt, der Titel hat sich ein wenig geändert.Ich habe eine Anfrage erhalten, den Titel zu aktualisieren, damit er für unsere Suchmaschinen leichter zu finden ist.Ich kann nur vermuten, dass das daran liegt, dass einige Suchmaschinen moderne Inkarnationen von Referenzbibliothekaren des 19. Jahrhunderts ohne Sinn für Humor sind.Bitte entschuldigen Sie die Unannehmlichkeiten.-M
PSWir entschuldigen uns aufrichtig für etwaige „John Jacob Jingleheimer Schmit“-Ohrwürmer.-M.
Anmerkung der Redaktion: Hast du das gelesen? weitere Teile unserer Engineering Mailbag-Reihe ? Sehen Sie, wie Mike einem Benutzer hilft, der verwendet hat JMP um zu entscheiden, ob Sie sich für einen Schneeräumdienst anmelden und einzigartige Visualisierungen für STEAM-Bildungsprogramme entwickeln möchten.
Graph Builder(
Größe( 466, 456 ),
Systemsteuerung anzeigen( 0 ),
Variablen( X( :S11_r ), Y( :S11_x ) ),
Elemente( Punkte( X, Y, Legend( 7 ) ) ),
SendToReport(
Versenden(
{},
„S11_r“,
ScaleBox,
{Min( -1 ), Max( 1 ), Inc( 0,5 ), Minor Ticks( 1 )}
),
Versenden(
{},
„S11_x“,
ScaleBox,
{Min( -1 ), Max( 1 ), Inc( 0,2 ), Minor Ticks( 0 )}
),
Versenden(
{},
„Graph Builder“,
FrameBox,
{Grafikskript hinzufügen(
2,
Beschreibung( „Smith Chart“) // Erstellen Sie eine Liste von Kreisen mit einem gewünschten Schritt und Widerstandsbereich
inc = 0,2;
resCircs = {0, 0,33, 1, 2, 5};
// Linienfarbe und -stärke festlegen
Stiftfarbe( „Grau“);
Stiftgröße (1);
// Durchlaufe die Liste der Widerstände, berechne und zeichne für jeden einen Kreis
For( i = 1, i <= N Items( resCircs ), i++,
Kreis(
{resCircs[i] / (1 + resCircs[i]), 0},
1 / (1 + resCircs[i])
)
);
For( i = 1, i <= N Items( resCircs ), i++,
Circle( {1, 1 / resCircs[i]}, 1 / resCircs[i] );
Circle( {1, 1 / -resCircs[i]}, 1 / -resCircs[i] );
);
Linie( {-1, 0}, {1, 0} );
Kreis( {0, 0}, 1 );
Marker( Color State( "red" ), {0.5, 0} );
)}
)
)
);