Il sacco della posta dell'ingegneria
Episodio 3: John Jacob Jingleheimer…Smith Charts!
Di tanto in tanto noi ingegneri di sistema ci imbattiamo in domande interessanti che esulano un po' dall'ambito tipico JMP utilizzo. Queste applicazioni sono generalmente intelligenti e molte volte dimostrano come l'utilizzo dei dati non sia solo per problemi aziendali o tecnici. Altre volte, le domande sono solo problemi inaspettati e stimolanti. Io le chiamo "palle curve".
Adoro una buona palla curva.
Volevo condividere questo in particolare per un paio di motivi. Innanzitutto, è un esempio di come riutilizzare le personalizzazioni dei grafici per raggiungere un obiettivo. In secondo luogo, illustrerò il processo di pensiero che seguo quando risolvo i problemi utilizzando JMP . Insomma, questo è uno di quei casi in cui il viaggio è decisamente più istruttivo del risultato. Quindi, senza ulteriori precisazioni, di seguito è riportato un esempio di una palla curva davvero buona di un altro collega dello stato di New York che ho pensato sarebbe stato divertente condividere.
…E per la cronaca, Nick, questa non era una “domanda veloce”!! ;D
La domanda
Mike [JMP],Domanda veloce: sai se esiste un componente aggiuntivo o uno script per JMP per tracciare tipi di grafici in coordinate polari? Vale a dire cercare di creare grafici di contorno su un diagramma di Smith, esempio incollato di seguito, per alcune analisi di impedenza RF.... Per ora possiamo convivere con la conversione in coordinate rettangolari, ma ho pensato che valesse la pena chiederti se l'hai già visto o se conoscevi qualcuno in JMP che potrebbe essere in grado di aiutarti.


Modello di grafico Smith: esiste un modo per tracciare due campi dati (valori di coordinate reali e immaginari) su un grafico Smith?
Ho trovato un esempio di diagramma di contorno su Google. Sembra che JMP possa fare qualcosa...
Grazie,
Nick [Utente]
La mia risposta:
Ciao, Nick,Puoi condividere i dati che hai utilizzato per realizzare il diagramma di contorno?
IO Potrebbe essere in grado di creare uno shapefile che si adatti alla sovrapposizione della griglia sui dati. (Nessuna promessa, ma avrei bisogno dei dati per un controllo incrociato se l'ho fatto correttamente.)
Migliore,
M
Che diavolo è un grafico di Smith?
Questo è esattamente quello che stavo pensando quando ho visto questa domanda. Ad essere sincero, avevo visto le domande da lui menzionate nella Community. Ho dato un'occhiata alla domanda sulla community e ho pensato: "No. Quello è per qualcun altro." A quanto pare, la vita aveva altre idee. Quindi, opportunamente rimproverato, ho iniziato a capire quali fossero questi complotti. È una lettura piuttosto interessante, ma ad essere onesti, i dettagli essenziali non contano davvero per questa discussione.
Ad alto livello, una carta di Smith è un tipo di grafico delle coordinate polari utilizzato per l'ingegneria elettrica. ( Per me aveva senso. ) Si scopre anche che sono costituiti da cerchi sovrapposti e archi di cerchio in cui il raggio di un dato cerchio è correlato a quantità fisiche misurate. ( Ancora una volta, nessun problema, soprattutto perché un gentile professore aveva pubblicato sul loro sito web gli appunti delle lezioni, che includevano le equazioni necessarie per mettere in relazione le quantità fisiche con i raggi dei cerchi. ) Inoltre, è abbastanza comune per le persone che lavorano con queste cose convertire i dati dal sistema di coordinate polari (punti dati tracciati in raggio e angolo) in un sistema cartesiano (punti dati tracciati in xey) per facilitare il tracciamento.
Il processo di sviluppo
Una volta terminata la mia ricerca, avevo scoperto che dovevo in qualche modo costruire un gruppo di cerchi con raggi specifici e avevo bisogno che quei raggi corrispondessero a un insieme di dati fornito dall'utente. Più ci pensavo, meno la mia idea iniziale di creare uno shapefile per Graph Builder sembrava essere una buona idea. Ciò è stato ulteriormente convalidato da un collega che pensava che sarebbe stato problematico. Ma perché? Bene, prima di tutto, i dati dovrebbero essere riscalati alla stessa scala del sistema di coordinate dello shapefile. Anche con una documentazione dettagliata, questo sembrava essere un campo minato di problemi. Alla fine sarebbe stato necessario creare un componente aggiuntivo completamente autonomo che ridimensionasse tutto dietro le quinte oppure creare lo shapefile, gettarlo oltre il recinto e sperare che funzionasse senza problemi. Non ero pazzo di nessuna di queste opzioni. In secondo luogo, dovrei capire come impostare correttamente gli archi in modo che inizino e finiscano alle intersezioni con i cerchi. Non è un compito facile.
Le prove indicavano che dovevo scartare la mia idea iniziale – prima ancora di avere i dati richiesti! Dove andrei da qui? Ritorno all'inizio! Ho iniziato con una semplice serie di domande per riformulare il mio problema.
- Posso tracciare i dati? Sì, poiché posso aspettarmi che gli utenti convertano i dati in coordinate cartesiane, posso utilizzare una delle piattaforme standard (Graph Builder o Contour Plot) per generare un grafico dei dati.
- Cosa devo fare alla trama per trasformarla in una carta di Smith?Devo creare una serie di cerchi, archi e linee ed etichettarli.
- Come faccio a disegnare tutto ciò?Ho due opzioni. Il Costruttore di grafici mi consentirebbe di utilizzare gli shapefile, ma abbiamo già eliminato questa opzione. Inoltre, uno shapefile non mi consentirebbe di utilizzare facilmente le etichette di testo. Gli script grafici potrebbero essere utilizzati per annotare la trama esistente, ma ciò richiederebbe script che potrebbero intimidire un utente.
- E se creassi un piccolo componente aggiuntivo che esegua l'annotazione?Più osservavo questo problema da vicino, più mi rendevo conto che quella era la direzione in cui dovevo andare. Ma mi sono anche reso conto che se mi fossi impegnato a creare un componente aggiuntivo, avrei potuto riciclare molto codice di supporto dalla mia build più recente del Semiconductor Tool Kit.(Salvate sempre il vostro codice, ragazzi!)
Script grafici
Apri un grafico in JMP – qualsiasi grafico 2D....Continua, aspetterò….
Pronto?
Giusto! Fare clic con il tasto destro sull'area del grafico e guardare verso il basso. Vedi l'opzione "Personalizza..."? Hai mai esplorato questa opzione? La maggior parte delle persone no. Mi aspetto che le cose inizieranno a cambiare a causa di JMP 14 ( Mappa dei confini ), ma fino ad ora non credo che sia stata un'area di utilizzo molto comune in JMP. Il che è un peccato, perché puoi fare così tanto con le personalizzazioni. E si scopre che un diagramma di Smith è davvero facile da creare aggiungendo script grafici alle personalizzazioni di una trama.Ora, alcuni di voi probabilmente hanno sudato freddo perché ho usato la “parola che inizia con la S” – no, no Quello spada – Intendevo "script". Ma ricorda, tutto ciò di cui abbiamo bisogno sono cerchi, una linea ed etichette, e queste sono facili da scrivere. Aggiungerò anche una forma per creare una maschera attorno ai pezzi che non ci servono e per rendere le etichette più facili da vedere. Ecco come li realizziamo, come mostrato nella tabella Smith qui sotto.
Rappresentazione grafica dei dati
Gli script grafici necessitano innanzitutto di un grafico. Quindi, il passaggio 1 (come dovrebbe Sempre essere il caso) è quello di rappresentare graficamente i dati. In questo caso, ho utilizzato una formula smussata in un diagramma di contorno (maggiori informazioni su quel piccolo flusso di lavoro qui: Tutte le mappe wafer sono sbagliate: un'avventura nella visualizzazione dei dati dei semiconduttori ). Da lì, apri le personalizzazioni per il grafico.Per aggiungere uno script grafico alle personalizzazioni, basta premere il pulsante "+" nell'elenco dei livelli a sinistra. Questo ti dà una nuova voce nello stack e un campo di script vuoto sulla destra. Puoi dare un nome allo script, se vuoi, facendo doppio clic sul titolo (ti consiglio di farlo: è semplicemente una buona organizzazione). Ci sono alcuni modelli ed esempi che puoi esplorare nei menu a discesa sopra il campo di scripting con cui puoi giocare per ottenere idee. L'ordine in cui i livelli appaiono nella pila determina cosa si trova in cima. Gli strati nella parte inferiore sono più vicini al bulbo oculare (nota: questo è all'indietro da quello che fa la maggior parte dei software per le arti grafiche!) Infine, mentre utilizzo alcuni script grafici, ce ne sono altri. Sono reperibili nel gruppo Grafica nella guida allo scripting (in JMP - Guida > Guida allo scripting. Selezionare la Categoria Funzioni per facilitarne la ricerca).
Cerchi di disegno
I cerchi utilizzano il Cerchio({,},) comando in uno script grafico. Ecco lo script che ho usato per i cerchi con i loro centri sulla linea y = 0 nell'esempio (il testo verde descrive cosa fa ciascuna parte).
// 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]) )
);
Il codice per gli archi in realtà sono anche cerchi. (Ricorda, un arco è solo una parte di un cerchio.) La differenza sta proprio nel modo in cui vengono calcolati il centro e il raggio. Vengono inoltre creati due cerchi per voce nell'elenco: uno per la curva positiva e uno per quella negativa.
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] );
);
Successivamente, creerò una forma per mascherare le parti dei cerchi che non mi servono.
Disegnare forme irregolari (poligoni)
Le forme irregolari utilizzano il Poligono([],[]) comando. Puoi anche definire la posizione di ciascun vertice utilizzando una notazione {x,y}, ma è stato difficile lavorarci. Il codice si presenta così (con le matrici rimosse per leggibilità):
// define the fill color
Fill Color( "white" );
// define the polygon using matrices
Polygon([… xmatrix…],[…ymatrix…]);
Le coordinate omesse definiscono un quadrato con un cerchio fuori centro della stessa dimensione del più grande dei cerchi centrati sulla linea y = 0. Mettendo lo script del poligono sotto gli script del cerchio (cioè, più vicino alla cima della pila) maschera le parti dei cerchi che non sono necessarie per il diagramma di Smith.
Indicatori di disegno e testo
I marcatori (punti dati) utilizzano il comando Marker( Stato colore(), [], []) . L'argomento Stato colore è facoltativo ma consente di controllare i colori dei marcatori indipendentemente da qualsiasi altro script. Utilizzare etichette di testo su un grafico Testo(, {,}, ) . L'argomento giustificazione è facoltativo e la posizione {x,y} è per il centro del campo di testo. Nell'esempio, le coordinate sono le stesse tra i marcatori e il testo e ho semplicemente incorporato alcuni spostamenti e aggiustamenti della giustificazione per allineare correttamente le cose (il che ha dato origine a quella pelosa istruzione if alla fine). Per renderlo più semplice, ho utilizzato un'unica matrice che conteneva le coordinate x,y e l'etichetta come numero.
// 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>
Linee di disegno
Una riga utilizza il comando Linea({,},{,}) .Nell'esempio, ho inserito la mia riga insieme ad altri frammenti nello 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} );
Mettere tutto insieme
Utilizzando la parte Annota del Semiconductor Tool Kit (che fa esattamente la stessa cosa che stiamo facendo qui), è stato abbastanza semplice sostituire i calcoli nel codice esistente e creare una nuova applicazione utilizzando Application Builder (riciclare sempre il codice, gente !). Le personalizzazioni vengono applicate a una casella grafica vuota come anteprima. Quando sei soddisfatto dei risultati, puoi fare clic sul pulsante Annota che copierà gli script grafici nelle personalizzazioni per i tuoi grafici.

Pensieri finali
Allora, cosa ho imparato in questa piccola avventura? Primo: seguire i fatti; questo include la parte relativa all'ambito di un problema. La mia idea originale era completamente sbagliata, ma mentre imparavo quanto fosse sbagliata, raccoglievo le informazioni necessarie per ottenere una soluzione adeguata. Secondo: non aver paura di bruciare l'uomo di paglia. Non aver paura di lasciare andare il tuo concetto iniziale se non funzionerà. Terzo: sono costantemente stupito da quanto si può fare con le personalizzazioni.
IL Componente aggiuntivo del generatore di grafici Smith è disponibile se vuoi armeggiare con esso.
Una nota dell'autore
Per quelli di voi che leggono di nuovo questo, no, non siete pazzi, il titolo è cambiato un po'.Ho ricevuto una richiesta di aggiornamento del titolo in modo che sia più facile da trovare per i nostri motori di ricerca.Posso solo immaginare che ciò sia dovuto al fatto che alcuni motori di ricerca sono incarnazioni moderne di bibliotecari di riferimento del XIX secolo senza senso dell'umorismo.Ci scusiamo per eventuali disagi.-M
PSLe più sincere scuse per eventuali vermi auricolari "John Jacob Jingleheimer Schmit" che potresti incontrare.-M.
Nota dell'editore: Hai letto il altre puntate della nostra serie Engineering Mailbag ? Guarda come Mike aiuta un utente che stava utilizzando JMP per decidere se iscriversi a un servizio di rimozione della neve e sviluppare visualizzazioni uniche per i programmi educativi STEAM.
Costruttore di grafici(
Taglia (466, 456),
Mostra Pannello di controllo( 0 ),
Variabili( X( :S11_r ), Y( :S11_x ) ),
Elementi( Punti( X, Y, Legenda( 7 ) ) ),
Invia al rapporto (
Spedizione(
{},
"S11_r",
ScaleBox,
{Min( -1 ), Max( 1 ), Inc( 0,5 ), tick minori( 1 )}
),
Spedizione(
{},
"S11_x",
ScaleBox,
{Min( -1 ), Max( 1 ), Inc( 0,2 ), tick minori( 0 )}
),
Spedizione(
{},
"Costruttore di grafici",
FrameBox,
{Aggiungi script grafico(
2,
Descrizione("Smith Chart"), // crea un elenco di cerchi utilizzando il passo e l'intervallo di resistenze desiderati
aumento = 0,2;
risCircs = {0, 0,33, 1, 2, 5};
// imposta il colore e lo spessore della linea
Colore penna ("Grigio");
Dimensione penna(1);
// scorre l'elenco delle resistenze, calcola e traccia un cerchio per ciascuna
For( i = 1, i <= N elementi( resCircs ), i++,
Cerchio(
{resCircs[i] / (1 + resCircs[i]), 0},
1 / (1 + resCircs[i])
)
);
For( i = 1, i <= N elementi( resCircs ), i++,
Cerchio( {1, 1 / resCircs[i]}, 1 / resCircs[i] );
Cerchio( {1, 1 / -resCircs[i]}, 1 / -resCircs[i] );
);
Linea( {-1, 0}, {1, 0} );
Cerchio({0, 0}, 1);
Indicatore (Stato colore( "rosso"), {0,5, 0});
)}
)
)
);