운동시뮬레이션 제2주 A First Numerical Problem 컴퓨터시뮬레이션학과 2014년 봄학기 담당교수 : 이형원 E304호, hwlee@inje.ac.kr
Chapter 1 A first numerical problem Radioactive decay A Numerical approach Design and construction of a working program: codes and pseudocodes Testing your program Numerical considerations Programming guidelines and philosophy
Introduction 물리학의 많은 문제는 미분방정식을 포함하고 있다. 일차 미분 방정식의 풀이 물리학의 많은 문제는 미분방정식을 포함하고 있다. 포사체운동, 단진동 운동, 행성운동 일차 미분 방정식의 풀이 미분 방정식을 푸는 기술 습득 프로그램을 작성하는 과정 습득 수치적인 문제를 해결하는 프로그램작성 법 습득
Radioactive Decay 많은 핵은 불안정하다는 것이 알려져 있 다. 핵붕괴는 무작위(無作爲)과정이다. 동위원소 235 𝑈 (143중성자, 92양성자)는 확률이 작기는 하지만 두 개의 대충 반 크기의 핵과 양성자, 중성자, 전자, 알파입자로 붕괴한다. 핵붕괴는 무작위(無作爲)과정이다. 한 우라늄핵이 정확히 언제 붕괴할지 모른다. 붕괴할 확률을 줄 수 있다. 붕괴하는 데 걸리는 평균 시간을 줄 수 있다. 우라늄의 경우 수명이 1.0× 10 9 년이다.
Radioactive Decay 수많은 핵자가 모여있는 것을 가정하 면 핵자의 수는 다음 미분 방정식을 만족 한다. 𝑑 𝑁 𝑈 𝑑𝑡 =− 𝑁 𝑈 𝜏 식(1.1) 직접 대입을 통하여 다음이 해인 것을 알 수 있다. 𝑁 𝑈 = 𝑁 𝑈 (0) 𝑒 −𝑡/𝜏 식(1.2), 𝜏는 평균 수명
Numerical Approach 위 미분 방정식은 해석적으로 해를 구 할 수 있음. 수치적으로 해를 구하는 방법을 적용 할 것임. 풀이의 목적은 𝑁 𝑈 를 임의시간에서의 값을 구하는 것임. 특별한 시간(보통은 0)에서 주어진 값을 안 후 이후의 시간에서의 값을 구함. 이렇게 해를 구하는 것을 초기값문제(initial value problem) 이라고 함.
Numerical Approach 해석적인 방법은 부록 A에 있음. 수치적인 해를 위하여 테일러(Taylor) 전 개를 사용함. 𝑁 𝑈 ∆𝑡 = 𝑁 𝑈 0 + 𝑑 𝑁 𝑈 𝑑𝑡 ∆𝑡+ 1 2 𝑑 2 𝑁 𝑈 𝑑 𝑡 2 ∆𝑡 2 +⋯식(1.3) 위 식은 ∆𝑡에서의 핵자의 수는 0에서의 핵자의 수와 핵자 수의 미분을 알면 구 할 수 있음을 보여준다.
Numerical Approach ∆𝑡가 매우 작은 경우 2차항 이상을 무 시할 수 있다. 𝑁 𝑈 ∆𝑡 ≈ 𝑁 𝑈 0 + 𝑑 𝑁 𝑈 𝑑𝑡 ∆𝑡 식(1.4) 위 결과는 미분의 정의 𝑑 𝑁 𝑈 𝑑𝑡 ≡ lim ∆𝑡→0 𝑁 𝑈 𝑡+∆𝑡 − 𝑁 𝑈 (𝑡) ∆𝑡 ≈ 𝑁 𝑈 𝑡+∆𝑡 − 𝑁 𝑈 (𝑡) ∆𝑡 식(1.5) 식을 정리하면 𝑁 𝑈 𝑡+∆𝑡 ≈ 𝑁 𝑈 𝑡 + 𝑑 𝑁 𝑈 𝑑𝑡 ∆𝑡 식(1.6)
Numerical Approach 오차는 ∆𝑡 2 임 대부분의 경우 ∆𝑡를 줄이면 오차는 무시할 수 있다 오차는 ∆𝑡 2 임 대부분의 경우 ∆𝑡를 줄이면 오차는 무시할 수 있다 어떤 경우에는 무시한 오차가 문제를 일으 키는 경우가 있다 수치적인 문제를 다룰 때 항상 오차분석에 주의해야 한다. 오차에 대한 자세한 내용은 부록 A에 있음.
Numerical Approach 핵붕괴 미분방정식에 적용하면 𝑁 𝑈 𝑡+∆𝑡 ≈ 𝑁 𝑈 𝑡 − 𝑁 𝑈 𝜏 ∆𝑡 식(1.7) 𝑁 𝑈 𝑡+∆𝑡 ≈ 𝑁 𝑈 𝑡 − 𝑁 𝑈 𝜏 ∆𝑡 식(1.7) 해를 수치적으로 구하는 과정은 𝑡=0에서의 초기조건을 준다. 𝑡=∆𝑡에서의 값을 위 식으로 계산한다. 𝑡=2∆𝑡에서의 값을 같은 식을 사용하되 모 든 값에 𝑡=∆𝑡에서의 값을 적용하여 구한 다. 원하는 시간까지 위 계산을 반복한다.
Numerical Approach 위 과정으로 구한 해는 정확한 해가 아 니고 근사해라는 것을 항상명심해야 한다. 위 과정으로 구한 해는 정확한 해가 아 니고 근사해라는 것을 항상명심해야 한다. 수치적인 해를 구하는 것에 있어서의 또 다른 목적은 수치적으로 구한 근사 해와 정확한 해 사이의 차이를 무시할 수 있도록 하는 방법을 찾는 것이다. 이 방법은 문제에 따라 달라진다.
Numerical Approach 식(1.6)과 식(1.7)을 통하여 해를 구하는 방법을 오일러(Euler) 방법이라고 한다. 이방법과 이와 유사한 방법을 계속하 여 사용할 것이다. 수치 해를 구하는 다른 방법에 대해서 는 부록 A에서 자세히 다룬다. 수치 해를 구하는 방법은 풀려는 문제 에 따라 유리할 수도 있고 불리할 수도 있다.
Design and construction of a working program: codes and pseudocodes 앞 절에서 유도한 오일러방법을 프로 그램화하는 방법을 배운다. 여러 가지 프로그램언어로 작성할 수 있지만 슈도코드(pseudocode)라는 언 어를 이용하여 일반적인 방법으로 프 로그램을 기술할 수 있다. 슈도코드로된 프로그램은 다른 언어로 바로 변환될 수 있다. 슈도코드는 프로그램의 중요한 부분을 일반언어로 표현한다.
Design and construction of a working program: codes and pseudocodes 프로그램은 모두 슈도코드롤 기술할 것이다. 이 장에서만 Java로 기술해 준다. 프로그램하는 것은 글쓰기와 같이 개 인에 따라 매우 다를 수 있다. 프로그램할 때는 일반적으로 따라야 하는 룰이 있다. 결국에는 내가 작성한 프로그램을 다 른 사람 또는 내가 이해할 수 있어야 한 다.
Design and construction of a working program: codes and pseudocodes 제안하는 올바른 프로그램 방법은 다음과 같다. 제일 먼저 해야 할 일은 프로그램 하기 전에 생각부터 해야 한다. 문제를 어떻게 풀 것인가에 대한 개요 어떤 변수나 매개변수가 필요한지 결정 프로그램의 기본 구조 필요한 변수 선언 변수와 매개변수 초기화 계산 결과 저장
Design and construction of a working program: codes and pseudocodes 핵 붕괴 프로그램의 슈도 코드 프로그램을 설명하는 주석 필요한 변수와 배열 선언 변수를 초기화(Initialize) 실제 값을 계산(Calculate) 결과를 저장(Store)
Java Program
프로그램 설명 1번 줄 : 패키지명 3번~8번 줄 : 프로그램에 필요한 라이브 러리 포함 10번 ~ 59번 줄 : 응용프로그램 클래스 Decay 선언 12번~14번 : 필요한 변수 선언 배정도 실수형 변수 배열 두 개(Nu, t) 배정도 실수형 변수 세 개(tau, dt, time) 정수형 변수 한 개(n)
프로그램 설명 18번~24번 : main 함수 정의 20번 줄 : 클래스 인스턴스 생성 21번 줄 : 초기화 함수 호출 22번 줄 : 계산한 수 호출 23번 줄 : 결과 저장함수 호출 25번 ~ 45번 줄 : 필요한 함수 정의
Initialiaze 함수 슈도 코드 필요한 배열 생성 입력 스트림 생성 필요한 변수 입력하여 저장 배열의 크기 계산
Initialize 함수
Initialize 함수 설명 26번 ~ 27번 줄 : 최대 크기로 배열 생성 28번 줄 : 입력 스트림 생성 29번 줄 : 입력을 위한 메시지 출력 30번 줄 : 숫자를 입력하여 변수에 저장 31번 ~ 36번 줄 : 29,30을 해당하는 변수 에 대해서 반복 수행 37번 줄 : 배열의 크기를 설정(배열의 크기를 100과 실제 간격의 수 중에 작 은 것으로 결정한다)
Calculate 함수 슈도 코드 각 시간 간격 스텝 i(i=0 부터 시작)에 대하여 스텝 i+1에서의 핵자의 수를 계 산한다: 𝑁 𝑈 𝑡 𝑖+1 = 𝑁 𝑈 𝑡 𝑖 − 𝑁 𝑈 ( 𝑡 𝑖 )/𝜏 𝑑𝑡 (식(1.7) 사용) 𝑡 𝑖+1 = 𝑡 𝑖 +∆𝑡 𝑛−1 시간 스텝에 대하여 반복
Calculate 함수
Calculate 함수 설명 40번 ~ 43번 줄 : 원하는 시간 스텝만큼 반복하여 계산하는 for 루프 41번 줄 : 다음 스텝의 핵자 수 계산 42번 줄 : 다음 스텝의 시간 계산
Store 함수 슈도 코드 출력 스트림 생성 각 시간 간격 스텝 i(i=0 부터 시작)에 대하여 스텝 i+1에서의 시간과 핵자의 수를 저장한다: 𝑁 𝑈 𝑡 𝑖 , 𝑡 𝑖 를 저장한다. 𝑛−1 시간 스텝에 대하여 반복
Store 함수
Store 함수 설명 46번 줄 : 출력 스트림 변수 선언 47번 ~ 52번 줄 : 출력 스트림 생성 및 오류 처리 47번 ~ 52번 줄 : 출력 스트림 생성 및 오류 처리 51번 줄 : 오류가 난 경우 오류 메시지 출력 53번 ~ 56 번 줄 : 원하는 시간 스텝만큼 반복하여 출력하는 for 루프 54번 줄 : 출력 자료 형식 생성 55번 줄 : 문장을 파일에 저장
클래스 코드 전체 원본 파 일은 홈 페이지에 있음
결과 확인 결과를 이해하는 것이 무엇 보다 중요 하다. 다양한 그래프 프로그램 활용 시간에 따른 핵자의 수를 계산 계산 결과는 숫자로 파일에 저장된다. 그래프를 이용하여 확인 조건에 따라서 매우 많은 자료가 출력된다. 다양한 그래프 프로그램 활용 그래프를 그려 보는 것이 매우 중요하다. gnuplot 사용 (직접 작성할 필요 없다.)
결과 그래프
Testing Your Program 앞 절에서 동작하는 프로그램을 만든 다고 했지만 바른 결과를 준다고 보장 할 수는 없다. 단지 프로그램상의 오류가 없는 것이다. 올바른 결과를 준다는 것을 확신할 때 까지는 동작하는 것이라고 말할 수 없 다. 프로그램이 실행이 된 후에는 정상 동 작하는 지를 확인 하는 일은 쉬운 일이 아니다.
General guideline for test 1 결과가 그럴 듯 한가? 어떤 수치 계산을 하더라도 미리 결과가 대 강 어떨 것이다 하는 것은 알고 있어야 한 다. 결과가 직관과 직감에 맞는지 확인해야 한 다. 이 과정을 통하여 문제에 대한 이해를 높일 수 있다. 남에게 결과를 설명할 때 상대방이 확신을 가질 수 있도록 할 수 있어야 한다.
General guideline for test 2 결과가 아는 정확한 결과와 일치하는 가? 핵붕괴 문제는 해석적인 정확한 해를 알고 있기 때문에 결과를 비교할 수 있다. 일반적으로는 특별한 경우에만 정확한 해 를 알 수 있는 경우가 대부분이다. 해를 아는 특별한 경우에 대하여 반드시 결 과를 얻어서 정확한 것과 비교하는 것이 프 로그램이 동작한다는 것을 보여주는 필요 조건(충분조건은 아님)이다.
General guideline for test 3 항상 크기가 다른 스텝으로 계산한 결 과가 일치한다는 것을 점검해야 한다. 핵붕괴 프로그램은 시간간격 dt 가 있다. 다른 프로그램도 유사하게 스텝 또는 그리 드 크기가 있다. 올바른 프로그램은 스텝크기와 독립적으 로 같은 결과를 주어야 한다.
Testing your program 프로그램을 제대로 동작하는지를 점검 하는 것은 마지막 단계의 단순한 작업 이 아니다. 프로그램을 점검(수정)하는데 걸리는 시간이나 프로그램을 작성하는데 걸리 는 시간이 거의 같을 수 있다. 본인이 맞다고 믿지 못하는 프로그램 의 결과는 믿을 수 없다.
Numerical considerations 수치계산에서 오차를 따지는 것은 중 요한 문제이다. 오차에 관한 문제는 다음에 대한 답을 찾는 것이다. 어떤 문제에 대하여 가장 적합한 알고리즘 을 어떻게 구성하는가? 알고리즘이 주는 수치오차는 어떻게 계산 하는가?
Numerical considerations 본 과목에서는 수치적인 오차에 대한 문제를 조금만 다룰 것이다. 수치 오차 문제가 중요하지 않다는 것 이 아니라 물리문제에 더 집중하기 위 한 것이다. 수치 오차문제 알고리즘 구성문제는 특히 물리문제와 연관이 있을 때 섞어 서 같이 설명할 것이다.
Numerical considerations 핵붕괴 프로그램에서 오차는 미분방정 식을 식(1.7)로 근사 하는 데서 발생한 다. 추가로 프로그램언어의 실수표현의 한 계에 의하여 발생한다. 이 것을 반올림 (round-off) 또는 절단(truncation) 오차 라고 하면, 모든 컴퓨터에 존재한다. 이를 줄이기 위하여 실수(實數)로 double precision 을 사용할 것을 권장한 다.
Numerical considerations 어떤 문제는 반올림오차나 절단오차에 매우 민감하다. 이를 완전히 해결하는 확실한 방법은 없다. 몇 가지 이러한 문제를 안고 있는 것에 대하여 앞으로 논의할 것이다.
Discretization(이산화) 핵붕괴 문제를 풀기 위하여 우리는 시 간은 일정한 간격으로 나누었다. (discretization) 즉 연속 미분 방정식을 식(1.7)과 같이 이산 차분 방정정식으로 바꾸었다. 이를 통하여 연속의 시간에서 핵자의 수를 구하는 것이 아니고 이산시간 점 들(𝑛∆𝑡)에서만 핵자의 수를 구한다. 이러한 시간 또는 공간의 이산화는 일 반적인 방법이다.
Discretization(이산화) 이렇게 이산화 때문에 발생하는 오차 를 무시할 수 있는지를 어떻게 알 수 있 는가? 어떻게 이산화 한 변수의 스텝크기를 정할 수 있는가? 위 질문에 대한 정답은 없으며 단지 답 을 구한 방향(guideline)을 제시할 수 있 다.
Guideline for discretization 1 같은 계산을 여러 스텝크기로 해보아 야 한다. 다음 페이지의 그림은 핵붕괴 프로그램을 평균수명은 1초, 스텝크기를 0.5, 0.2, 0.05초 로 해서 각각 계산한 결과이다. 스텝크기가 작아짐에 따라 결과가 정확한 값에 빠르게 수렴함을 알 수 있다. 식 (1.6)에서 무시한 오차가 ∆𝑡 2 이므로 예 산된 결과이다. 즉 ∆𝑡를 줄이면 결과가 좋 아진다.
Guideline for discretization 1 시간이 𝑡만 큼 지난 점에서의 오차는 ∆𝑡스 텝크기로 𝑡/∆𝑡 스텝만큼 갔으므로 오차의 크기는 ~ 𝑡/∆𝑡 × ∆𝑡 2 ~∆𝑡 정도 이다. 이 오차를 전역오차(global error)라고 한다. 따라서 오일러(Euler) 방법으로 계산한 결 과와 정확한 값 사이의 오차는 ∆𝑡를 반으로 줄이면 오차가 반으로 줄어들게 될 것이다.
Guideline for discretization 1 ∆𝑡=0.5𝑠 ∆𝑡=0.2𝑠 ∆𝑡=0.05𝑠 Solidline exact result
Guideline for discretization 1 핵붕괴 문제는 정확한 해가 있어서 정 확도를 계산하는 것이 쉽다. 정확한 해를 모를 경우에는 어떻게 하 는가? 스텝크기를 줄였을 때 모든 점에서 한 값으 로 수렴하는지를 판단해야 한다. 스텝크기는 문제의 특성시간보다 작게 잡 아야 한다. 핵붕괴인 경우에는 평균수명 특성 시간의 수 퍼센트가 적당하다.
Guideline for discretization 1 좋은 수치 알고리즘도 어떤 특정한 경 우에는 매우 불안정한 경우가 있음. 오일러 방법은 핵붕괴에 대해서는 잘 동작하지만 3장에서 배우는 진동문제 에서는 답을 주지 못한다. 모든 문제에 다 잘 동작하는 수치 알고 리즘은 없으며, 풀고자 하는 문제에 대 한 이해와 여러분의 천재성을 발휘하 여 알고리즘을 잘 선택해야 한다.
Programming guidelines and philosophy 프로그램을 작성하는 것은 개인별로 모두 다르다. 그러나 앞에서도 언급했지만 프로그램 을 작성하는 일반적인 방향(guideline) 있다. 제시하는 방향은 결국 프로그램을 가 능한 잘 이해할 수 있도록 하는 것이다.
Programming guideline 1 프로그램 구조 중요한 일을 하는 함수를 사용하여 프로그 램을 이해하기 쉽고 읽을 수 있도록 구성하 라. 핵붕괴 프로그램의 main 함수는 실제로 프 로그램 전체의 구성을 보여 준다. 항상 이 런 형식을 유지하라. 몇 줄 이상의 코드는 함수로 만들어라. 반복되는 코드를 함수로 만들어라.
Programming guideline 2 이해 가능한 변수명을 사용하라 주어진 문제와 연관된 변수명을 선택하라. 이해 가능한 변수명은 프로그램을 이해하 기 쉽게 하고 변수명 자체가 주석역할을 한 다.
Programming guideline 3 주석을 사용하라 프로그램을 설명하는 주석을 작성하라 변수를 설명하는 주석을 사용하라
Programming guideline 4 분명하게 하기 위하여 (거의)모든 것을 희생하라 가장 중요한 부분은 간결하게 작성하면 프 로그램이 빨리 수행된다는 것은 잘못된 것 이다. 가끔 간결한 코드가 빨리 수행되기도 하지 만 이것이 프로그램의 효율을 보장하지는 않는다. 코드를 간결하고 간단하게 작성하면 읽기 가 어렵고 모호해진다.
Programming guideline 4 분명하게 하기 위하여 코드를 몇 줄 더 사용하 는 것이 좋다. 코드는 연관된 물리방정식과 유사하게 보이게 하는 것이 좋다. 후에 코드를 점검하는 시간을 줄여 준다. 시간이 오래 걸리는 프로그램인 경우(수분 또 는 수일)는 실행속도가 문제가 되지만 실행시 간을 줄이는 것은 알고리즘 수정으로 얻어지 며 코드의 이곳 저곳을 수정해서 얻어지는 것 이 아니다. 프로그램 효율을 높이는 것보다 정확하게 동 작하는 것이 우선이다.
Programming guideline 5 그래프로 정확하게 표현하는 것에 시 간을 투자하라 어떤 값을 어떻게 그래프로 그릴 것인가를 잘 생각해야 한다. 좌표축의 이름을 정확하게 표현해야 한다. 매개변수들의 값은 그래프에 직접 보이게 한다.