2009-02-02
org.kosen.entty.User@3882e4f7
김종구(katews)
- 2
안녕하세요
제가 matlab이란 프로그램을 처음접해서 응용이 부족하여 도움을 청합니다.
(1) Zin/Zo= root(ur/er) tanh(j2phi f d /c (root (ur er)))
(2) Return loss = 20 log ((Zin-Zo)/(Zin+Zo)
이식을 프로그램화 하고 싶은데 ur, er, f, d 는 변수이고 c는 고정값입니다.
구하고 싶은것은 Return loss 인데 데이터가 200개가 넘어서 좀 힘이 드네요 ㅜㅜ
정말 부탁 드립니다... ㅜㅜ
- matlab
지식의 출발은 질문, 모든 지식의 완성은 답변!
각 분야 한인연구자와 현업 전문가분들의 답변을 기다립니다.
각 분야 한인연구자와 현업 전문가분들의 답변을 기다립니다.
답변 2
-
답변
이응신님의 답변
2009-02-02- 2
매트랩에 관련된 책을 교보문고와 같은 인터넷 서점에서 찾아보면 쉬운 책부터 어려운 책까지 골고루 다 있습니다. 특히 초보자용으로 나온 책도 있습니다. 절판이 되었는지 모르겠군요. 또는 인터넷에서 한글로 된 자료도 검색해보면 어지간한 프로그래밍을 하는데 어려움이 없습니다. 좀 더 높은 수준의 프로그래밍은 매트랩을 설계한 Mohler가 쓴 수치해석이라는 책도 있는데 읽어본 경험에 의하면... 다른 저자가 쓴 책보다 더 못한 서술이 많아 실망할 것입니다. (한글판도 있습니다) 위에서 지적한 200개의 데이터를 처리하는것은 우스운 정도의 개수입니다. 신호처리에서 사용하는 매트랩은 어지간하면 수십만개의 데이터들을 FFT로 처리하니까 200개 정도는 별로 어렵지 않습니다. 변수들을 서로 나누고 곱하기 때문에 기존의 프로그래밍으로 하면 에러가 나오므로 벡터컴퓨팅을 하는 방식으로 처리해야 합니다. (매트랩의 최대 강점 중의 하나입니다) PC에서 수퍼컴에서 하는 벡터컴퓨팅을 실현하기 때문입니다. 벡터 컴퓨팅은 곱하기나 나누기 앞에 점을 찍고 연산을 표시하므로 관련 서적이나 자료를 봐야 감이 잡힐 것입니다. >안녕하세요 > >제가 matlab이란 프로그램을 처음접해서 응용이 부족하여 도움을 청합니다. > > > >(1) Zin/Zo= root(ur/er) tanh(j2phi f d /c (root (ur er))) > >(2) Return loss = 20 log ((Zin-Zo)/(Zin+Zo) > > > >이식을 프로그램화 하고 싶은데 ur, er, f, d 는 변수이고 c는 고정값입니다. > >구하고 싶은것은 Return loss 인데 데이터가 200개가 넘어서 좀 힘이 드네요 ㅜㅜ > > > >정말 부탁 드립니다... ㅜㅜ > -
답변
이응신님의 답변
2009-02-02- 2
매트랩에서 벡터컴퓨팅을 해도 처리하는 수가 몇 백만개 이하로 되면 별로 효과가 없습니다. 즉, 수만개 데이터를 처리하려면 고전적인 루프방식의 반복법을 사용해도 속도면에서 그렇게 느리지 않습니다. 문제는 질문을 하신대로 변수가 분자, 분모에 모두 나타나서 루프방식으로 인덱스를 정해도 인덱스의 범위가 서로 맞지 않아 지극히 곤란할 경우에 매트랩을 적용하면 가볍게 해결됩니다. 즉, 벡터컴퓨팅을 하는 기법을 사용하면 일반적인 프로그래밍 언어의 루프방식보다 훨씬 더 효과적인 풀이법을 가질 수 있다는 것입니다. 매트랩은 옛날 처음 EISPACK과 같은 수퍼컴용으로 나왔을 때 포트란으로 컴파일러를 설계하였으나 오늘날 Mathworks사가 인수하면서 C/C++로 설계를 하여 프로그래밍을 할 때 C++에서 나오는 방식대로 하면 아주 잘 돌아갑니다. 초보자라고 하니까 자세한 내용은 생략하고 (관련 서적이나 자료를 검색해보십시오) 벡터컴퓨팅을 하는 식으로 프로그래밍을 해야 합니다. 에디터를 열고... %============ 프로그래밍 예제 ================================ clear all; % 이것은 메모리를 청소하여 초기상태로 만드는 옵션 % 변수와 상수를 지정한다. 상수는 선언을 하고 변수는 벡터로 만든다. c=123; % 상수는 원래 지정된 값을 선언 ur=linspace(0,1,200); % 변수 ur의 벡터선언: 0에서 1까지 범위를 양끝단을 포함하여 % 200 개로 선언함 (컴퍼넌트가 200개), 실제 변수가 움직이는 범위를 지정할 것 er=linspace(0,1,200); % 변수 er의 벡터선언: 역시 변수 범위내에 원하는 값을 설정, % 그러나 중요한 사항은 변수 범위가 달라지더라도 개수는 200 개로 일치시켜주어야 함 f=linspace(0,1,200); % 위와 같음, 범위가 달라지더라도 개수는 200개로 % 만약 정밀도를 높이려면 점의 개수를 더 올린다 d=linspace(0,1,200); % 위와 같음 % 입력과 출력의 비례관계를 정한다. 복소수는 처리가 가능하므로 그대로 유지하거나 % 다른 방식으로 실수부와 허수부로 분리를 할 수 있다. % 보통 입력과 출력이 공식으로 나와있지만 비례관계는 계산을 통해 얻는다. % tanh 안의 변수가 확실치 않다. 아마 2phi*j (j는 복소수)라고 추측이 가능 % 복소수가 아니라 실수라고 한다면 j2phi가 어떤값인지 몰라 더 이상 진행 불가. % root는 아마 제곱근 (sqrt)로 예상 R=sqrt(ur./er).*tanh(j2phi*f.*d./(c*sqrt(ur.*er))); % 이렇게 하면 전통적인 루프를 사용하지 않고 벡터컴퓨팅으로 거의 일반적인 연산에 % 가깝게 식을 표시하고 엄청 빠르게 매트랩에서 처리한다. % Return값을 구해야 하는데... 아마 식을 조금 손을 봐야 할 듯 % 손실값을 데시벨로 나타내는 식인듯... % Loss = 20 log ((Zin/Zo-1)/(Zin/Zo+1))=20 log ((R-1)/(R+1)) % 매트랩 함수에서 log는 자연로그, log10은 상용로그이므로 두 개를 구분해야 할 듯 Loss=20*log10((R-1)./(R+1)); %================================================== 이렇게 하면 벡터컴퓨팅에 따른 매트랩 프로그래밍 기법을 적용한 풀이가 됩니다. 손실값이 각 주파수 대역별로 따로 계산되어 나오므로 아주 편리하게 플로팅을 해서 그릴 수 있습니다. 복소수로 나온다면 크기 부분과 위상 부분을 따로 분리해서 플로팅을 하면 주파수 대역에 따른 값의 변화가 연속으로 나옵니다. 아마 주파수 대역은 세밀하게 나누어야 하므로 점의 개수를 최소한 10000 개 이상으로 잡아야 할 듯 하고, 매트랩 자체가 복소수 연산이 가능하나 도중에 에러가 나면 찾지를 못하므로 실수부와 허수부를 갈라서 따로 연산한 다음 이득값을 계산하시기 바랍니다. 위의 공식에 따른 손실정도는 데시벨 계산으로 나오니까 매트랩 관련 서적을 찾아보면 그대로 ... 아마 똑같이 처리를 한 예제가 나올 것입니다. 그래도 정 못믿겠다면 Mathworks사의 라이버러리에 가면 여러 가지 예제가 있습니다. www.mathworks.com 매트랩은 이공계의 수치해석을 하는 표준 패키지로 거의 자리잡고 있으므로 관련 분야 책도 많이 나와있습니다. 괜히 골치아프게 프로그래밍을 하는 것 보다는 인터넷이나, 책, 검색으로 프로그래밍을 한 것을 찾아 약간의 수정을 해야 편합니다. >안녕하세요 > >제가 matlab이란 프로그램을 처음접해서 응용이 부족하여 도움을 청합니다. > > > >(1) Zin/Zo= root(ur/er) tanh(j2phi f d /c (root (ur er))) > >(2) Return loss = 20 log ((Zin-Zo)/(Zin+Zo) > > > >이식을 프로그램화 하고 싶은데 ur, er, f, d 는 변수이고 c는 고정값입니다. > >구하고 싶은것은 Return loss 인데 데이터가 200개가 넘어서 좀 힘이 드네요 ㅜㅜ > > > >정말 부탁 드립니다... ㅜㅜ >김종구(katews) 2009-02-02선생님 정말 감사드립니다. 정말 많은 도움을 받았습니다. 지금부터는 제가 공부해서 좋은 데이터 내도록 노력하겠습니다. 다시한번 정말 감사드립니다.
제가 화학을 전공하는 학생이라서 챙피한 이야기지만 수학과 프로그래밍분야는 무지합니다..
스스로 공부해야겠지만 새로운 분야를 공부한다는 것이 쉽지많은 않은 일이라서 가능하시다면 matlab에서 식 쓰는법 많이라도 가르쳐 주시면 안될까요? 부탁드립니다.