2006-11-30
org.kosen.entty.User@4ddc9408
조영권(blue3443)
- 3
얼마전 포트란 프로그래밍에 관한 질문을 올렸다가 유용한 답변을 잘 받았습니다. 이와 관련해서 짧은 질문 드리고 싶습니다.
답변 중에, 미분 방정식을 풀 때 일일이 코딩하지 않고 matlab과 같은 프로그램을 이용하는 것이 좋다고 말씀해 주셨는데요.
저는 평소에 계산을 위해서 포트란과 매스매티카를 주로 이용해 왔습니다. 두 가지로 필요한 것을 대부분 할 수 있었기 때문에 다른 프로그램을 굳이 쓰지 않았는데요.
매스매티카로 미방을 푼다면 코딩이 간단하기 때문에 편하긴 한데 포트란으로 풀었을 때와 비교해 시간이 너무 오래 걸립니다. 반면, 포트란은 금세 계산 결과를 주긴 하지만 종종 프로그램을 짜기가 골치 아플 때가 있고요.
그래서, 말씀해 주신 매트랩이 이 둘을 절충하여 코딩도 편하고 계산 결과가 금방 뽑아주는 프로그램인가 하는 점이 궁금합니다. 만약 그렇다면 어느 정도나??
가령, 제가 요새 풀어야 하는 미방의 경우 A[m,m',n,n'](x)와 같이 변수 x에 의존하는 함수 A가 네 개의 인덱스(m,m',n,n')를 갖고 A[0,0,0,0]은 A[1,0,0,0], A[0,1,0,0], A[0,0,1,0], A[0,0,0,1],... 등 네 정수(m,m''n,n') 모두 0부터 1씩 증가하는 항들과 짝지어 있으며 이들이 증가할수록 A의 크기가 감소하는 경우입니다.
따라서 인덱스가 충분히 클 때(N) A가 0에 충분히 가깝다고 가정하여 truncation, 유한한 수(~N^4)의 ordinary coupled differential equations을 푸는 문제입니다.
이를 매스매티카로 풀 경우 코딩은 상당히 쉽습니다. 그러나, N을 작게 주어도 계산이 너무 오래 걸려 사실상 쓸모가 없습니다. 반면, 포트란으로 하면 계산이 충분히 빠르긴 하지만, 포트란에서 미분방정식을 매트릭스 형태로 짜서 풀지 못하기 때문에(이게 정말 포트란에서 불가능한가요?) A[]를 A[i]꼴로 재정의 해주느라 코딩이 상당히 복잡해집니다. 특별한 경우로서 A[n,n']도 다루게 되고 limiting case가 다양한데 그때마다 코딩에 골치를 썩으니, 시간을 낭비하는 것 같아 큰 문제입니다.
요약하자면, (1) 매트랩이 코딩의 간편함과 고속 계산을 모두 제공하는가 하는 것과 (2) 포트란에서 초기값 문제를 행렬 형태로 풀 수 있는 라이브러리가 있는가 하는 것입니다.
도움 부탁드립니다. 감사합니다.
- fortran
- matlab
- mathematica
지식의 출발은 질문, 모든 지식의 완성은 답변!
각 분야 한인연구자와 현업 전문가분들의 답변을 기다립니다.
각 분야 한인연구자와 현업 전문가분들의 답변을 기다립니다.
답변 3
-
답변
박종원님의 답변
2006-11-30- 0
어떤 프로그램이나 소프트웨어를 사용하는 것이냐는 사용자가 얻고자 하는 답을 오차범위내에서 효과적으로 얻을 수 있는 프로그램이면 가장 좋을 것입니다. 사실 포트란은 형식에 맞추어 하나 하나 논리에 맞추어 코딩을 해야 하므로 번거로운 것은 사실입니다. 굳이 결과를 얻기 위한 것이라면 포트란 보다는 모듈화된 프로그램을 이용하는 것이 좋습니다. 그런데 원리를 이해하고 이를 이용하여 다른 것들에 응용을 하려면 한번은 해 보는 것이 유용하다고 알려드렸습니다. 먼저 4개의 인덱스를 갖고 있고 초기치가 0 에서 1 까지인 연립미분 방정식이라면 서브루틴문으로 반복 루프를 갖고 계산하도록 프로그래밍을 해야 하며 포트란으로 가능합니다. 화학공학에서 나타나는 반응식 관련 연립미분방정식의 경우 간단히 Euler식으로 해결할때도 상미분 euler식을 반복적으로 연립방정식에 응용합니다. 그리고 제가 알기로는 초기값을 행열식으로 주는 라이브러리는 없습니다. 그리고 포트란 대신에 모듈화 소프트웨어로 위의 문제를 적용하기에는 여러번 반복 계산하는 것이 타당할 것 같구요. >얼마전 포트란 프로그래밍에 관한 질문을 올렸다가 유용한 답변을 잘 받았습니다. 이와 관련해서 짧은 질문 드리고 싶습니다. > >답변 중에, 미분 방정식을 풀 때 일일이 코딩하지 않고 matlab과 같은 프로그램을 이용하는 것이 좋다고 말씀해 주셨는데요. >저는 평소에 계산을 위해서 포트란과 매스매티카를 주로 이용해 왔습니다. 두 가지로 필요한 것을 대부분 할 수 있었기 때문에 다른 프로그램을 굳이 쓰지 않았는데요. >매스매티카로 미방을 푼다면 코딩이 간단하기 때문에 편하긴 한데 포트란으로 풀었을 때와 비교해 시간이 너무 오래 걸립니다. 반면, 포트란은 금세 계산 결과를 주긴 하지만 종종 프로그램을 짜기가 골치 아플 때가 있고요. >그래서, 말씀해 주신 매트랩이 이 둘을 절충하여 코딩도 편하고 계산 결과가 금방 뽑아주는 프로그램인가 하는 점이 궁금합니다. 만약 그렇다면 어느 정도나?? > >가령, 제가 요새 풀어야 하는 미방의 경우 A[m,m',n,n'](x)와 같이 변수 x에 의존하는 함수 A가 네 개의 인덱스(m,m',n,n')를 갖고 A[0,0,0,0]은 A[1,0,0,0], A[0,1,0,0], A[0,0,1,0], A[0,0,0,1],... 등 네 정수(m,m''n,n') 모두 0부터 1씩 증가하는 항들과 짝지어 있으며 이들이 증가할수록 A의 크기가 감소하는 경우입니다. >따라서 인덱스가 충분히 클 때(N) A가 0에 충분히 가깝다고 가정하여 truncation, 유한한 수(~N^4)의 ordinary coupled differential equations을 푸는 문제입니다. >이를 매스매티카로 풀 경우 코딩은 상당히 쉽습니다. 그러나, N을 작게 주어도 계산이 너무 오래 걸려 사실상 쓸모가 없습니다. 반면, 포트란으로 하면 계산이 충분히 빠르긴 하지만, 포트란에서 미분방정식을 매트릭스 형태로 짜서 풀지 못하기 때문에(이게 정말 포트란에서 불가능한가요?) A[]를 A[i]꼴로 재정의 해주느라 코딩이 상당히 복잡해집니다. 특별한 경우로서 A[n,n']도 다루게 되고 limiting case가 다양한데 그때마다 코딩에 골치를 썩으니, 시간을 낭비하는 것 같아 큰 문제입니다. > >요약하자면, (1) 매트랩이 코딩의 간편함과 고속 계산을 모두 제공하는가 하는 것과 (2) 포트란에서 초기값 문제를 행렬 형태로 풀 수 있는 라이브러리가 있는가 하는 것입니다. > >도움 부탁드립니다. 감사합니다.> -
답변
이응신님의 답변
2006-11-30- 0
깜빡 하나 잊었습니다. 매트릭스 형태의 연립상미분방정식을 푸는데는 매트랩이 최고입니다. 매트랩의 루틴을 보면 포트란과 같은 고급언어형식으로 인덱스를 이용하여 증가분을 지정하여 초기치부터 계속 증가시키는 루프형식도 있습니다. 물론 C/C++도 같은 반복루프를 이용하나 인덱스를 지정하는 형식이 포트란 보다는 C/C++에 가깝습니다. 메모리 이용때문인듯 합니다. 매트랩의 인터프리터를 설계할 때 처음에는 포트란으로 했다가 90년대에 C/C++로 Mathworks사에서 다시 만들었기 때문에 인덱스 처리가 C/C++형식을 가집니다. 매트랩에서는 루프형식으로 인덱스를 증가시키는 전통적인 형식이 있고, 슈퍼컴에서 병렬처리 형식을 이용하는 벡터연산도 가능합니다. 파이프라이닝 테크닉을 사용하기 때문에 벡터연산을 수행하면 비약적으로 속도가 빨라집니다. 대부분 컴파일러가 캐쉬를 이용하기는 하나 루프문이 하나 실행될 때마다 루프에 속하는 함수를 불러와서 사용하거나, 루프가 증가할 때마다 한번씩 실행하기 때문에 속도가 느려집니다. 즉, 루프의 회수만큼 함수를 불러서 연산을 하고 캐쉬나 주메모리에 저장하고 꺼내 사용하는 형식을 띠고 있기 때문에 함수를 불러내는 시간이 엄청나게 걸려 전체 실행속도를 떨어뜨립니다. 메모리 이용을 하는 방식(즉, 캐쉬에서 주메모리로 쓰는 방식이나 주메모리에서 캐쉬로 읽어들어오는 형식 등) 같은 메모리 사용에서는 속도차가 크게 나지 않습니다. 매트랩에서 사용하는 벡터연산은 캐쉬에다가 벡터형식으로 루프에 해당하는 숫자만큼 메모리를 확보한 다음 루프를 돌려 루틴을 실행하는 것이 아니라 동시에 몇개의 벡터 성분끼리 한꺼번에 연산을 실행하기 때문에 속도가 빠릅니다. 그래서 벡터처리 기능이 있기 때문에 연립미분방정식을 풀 때 매트릭스 형식으로 입력이 들어가도록 코딩을 하면 얼마든 지 풀 수 있습니다. 매트랩에서 입력으로 받아들이는 것은 포트란 77과 같이 루프를 이용하여 인덱스를 증가시켜 연산에 필요한 개별 숫자를 불러들이면서 연산을 하지 않고 전체 연산을 시킬 숫자를 일단 불러들여 메모리에 저장하고 컴퓨터의 클럭수에 맞추어 벡터성분을 연산함수에 따라 동시에 계산을 수행합니다. C/C++에서 객체로 처리하듯이 어떤 객체라도 입력이 가능합니다. 따라서 미분방정식의 입력치를 리스트로 만들어 입력해도 되고 매트릭스 형식으로 입력해도 처리가 가능합니다. 단지 1계연립상미분 방정식의 형태로 입력을 받아들이므로 2계연립상미분방정식을 풀때는 입력을 초기속력에 해당하는 부분과 초기위치에 해당하는 성분을 한 벡터로 만들어 입력을 시켜야 합니다. 따라서 매트랩을 사용하면 현재 매트릭스 형식의 연립미분방정식의 초기치를 입력하고 또 빌트-인 기능을 이용하여 연립미분방정식을 풀 수 있습니다. 수치적으로 불안정하거나 비대각선쪽으로 숫자가 분포되는 ill-condition 처리도 옵션에서 골라서 처리할 수 있습니다. 포트란 90으로 연립미분방정식의 초기치 입력을 벡터나 매트릭스로 하려면 엄청나게 고생합니다. 라이브러리를 잘 찾아보면 이렇게 미분방정식을 푸는 라이브러리가 있을 것입니다. 그러나 고생 많이 합니다...... >얼마전 포트란 프로그래밍에 관한 질문을 올렸다가 유용한 답변을 잘 받았습니다. 이와 관련해서 짧은 질문 드리고 싶습니다. > >답변 중에, 미분 방정식을 풀 때 일일이 코딩하지 않고 matlab과 같은 프로그램을 이용하는 것이 좋다고 말씀해 주셨는데요. >저는 평소에 계산을 위해서 포트란과 매스매티카를 주로 이용해 왔습니다. 두 가지로 필요한 것을 대부분 할 수 있었기 때문에 다른 프로그램을 굳이 쓰지 않았는데요. >매스매티카로 미방을 푼다면 코딩이 간단하기 때문에 편하긴 한데 포트란으로 풀었을 때와 비교해 시간이 너무 오래 걸립니다. 반면, 포트란은 금세 계산 결과를 주긴 하지만 종종 프로그램을 짜기가 골치 아플 때가 있고요. >그래서, 말씀해 주신 매트랩이 이 둘을 절충하여 코딩도 편하고 계산 결과가 금방 뽑아주는 프로그램인가 하는 점이 궁금합니다. 만약 그렇다면 어느 정도나?? > >가령, 제가 요새 풀어야 하는 미방의 경우 A[m,m',n,n'](x)와 같이 변수 x에 의존하는 함수 A가 네 개의 인덱스(m,m',n,n')를 갖고 A[0,0,0,0]은 A[1,0,0,0], A[0,1,0,0], A[0,0,1,0], A[0,0,0,1],... 등 네 정수(m,m''n,n') 모두 0부터 1씩 증가하는 항들과 짝지어 있으며 이들이 증가할수록 A의 크기가 감소하는 경우입니다. >따라서 인덱스가 충분히 클 때(N) A가 0에 충분히 가깝다고 가정하여 truncation, 유한한 수(~N^4)의 ordinary coupled differential equations을 푸는 문제입니다. >이를 매스매티카로 풀 경우 코딩은 상당히 쉽습니다. 그러나, N을 작게 주어도 계산이 너무 오래 걸려 사실상 쓸모가 없습니다. 반면, 포트란으로 하면 계산이 충분히 빠르긴 하지만, 포트란에서 미분방정식을 매트릭스 형태로 짜서 풀지 못하기 때문에(이게 정말 포트란에서 불가능한가요?) A[]를 A[i]꼴로 재정의 해주느라 코딩이 상당히 복잡해집니다. 특별한 경우로서 A[n,n']도 다루게 되고 limiting case가 다양한데 그때마다 코딩에 골치를 썩으니, 시간을 낭비하는 것 같아 큰 문제입니다. > >요약하자면, (1) 매트랩이 코딩의 간편함과 고속 계산을 모두 제공하는가 하는 것과 (2) 포트란에서 초기값 문제를 행렬 형태로 풀 수 있는 라이브러리가 있는가 하는 것입니다. > >도움 부탁드립니다. 감사합니다.> -
답변
이응신님의 답변
2006-11-30- 0
미분방정식을 풀 때 실시간 제어를 할 때가 아니면 꾹참고 기다려도 됩니다. 물론 고속으로 풀이를 얻기 위해서는 슈퍼컴을 사용해야 하나 슈퍼컴에서 병렬처리 알고리듬을 개발하거나, 해당 소프트웨어도 다루기가 만만치 않습니다. 컴퓨터를 목적으로 사용하고 있는 전문적인 프로그래머가 아니면 슈퍼컴에서 고속연산을 하는 코딩을 하기 상당히 힘듭니다. 수학소프트웨어 중 매스매티카나 매플같은 CAS 프로그램들은 미분방정식을 풀 때 기호를 푸는 방식과 수치해석으로 푸는 방식 둘 다 제공합니다. 수치해석으로 미분방정식을 풀 때도 소프트웨어를 제어해서 푸는 방식 (대부분 사용자들이 이런 형식을 이용합니다)과 하드웨어를 직접 제어해서 푸는 방식이 있습니다. 하드웨어를 직접 제어해서 미분방정식을 푸는 방식은 해당 프로그램의 메뉴얼에 나와있으나 요즈음 두 방식의 속도가 별로 차이가 나지 않으므로 메뉴얼에서도 사라졌습니다. 매스매티카는 월프램이 복합시스템을 해석하기 위해 개발했던 프로그램으로 이론물리학에서는 적당해도 수치해석으로 사용하기는 불편한 점이 많습니다. 물론 요즈음은 각종 패키지들이 쏟아져나와 수치해석을 하는데 불편한 점이 줄어들었으나 간단한 미분방정식을 비싼 패키지를 따로 구해서 사용하는 것은 합리적인 해결방식이 아닙니다. 매트랩은 인터프리터 자체가 고속연산(병렬처리)을 위해 개발된 커널을 그대로 사용하고 있습니다. 매트랩에 익숙해지면 같은 문제를 풀 때도 매트랩 설계자의 방식대로 코딩하는 방법과 그냥 수학적인 전개방식으로 코딩하는 방법의 차이가 있습니다. Moler 교수가 원래 슈퍼컴에서 돌던 프로그램을 PC 버전으로 고친 것이 매트랩이므로 설계자의 설계방식에 따라 프로그래밍을 하면 속도가 엄청나게 빠릅니다. 그러나 제 개인적으로 사용해본 결과는 1 GHz 이상의 속도를 내는 PC에는 요즈음 별로 코딩에 따른 속도차가 크게 나지 않으므로 그냥 수학적인 방식대로 코딩해도 됩니다. (예전 메가헤르츠 시대에는 몇 배 차이가 났습니다^^) 미분방정식을 매트랩으로 풀 때는 2계 상미분방정식도 1계 연립상미분방정식으로 바꾸어 코딩을 해야 하므로 약간의 적응이 필요합니다. 그리고 코딩을 할 때도 오일러방식이나 룽에-쿠타 방식 등을 적용할 때 소수점 몇자리까지 정밀도를 높이느냐를 사용자가 선택할 수 있습니다. 디폴트로는 ODE45라고 해서 룽에-쿠타 방식의 다섯자리에서 반올림하는 형식을 사용하고 있습니다. 매트랩 메뉴얼을 보면 미분방정식을 푸는 자세한 과정이 나와있습니다. 물론 메뉴얼만 봐서 잘 모르니깐 시중에 나와있는 참고도서가 유용하겠지요. 매트랩의 강점은 자신만의 함수를 지정해서 매트랩의 빌트-인 함수와 연동시킬 수도 있고 조금 익숙하면 라이브러리를 열어 변수나 형식을 고칠수도 있습니다. 그러나 가장 큰 강점은 포트란과 같은 수치를 처리할때와 같은 형식을 그대로 사용할 수 있으므로 포트란을 사용했던 사람들은 쉽게 적응할 수 있습니다. (메모리 처리형식은 C/C++와 같으나 그다지 복잡하지 않습니다) 또 매트랩은 기호연산을 하고 결과를 수치해석으로 볼 수 있습니다. 기호연산은 매플의 커널을 빌어와서 (아마 로열티를 주고 심은 듯) 매플형식으로 처리하고 매트랩의 형식으로 바꾸어 수치해석을 합니다. 요즈음 공대에서는 이제 더 이상 포트란과 같은 프로그래밍 언어로 씨름을 하지 않습니다(전산과는 예외). 목적이 수치해석인데 왜 프로그래밍 언어를 이해하기 위해 시간을 낭비하느냐는 생각입니다. 그래서 수치해석 시간에도 매트랩이나 매스매티카를 이용하라고 권합니다. 그리고 대부분 매트랩을 이용해서 수치해석과 시뮬레이션을 하므로 공대의 기준 프로그램이라고 할 수 있습니다. >얼마전 포트란 프로그래밍에 관한 질문을 올렸다가 유용한 답변을 잘 받았습니다. 이와 관련해서 짧은 질문 드리고 싶습니다. > >답변 중에, 미분 방정식을 풀 때 일일이 코딩하지 않고 matlab과 같은 프로그램을 이용하는 것이 좋다고 말씀해 주셨는데요. >저는 평소에 계산을 위해서 포트란과 매스매티카를 주로 이용해 왔습니다. 두 가지로 필요한 것을 대부분 할 수 있었기 때문에 다른 프로그램을 굳이 쓰지 않았는데요. >매스매티카로 미방을 푼다면 코딩이 간단하기 때문에 편하긴 한데 포트란으로 풀었을 때와 비교해 시간이 너무 오래 걸립니다. 반면, 포트란은 금세 계산 결과를 주긴 하지만 종종 프로그램을 짜기가 골치 아플 때가 있고요. >그래서, 말씀해 주신 매트랩이 이 둘을 절충하여 코딩도 편하고 계산 결과가 금방 뽑아주는 프로그램인가 하는 점이 궁금합니다. 만약 그렇다면 어느 정도나?? > >가령, 제가 요새 풀어야 하는 미방의 경우 A[m,m',n,n'](x)와 같이 변수 x에 의존하는 함수 A가 네 개의 인덱스(m,m',n,n')를 갖고 A[0,0,0,0]은 A[1,0,0,0], A[0,1,0,0], A[0,0,1,0], A[0,0,0,1],... 등 네 정수(m,m''n,n') 모두 0부터 1씩 증가하는 항들과 짝지어 있으며 이들이 증가할수록 A의 크기가 감소하는 경우입니다. >따라서 인덱스가 충분히 클 때(N) A가 0에 충분히 가깝다고 가정하여 truncation, 유한한 수(~N^4)의 ordinary coupled differential equations을 푸는 문제입니다. >이를 매스매티카로 풀 경우 코딩은 상당히 쉽습니다. 그러나, N을 작게 주어도 계산이 너무 오래 걸려 사실상 쓸모가 없습니다. 반면, 포트란으로 하면 계산이 충분히 빠르긴 하지만, 포트란에서 미분방정식을 매트릭스 형태로 짜서 풀지 못하기 때문에(이게 정말 포트란에서 불가능한가요?) A[]를 A[i]꼴로 재정의 해주느라 코딩이 상당히 복잡해집니다. 특별한 경우로서 A[n,n']도 다루게 되고 limiting case가 다양한데 그때마다 코딩에 골치를 썩으니, 시간을 낭비하는 것 같아 큰 문제입니다. > >요약하자면, (1) 매트랩이 코딩의 간편함과 고속 계산을 모두 제공하는가 하는 것과 (2) 포트란에서 초기값 문제를 행렬 형태로 풀 수 있는 라이브러리가 있는가 하는 것입니다. > >도움 부탁드립니다. 감사합니다.>