엔지니어링 메일백
에피소드 3: John Jacob Jingleheimer…스미스 차트!
때때로 우리 시스템 엔지니어는 일반적인 범위를 벗어나는 흥미로운 질문에 직면합니다. JMP 용법. 이러한 애플리케이션은 일반적으로 영리하며, 데이터를 사용하는 것이 단순히 비즈니스 또는 기술 문제에만 사용되는 것이 아니라는 점을 여러 번 깨닫게 합니다. 다른 경우에는 질문이 예상치 못한 어려운 문제일 수도 있습니다. 나는 이것을 "커브볼"이라고 부릅니다.
나는 좋은 커브볼을 좋아한다.
나는 몇 가지 이유로 이 특별한 것을 공유하고 싶었습니다. 첫째, 목표 달성을 위해 그래프 사용자 정의의 용도를 변경하는 방법의 예입니다. 그리고 두 번째로, 제가 문제를 해결할 때 거치는 사고 과정을 설명하겠습니다. JMP . 간단히 말해서, 이는 결과보다 여정이 훨씬 더 유익한 경우 중 하나입니다. 따라서 추가 자격을 갖추지 않고도 공유하면 재미있을 것이라고 생각한 뉴욕 주의 다른 동료의 정말 좋은 커브 볼의 예가 아래에 나와 있습니다.
...그리고 참고로 닉, 이것은 "빠른 질문"이 아니었습니다!! ;디
질문
마이크 [JMP],간단한 질문 – 극좌표 유형의 그래프를 그리는 데 필요한 JMP용 추가 기능이나 스크립트가 있는지 알고 계십니까? 즉, 일부 RF 임피던스 분석을 위해 아래에 붙여넣은 예와 같이 Smith Plot에서 등고선 플롯을 수행하려고 합니다.... 지금은 직각 좌표로 변환하는 것만으로 충분하지만, 이전에 본 적이 있는지, 아니면 도움을 줄 수 있는 JMP 직원을 알고 있는지 물어보는 것이 좋을 것 같습니다.


Smith 차트 템플릿 – 두 개의 데이터 필드(실제 및 가상 좌표 값)를 Smith 차트에 그리는 방법이 있습니까?
Google에서 등고선 플롯의 예를 찾았습니다. JMP가 할 수 있는 일인 것 같습니다…
감사해요,
닉 [사용자]
나의 응답:
안녕, 닉,등고선 플롯을 만드는 데 사용한 데이터를 공유할 수 있습니까?
나 ~할 것 같다 데이터 위에 그리드를 오버레이하는 방식에 맞는 셰이프파일을 생성할 수 있습니다. (약속은 없지만 올바르게 수행했는지 교차 확인하려면 데이터가 필요합니다.)
최상의,
중
스미스차트는 도대체 무엇인가?
제가 이 질문을 봤을 때 바로 그런 생각이 들었습니다. 솔직히 말해서 그가 커뮤니티에서 언급한 질문을 본 적이 있습니다. 저는 커뮤니티 질문을 보고 “아니요. 그건 다른 사람을 위한 일이에요.” 분명히 인생에는 다른 생각이있었습니다. 그래서 적절하게 징계를 받은 나는 이 음모가 무엇인지 알아내는 것부터 시작했습니다. 꽤 흥미로운 내용이지만 솔직히 말해서 핵심적인 세부 사항은 이 토론에서 중요하지 않습니다.
높은 수준에서 스미스 차트는 전기공학에 사용되는 극좌표 도표의 한 형태입니다. ( 그것은 나에게 의미가 있습니다. ) 또한 주어진 원의 반경이 측정된 물리량과 관련되어 있는 중첩된 원과 원호로 구성되어 있음이 밝혀졌습니다. ( 다시 말하지만, 문제 없습니다. 특히 친절한 교수가 웹사이트에 강의 노트를 게시했는데, 여기에는 물리량을 원의 반지름과 연관시키는 데 필요한 방정식이 포함되어 있었습니다. ) 또한 이러한 작업을 하는 사람들은 더 쉬운 플롯을 위해 극 좌표계(반경과 각도로 표시된 데이터 포인트)의 데이터를 데카르트 시스템(x와 y로 표시된 데이터 포인트)으로 변환하는 것이 매우 일반적입니다.
개발 과정
연구를 마쳤을 때 특정 반지름을 가진 원 그룹을 어떻게든 만들어야 한다는 사실을 발견했고, 사용자가 제공한 데이터 세트와 일치하는 반지름이 필요했습니다. 이에 대해 더 많이 생각할수록 Graph Builder용 셰이프파일을 구축하려는 초기 아이디어가 적합하지 않은 것 같았습니다. 이는 문제가 될 것이라고 생각한 동료에 의해 추가로 확인되었습니다. 그런데 왜? 우선, 데이터의 크기를 Shapefile 좌표계와 동일한 크기로 조정해야 합니다. 상세한 문서를 작성했음에도 불구하고 이는 문제의 지뢰밭처럼 보였습니다. 궁극적으로는 무대 뒤에서 모든 것을 확장하는 완전히 독립적인 추가 기능을 구축하거나 셰이프파일을 구축하고 울타리 너머로 던진 후 문제 없이 실행되기를 바라야 했습니다. 나는 그 옵션 중 하나에 열광하지 않았습니다. 둘째, 원과의 교차점에서 올바르게 시작하고 끝나도록 호를 설정하는 방법을 알아내야 했습니다. 쉬운 일이 아닙니다.
증거에 따르면 제가 요청한 데이터를 얻기도 전에 초기 아이디어를 폐기해야 했습니다! 여기서 어디로 갈 수 있나요? 처음으로 돌아가세요! 나는 내 문제를 재구성하기 위해 간단한 질문부터 시작했습니다.
- 데이터를 플롯할 수 있나요? 예, 사용자가 데이터를 데카르트 좌표로 변환할 것이라고 예상할 수 있으므로 표준 플랫폼(Graph Builder 또는 Contour Plot) 중 하나를 사용하여 데이터 플롯을 생성할 수 있습니다.
- 플롯을 스미스 차트로 만들려면 어떻게 해야 합니까?일련의 원, 호, 선을 만들고 레이블을 지정해야 합니다.
- 저걸 어떻게 다 그리나요?두 가지 옵션이 있습니다. 그래프 빌더에서는 쉐이프파일을 사용할 수 있지만 이미 해당 옵션을 제거했습니다. 또한 Shapefile을 사용하면 텍스트 레이블을 쉽게 사용할 수 없습니다. 그래픽 스크립트를 사용하여 기존 플롯에 주석을 달 수 있지만 그러려면 사용자에게 위협이 될 수 있는 스크립팅이 필요합니다.
- 주석을 추가하는 작은 추가 기능을 만들면 어떻게 될까요?이 문제를 자세히 살펴볼수록 그것이 내가 가야 할 방향이라는 것을 더욱 깨달았습니다. 그러나 추가 기능을 만들려고 노력하면 가장 최근의 Semiconductor Tool Kit 빌드에서 많은 지원 코드를 재활용할 수 있다는 것도 깨달았습니다.(항상 코드를 저장해두세요!)
그래픽 스크립트
JMP에서 임의의 2D 플롯을 엽니다....계속 기다리겠습니다…
준비가 된?
오른쪽! 그래프 영역을 마우스 오른쪽 버튼으로 클릭하고 아래쪽을 살펴보세요. "사용자 정의..." 옵션이 보이나요? 그 옵션을 탐색해 본 적이 있나요? 대부분의 사람들은 그렇지 않았습니다. JMP 14로 인해 이러한 상황이 바뀔 것으로 예상됩니다( 경계 지도 ), 하지만 지금까지는 JMP에서 그다지 일반적으로 사용되지 않았던 영역인 것 같습니다. 사용자 정의로 많은 일을 할 수 있기 때문에 안타깝습니다. 그리고 플롯의 사용자 정의에 그래픽 스크립트를 추가하면 스미스 차트를 만드는 것이 정말 쉽다는 것이 밝혀졌습니다.자, 여러분 중 몇몇은 제가 '검'을 사용했기 때문에 식은땀을 흘렸을 것입니다. 저것 검 – 나는 "스크립트"를 의미했습니다. 하지만 우리에게 필요한 것은 원, 선, 레이블뿐이며 이는 스크립트로 작성하기 쉽다는 점을 기억하십시오. 또한 필요하지 않은 부분 주위에 마스크를 만들고 레이블을 더 쉽게 볼 수 있도록 모양을 추가하겠습니다. 아래 스미스 차트에서 볼 수 있듯이 각 항목을 만드는 방법은 다음과 같습니다.
데이터 그래프화
그래픽 스크립트에는 먼저 그래프가 필요합니다. 따라서 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]) )
);
호의 코드는 실제로 원이기도 합니다. (호는 원의 일부일 뿐이라는 점을 기억하십시오.) 차이점은 중심과 반경을 계산하는 방법에 있습니다. 또한 목록의 항목당 두 개의 원이 생성됩니다. 하나는 양의 곡선용이고 다른 하나는 음의 곡선용입니다.
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 선의 중심에 있는 가장 큰 원과 동일한 크기의 원이 중심에서 튀어나온 사각형을 정의합니다. 원 스크립트 아래(즉, 스택의 상단에 더 가까운) 다각형 스크립트를 놓으면 Smith 플롯에 필요하지 않은 원 부분이 가려집니다.
그리기 마커 및 텍스트
마커(데이터 포인트)는 다음 명령을 사용합니다. 마커( 색상 상태(), [], []) . 색상 상태 인수는 선택 사항이지만 다른 스크립트와 관계없이 마커 색상을 제어할 수 있습니다. 그래프에 텍스트 레이블을 추가하는 방법은 다음과 같습니다. 텍스트(<정렬>, {,}, <문자열>) . 정당화 인수는 선택 사항이며 {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>
선 그리기
한 줄에서는 다음 명령을 사용합니다. 라인({,},{,}) .이 예에서는 "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} );
모든 것을 하나로 모으기
Semiconductor Tool Kit의 Annotate 부분(여기에서 수행하는 것과 동일한 작업 수행)을 사용하면 계산을 기존 코드로 대체하고 Application Builder를 사용하여 새 응용 프로그램을 만드는 것이 매우 쉬웠습니다(항상 코드를 재활용하십시오. !). 사용자 정의는 빈 그래프 상자에 미리보기로 적용됩니다. 결과가 만족스러우면 그래픽 스크립트를 플롯의 사용자 정의에 복사하는 주석 버튼을 클릭할 수 있습니다.

마지막 생각들
그렇다면 나는 이 작은 모험에서 무엇을 배웠는가? 첫째 – 사실을 따르십시오. 여기에는 문제의 범위 지정 부분이 포함됩니다. 내 원래 생각은 완전히 틀렸지만 그것이 얼마나 틀렸는지를 배우는 동안 적절한 해결책을 찾는 데 필요한 정보를 수집했습니다. 둘째, 허수아비를 태우는 것을 두려워하지 마십시오. 작동하지 않을 경우 초기 개념을 버리는 것을 두려워하지 마십시오. 셋째 – 저는 사용자 정의를 통해 얼마나 많은 일을 할 수 있는지에 끊임없이 놀랐습니다.
그만큼 스미스 차트 생성기 추가 기능 당신이 그것을 고치고 싶다면 사용할 수 있습니다.
저자의 메모
이 글을 다시 읽는 분들을 위해 말씀드리자면, 제정신이 아니군요. 제목이 조금 바뀌었습니다.검색 엔진에서 더 쉽게 찾을 수 있도록 제목을 업데이트해 달라는 요청을 받았습니다.나는 이것이 일부 검색 엔진이 유머 감각이 없는 19세기 참고 사서의 현대적 화신이기 때문이라고 추측할 수 있습니다.불편을 끼쳐드려 죄송합니다.-중
추신귀하가 겪고 있는 "John Jacob Jingleheimer Schmit" 귀벌레에 대해 진심으로 사과드립니다.-중.
편집자 주: 읽어 보셨나요? Engineering Mailbag 시리즈의 다른 기사 ? Mike가 다음을 사용하는 사용자를 어떻게 돕는지 알아보세요. JMP 제설 서비스 등록 여부를 결정하고 STEAM 교육 프로그램을 위한 고유한 시각화를 개발합니다.
그래프 빌더(
크기( 466, 456 ),
제어판 표시( 0 ),
변수( X( :S11_r ), Y( :S11_x ) ),
요소( 점( X, Y, 범례( 7 ) ) ),
SendTo보고(
보내다(
{},
"S11_r",
스케일박스,
{최소( -1 ), 최대( 1 ), Inc( 0.5 ), 사소한 틱( 1 )}
),
보내다(
{},
"S11_x",
스케일박스,
{최소( -1 ), 최대( 1 ), Inc( 0.2 ), 사소한 틱( 0 )}
),
보내다(
{},
"그래프 빌더",
프레임박스,
{그래픽 스크립트 추가(
2,
Description( "Smith Chart" ), // 원하는 단계와 저항 범위를 사용하여 원 목록을 만듭니다.
증분 = 0.2;
resCircs = {0, 0.33, 1, 2, 5};
// 선 색상과 두께 설정
펜 색상( "회색" );
펜 크기( 1 );
// 저항 목록을 순환하고 각 저항에 대한 원을 계산하고 그립니다.
For( i = 1, i <= N 항목( resCircs ), i++,
원(
{resCircs[i] / (1 + resCircs[i]), 0},
1 / (1 + resCircs[i])
)
);
For( i = 1, i <= N 항목( resCircs ), i++,
원({1, 1 / resCircs[i]}, 1 / resCircs[i] );
원({1, 1 / -resCircs[i]}, 1 / -resCircs[i] );
);
라인({-1, 0}, {1, 0});
원({0, 0}, 1);
마커( 색상 상태( "빨간색" ), {0.5, 0} );
)}
)
)
);