エンジニアリングメールバッグ
エピソード 3: ジョン ジェイコブ ジングルハイマー…スミス チャート!
私たちシステム エンジニアは、一般的な範囲をやや逸脱するような興味深い質問に遭遇することがあります。 JMP使用法。 これらのアプリケーションは一般に賢く、データの使用がビジネスや技術的な問題だけではないことを実感させることがよくあります。 また、質問が予想外の難しい問題であることもあります。 私はこれらを「変化球」と呼んでいます。
良い変化球が大好きです。
この特定のものを共有したいと思ったのには、いくつかの理由があります。 まず、これは、目標を達成するためにグラフのカスタマイズを再利用する方法の例です。 次に、問題を解決するときに私が経験する思考プロセスを説明します。 JMP 。 つまり、これは、その旅が結果よりもはるかに有益であるケースの 1 つです。 そこで、これ以上の資格は必要ありませんが、ニューヨーク州の別の同僚による非常に優れた変化球の例を以下に示します。共有すると楽しいだろうと思いました。
…記録のために言っておきますが、ニック、これは「簡単な質問」ではありませんでした!! ;D
質問
マイク[JMP]、簡単な質問 – 極座標タイプのグラフをプロットするための JMP のアドオンまたはスクリプトが存在するかどうかご存知ですか? つまり、RF インピーダンス解析のために、以下に貼り付けた例のように、スミス プロットで等高線プロットを実行しようとしています。 今のところは直交座標への変換で問題ありませんが、これを以前に見たことがあるか、JMP で助けてくれそうな誰かを知っているかどうか尋ねる価値はあると考えました。


スミス チャート テンプレート – 2 つのデータ フィールド (実数と虚数の座標値) をスミス チャートにプロットする方法はありますか?
Googleで等高線図の例を見つけました。 JMPで何かできそうな気がします…
ありがとう、
ニック[ユーザー]
私の反応:
こんにちは、ニック。その等高線図の作成に使用したデータを共有してもらえますか?
私かもしれないデータの上にグリッドをオーバーレイするという目的に適合するシェープファイルを作成できるようになります。 (約束はありませんが、正しく実行したかどうかをクロスチェックするためにデータが必要です。)
最高、
M
スミスチャートとは一体何でしょうか?
この質問を見たとき、まさに私がそう思っていました。 正直に言うと、私は彼がコミュニティで言及した質問を見ていました。 コミュニティの質問をひと目見て、こう思いました。 それは他の誰かのためです。」どうやら、人生には別の考えがあったようです。 それで、適切に叱責されたので、私はこれらの陰謀が何であるかを理解することから始めました。 非常に興味深い読み物ですが、正直に言うと、その核心的な詳細はこの議論にとってはあまり重要ではありません。
大まかに言えば、スミス チャートは電気工学に使用される極座標プロットの一種です。 (それは私にとって理にかなっていました。 )また、それらは重なり合う円と円弧で構成されており、特定の円の半径が測定された物理量に関係していることがわかります。 (繰り返しになりますが、特に親切な教授が講義ノートを Web サイトに掲載していたため、特に問題はありませんでした。その講義ノートには、物理量を円の半径に関連付けるために必要な方程式が含まれていました。 ) さらに、これらの作業を行う人は、プロットを容易にするためにデータを極座標系 (半径と角度でプロットされたデータ ポイント) からデカルト座標系 (x と y でプロットされたデータ ポイント) に変換するのが非常に一般的です。
開発プロセス
研究を終えたとき、何らかの方法で特定の半径を持つ円のグループを作成する必要があることがわかりました。また、それらの半径をユーザーが提供したデータのセットと一致させる必要がありました。 これについて考えれば考えるほど、グラフ ビルダー用のシェープファイルを構築するという最初のアイデアが適切ではなくなってきました。 これは問題があると考えた同僚によってさらに検証されました。 しかし、なぜ? まず、データをシェープファイル座標系と同じスケールに再スケールする必要があります。 詳細な文書があったとしても、これは問題の地雷原であるように見えました。 最終的には、舞台裏ですべてをスケールする完全に自己完結型のアドインを構築するか、シェープファイルを構築してフェンスを越えて問題なく実行されることを祈るかのどちらかが必要でした。 私はどちらの選択肢にも興味がありませんでした。 次に、円との交点で正しく開始および終了するように円弧を設定する方法を理解する必要があります。 簡単な仕事ではありません。
証拠は、私が求めていたデータを得る前に、最初のアイデアを破棄しなければならないことを示していました。 ここからどこへ行けばいいですか? 最初に戻りましょう! 私は自分の問題を再提起するために、簡単な質問から始めました。
- データをプロットできますか? はい、ユーザーがデータをデカルト座標に変換すると予想できるため、標準プラットフォーム (グラフ ビルダーまたは等高線プロット) のいずれかを使用してデータのプロットを生成できます。
- プロットをスミス チャートにするには何をする必要がありますか?一連の円、円弧、線を作成し、ラベルを付ける必要があります。
- それをすべて描くにはどうすればよいでしょうか?選択肢は 2 つあります。 グラフ ビルダーではシェープファイルを使用できますが、そのオプションはすでに削除されています。 シェープファイルでは、テキスト ラベルを簡単に使用することもできません。 グラフィックス スクリプトを使用して既存のプロットに注釈を付けることもできますが、それにはスクリプトが必要となり、ユーザーにとっては威圧的になる可能性があります。
- 注釈を付ける小さなアドインを構築したらどうなるでしょうか?この問題を詳しく調べれば調べるほど、それが私が進むべき方向であることが分かりました。 しかし、アドインを作成することに専念すれば、半導体ツール キットの最新ビルドから多くのサポート コードを再利用できることにも気づきました。(コードは常に保存してください、皆さん!)
グラフィックススクリプト
JMP でプロットを開きます – 任意の 2D プロット....さあ、お待ちください...。
準備ができて?
右! グラフ領域を右クリックし、下の方に目を向けます。 「カスタマイズ…」オプションが表示されますか? その選択肢を検討したことがありますか? ほとんどの人はそうではありません。 JMP 14 のおかげでそれが変わり始めると予想しています (境界図) ですが、これまでは JMP であまり一般的に使用されていなかったと思います。 カスタマイズでできることはたくさんあるので、これは残念です。 そして、プロットのカスタマイズにグラフィックス スクリプトを追加することで、スミス チャートを非常に簡単に作成できることがわかりました。さて、私が「Sワード」を使ったために冷や汗をかいた人もいるかもしれませんが、いいえ、そうではありません。それ剣–私が言いたかったのは「スクリプト」でした。ただし、必要なのは円、線、ラベルだけであり、これらは簡単にスクリプト化できることを覚えておいてください。 また、不要なビットの周囲にマスクを作成し、ラベルを見やすくするための形状を追加します。 以下のスミス チャートに示すように、それぞれを作成する方法を示します。
データのグラフ化
グラフィックス スクリプトにはまずグラフが必要です。 したがって、ステップ 1 (当然のことながら、いつも場合があります) データをグラフ化することです。 この場合、等高線プロットで平滑化された数式を使用しました (この小さなワークフローの詳細については、こちらを参照してください:すべてのウェーハ マップは間違っています: 半導体データ視覚化の冒険)。 そこから、グラフのカスタマイズを開きます。グラフィック スクリプトをカスタマイズに追加するには、左側のレイヤーのリストにある「+」ボタンを押すだけです。 これにより、スタックに新しいエントリが追加され、右側に空のスクリプト フィールドが表示されます。 必要に応じて、タイトルをダブルクリックしてスクリプトに名前を付けることができます (そうすることをお勧めします。これは非常に良い構成です)。 スクリプト フィールドの上のドロップダウンで探索できるテンプレートとサンプルがいくつかあり、アイデアを得るために試してみることができます。 スタック内でレイヤーが表示される順序によって、何が一番上にあるかが決まります。 一番下のレイヤーは眼球に最も近いものです (注 - これは後ろ向きほとんどのグラフィック アート ソフトウェアが行うものと同じです!) 最後に、私はいくつかのグラフィック スクリプトを使用していますが、他にもグラフィック スクリプトがあります。 これらは、スクリプト ガイドの [グラフィックス] グループの下にあります ([JMP - ヘルプ] > [スクリプト ガイド])。 見つけやすくするために、関数カテゴリを選択します)。
円を描く
サークルが使用するのは、円({,},<半径>)グラフィックス スクリプト内のコマンド。 これは、例の y = 0 線上に中心がある円に使用したスクリプトです (緑色のテキストは各部分の動作を説明しています)。
// 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]) )
);
円弧のコードも実際には円です。 (円弧は円の一部にすぎないことに注意してください。) 違いは、中心と半径の計算方法だけです。 また、リスト内のエントリごとに 2 つの円が作成されます。1 つは正の曲線用、もう 1 つは負の曲線用です。
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] );
);
次に、円の不要な部分をマスクする形状を作成します。
不規則な形(多角形)を描く
不規則な形状は、ポリゴン([],[])指示。 {x,y} 表記を使用して各頂点の位置を定義することもできますが、これは作業が面倒でした。 コードは次のようになります (読みやすくするために行列は削除されています)。
// define the fill color
Fill Color( "white" );
// define the polygon using matrices
Polygon([… xmatrix…],[…ymatrix…]);
省略された座標は、y = 0 の線を中心とする最大の円と同じサイズの中心から打ち出された円を持つ正方形を定義します。 ポリゴン スクリプトを円スクリプトの下 (つまり、スタックの最上部に近い) に配置すると、スミス プロットに必要のない円の部分がマスクされます。
マーカーとテキストの描画
マーカー (データ ポイント) はコマンドを使用しますMarker( Color State(), [], []) 。 Color State 引数はオプションですが、他のスクリプトから独立してマーカーの色を制御できます。 グラフにテキストラベルを付けるには、 Text(<位置調整>, {,}, <文字列>) 。 justification 引数はオプションで、{x,y} の位置はテキスト フィールドの中心です。 この例では、マーカーとテキストの座標は同じで、適切に位置を揃えるためにいくつかのオフセットと位置調整を組み込んだだけです (これにより、最後に毛深い if ステートメントが発生しました)。 これを簡単にするために、X、Y 座標とラベルを数値として含む単一の行列を使用しました。
// 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>
線を引く
行ではコマンドを使用します行({,},{,}) 。この例では、「正誤表」スクリプトに他の断片を含む行を追加しています。
// 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} );
すべてをまとめる
Semiconductor Tool Kit の Annotate 部分 (ここで行っていることとまったく同じことを行います) を使用すると、計算を既存のコードに置き換えて、Application Builder を使用して新しいアプリケーションを作成するのが非常に簡単でした (常にコードをリサイクルしてください) !)。 カスタマイズは、プレビューとして空のグラフ ボックスに適用されます。 結果に満足したら、[注釈] ボタンをクリックすると、グラフィックス スクリプトがプロットのカスタマイズにコピーされます。

最終的な考え
それで、私はこの小さな冒険で何を学んだでしょうか? まず、事実に従います。これには、問題のスコープ部分が含まれます。 私の最初のアイデアは完全に間違っていましたが、それがどれほど間違っているかを学びながら、適切な解決策を得るために必要な情報を収集していました。 第二に、ストローマンを燃やすことを恐れないでください。 うまくいかない場合は、最初のコンセプトを手放すことを恐れないでください。 3 番目 – カスタマイズでどれだけのことができるかにはいつも驚かされます。
のスミス チャート ジェネレーター アドインいじりたい場合は利用できます。
著者からのメモ
これをもう一度読んでいる人のために、いいえ、あなたは頭がおかしいわけではありません。タイトルは少し変わりました。検索エンジンで見つけやすいようにタイトルを更新してほしいというリクエストを受けました。これは、一部の検索エンジンが、ユーモアのセンスのない 19 世紀の参考図書館員の現代版であるためだと推測するほかありません。ご不便をおかけして申し訳ございません。-M
PS「ジョン ジェイコブ ジングルハイマー シュミット」のイヤーワームが発生している可能性があり、心からお詫びを申し上げます。-M.
編集者注:読んだことがありますかエンジニアリング メールバッグ シリーズの他の記事? を使用していたユーザーをマイクがどのように支援したかをご覧ください。 JMP除雪サービスに登録するかどうかを決定し、STEAM 教育プログラム用の独自のビジュアライゼーションを開発します。
グラフビルダー(
サイズ(466、456)、
コントロールパネルを表示(0)、
変数( X( :S11_r )、Y( :S11_x ) )、
要素( ポイント( X, Y, 凡例( 7 ) ) )、
SendToReport(
急送(
{}、
"S11_r"、
スケールボックス、
{最小( -1 )、最大( 1 )、増分( 0.5 )、マイナーティック( 1 )}
)、
急送(
{}、
"S11_x"、
スケールボックス、
{最小( -1 )、最大( 1 )、増分( 0.2 )、マイナーティック( 0 )}
)、
急送(
{}、
「グラフビルダー」、
フレームボックス、
{グラフィックス スクリプトの追加(
2、
description( "Smith Chart" ), // 希望のステップと抵抗範囲を使用して円のリストを作成します
増加 = 0.2;
resCircs = {0, 0.33, 1, 2, 5};
// 線の色と太さを設定します
ペンの色( "グレー" );
ペンのサイズ( 1 );
// 抵抗のリストをループし、それぞれの円を計算してプロットします
For( i = 1, i <= N Items( resCircs ), i++,
丸(
{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] );
);
Line( {-1, 0}, {1, 0} );
円( {0, 0}, 1 );
Marker( Color State( "red" ), {0.5, 0} );
)}
)
)
);