Numerical Methods for Material Scientists

Slides:



Advertisements
Similar presentations
10-7 부동소수점 (Floating-Point) 계산  컴퓨터에서 숫자를 표기하는 방법  가수 (Fraction) : 부호화된 고정소수점 숫자 지수 (Exponent) : 소수점의 위치를 표시 ( 예 )10 진수 를 표기하면 Fraction Exponent.
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
1.3.1 원의 방정식. 생각해봅시다. SK 텔레콤에서는 중화동에 기지국을 세우려고 한다. 이 기지국은 중화고, 중화우체국, 뚝방에 모두 전파를 보내야 한다. 기지국은 어디에 세워야 할까 ? 중화동의 지도는 다음과 같다 원의 방정식.
주요 내용 행렬 스칼라, 벡터, 행렬 행렬의 합과 곱 여러가지 행렬들 전치 행렬 정방 행렬 역가능 행렬 역 행렬 행렬식.
4장 배열과 함수 한빛미디어(주).
재료수치해석 HW # 박재혁.
선형 연립 방정식 풀기와 역행렬 구하기 신소재 김경옥.
Gauss Elimination with scaled partial pivoting
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
제2장 배열과구조.
제 3장. 연립 방정식의 해법 행렬과 방정식의 행렬 표현 소거법 행렬식과 역 행렬 노름과 조건수 반복법
#include <stdio.h> int main(void) { float radius; // 원의 반지름
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
Lecture 5 C의 기초적인 값(primitive value)의 컴퓨터에서의 표현 문자, 정수, 실수, 참/거짓
Ch. 1 선형대수학: 행렬, 벡터, 행렬식, 선형연립방정식
역행렬 구하는 프로그램 C와 Fortran 환경공학과 천대 길.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Error Detection and Correction
CAS (Computer Algebra System) 소개
2007 1학기 11 프로젝트 기초 실습.
Tail-recursive Function, High-order Function
영상공학수학 Mathematical methods in computer graphics and vision
행렬 기본 개념 행렬의 연산 여러가지 행렬 행렬식 역행렬 연립 일차 방정식 부울행렬.
근사값과 반올림 오차 절단 오차와 Taylor 급수 오차의 전파
11장. 1차원 배열.
일차방정식의 풀이 일차방정식의 풀이 순서 ① 괄호가 있으면 괄호를 먼저 푼다.
제4장 제어 시스템의 성능.
Ⅲ. 이 차 방 정 식 1. 이차방정식과 그 풀이 2. 근 의 공 식.
프로그래밍 개요
어서와 C언어는 처음이지 제14장.
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
에어 조건문.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
제 3 강.
행렬의 개요 행렬은 수를 원소로 지니는 다차원 배열이다. mn (“m by n”) 행렬은 m개의 행과 n개의 열을 갖는다.
행렬의 개요 행렬은 수를 원소로 지니는 다차원 배열이다. mn (“m by n”) 행렬은 m개의 행과 n개의 열을 갖는다.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
Biomedical Instrumentation
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
1. 2진 시스템.
Fitting / Matrix / Excel
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
계산기.
CAS (Computer Algebra System) 소개
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
미분방정식.
제3장 함수와 배열수식 전진환
디버깅 관련 옵션 실습해보기 발표 : 2008년 5월 19일 2분반 정 훈 승
에어 PHP 입문.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Chapter 1 단위, 물리량, 벡터.
제 5장 제어 시스템의 성능 피드백 제어 시스템 과도 성능 (Transient Performance)
DA :: 퀵 정렬 Quick Sort 퀵 정렬은 비교방식의 정렬 중 가장 빠른 정렬방법이다.
3. 반/전 가산기, 반/전 감산기 제작 컴퓨터 구조 실습 안내서.
상관계수.
실습 UBLAB.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
수학 3학년 1학기 2. 덧셈과 뺄셈 재미있는 놀이 수업 계획 수업 활동.
수치해석 ch3 환경공학과 김지숙.
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
컴퓨터는 어떻게 덧셈, 뺄셈을 할까? 2011년 10월 5일 정동욱.
5. 1 두 수를 입력받아 큰 수를 구하는 순서도를 작성하시오
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

Numerical Methods for Material Scientists 20080930 3rd presentation by Lee, jisan

Assignment n x n linear system Gauss-Jordan Elimination: Using Augmented Matrix

Pivoting Pivoting: Pivot 이 0이면 Gauss elimination 이 불가능하고, Computer가 처리하는 수의 체계는 정밀도에 한계가 있기 때문에 0에 가까운 경우에는 반올림오차가 발생할 수 있다. 따라서 각 행간의 순서를 바꾸는 것을 Pivoting이라고 한다. Partial Pivoting: Pivot 요소 아래 열에서 가장 큰 계수를 찾은 후, 그 항이 Pivot 이 되도록 행의 위치를 교환하는 방법. Scaled Partial Pivoting: 단순히 각 행의 첫 계수만을 비교하는 것이 아니라 행을 Normarlizing 한 후 Partial pivoting 을 하는 방법.

C++로 n x n matrix 받기 # include<stdlib.h> Void main() { int r, i; double **a; //2d 배열 double *x; //1d 배열 scanf(“%d”, &r); a = (double **)malloc(r * sizeof(double)); x=(double*)malloc(r*sizeof(double)); for(i = 0 ; i < r ; i++) a[i] = (double *)malloc((r+1)*sizeof(double)); } -> … Value 입력받으면 됩니다.

1. Scaled Partial Pivoting 각 행의 계수 중 가장 큰 값으로 normalization 한 값을 비교하여 pivoting 한다. //scale factor 구하기: for (i=0; i<r; i++) { s[i] = abs(a[i][0]); for (j=1; j<r; j++) { if (abs(a[i][j])>s[i]) s[i] = abs(a[i][j]); }

1. Scaled Partial Pivoting 각 행의 계수 중 가장 큰 값으로 normalization 한 값을 비교하여 pivoting 한다. void scaled_pivot(double **a, double *s, int r, int n) { double dum=0; int i, maxi=n; for (i=n; i<r; i++) if (abs(a[i][n]/s[i])>dum) { dum = abs(a[i][n]/s[i]); maxi = i; } if (maxi!=n) for (i=n; i<(r+1); i++) { dum = a[maxi][i]; a[maxi][i] = a[n][i]; a[n][i] = dum; dum = s[maxi]; s[maxi] = s[n]; s[n] = dum; 각 행을 Normalizing 한 후 가장 큰 수를 저장. 만약 현재 Pivot 이 가장 큰 수가 아니면 아래 행과 교체 한다.

2. Gauss Elimination 위 행에 적당한 factor 를 곱하여 제일 첫 열을 소거시키면서 upper triangular matrix형태로 만든다. void elimination(double **a, int r, int n, int *err) { double factor1; int i, j; *err = -1; for (i=n+1; i<r; i++) { factor1 = a[i][n]/a[n][n]; for (j=n; j<=r; j++) { a[i][j] = a[i][j] - (factor1 * a[n][j]); } for (i=n+1; i<r; i++) if (a[i][n+1]!=0) *err = 0; Factor 계산하고 아래 행에 pivot항을 곱한 값을 뺀다. Pivot 이 0이 되면 error 출력 (err= -1 로 두고, 여기서 0으로 다시 바뀌지 않으면 error)

Result : Pivoting + Gauss Elimination Ex) a 4x4 System

3. Back Substitution Gauss Elimination 한 결과를 바탕으로 최종 해를 구한다. void substitution (double **a, int r, double *x) { int i, j; double sum=0; for (i=(r-1); i>=0; i--) { sum = 0; for (j=i+1; j<r; j++) { sum = sum + a[i][j]*x[j]; } x[i] = (a[i][r] - sum) / a[i][i];

4. Inverse Matrix A와 Identity의 Augmented Matrix에서 Back subsitution 까지는 같은 방법으로 하고, 그 후 A가 Identity가 될 때까지 역으로 elimination -> Inverse Mtx. 즉, A를 I로 바꾼 Operation B가 A의 Inverse가 된다. void inversion (double **a, double **b, int r) { int i, j, k; double dum1, dum2; for (i=0; i<r; i++) { dum1 = a[i][i]; for (j=0; j<r; j++) a[i][j] = a[i][j] / dum1; b[i][j] = b[i][j] / dum1; } for (i=r-1; i>0; i--) for (j=i-1; j>=0; j--) { dum2 = a[j][i]; for (k=r-1; k>=0; k--) { b[j][k] = b[j][k] - dum2*b[i][k]; a[j][k] = a[j][k] - dum2*a[i][k]; Matrix A의 Pivot 을 1로 맞춰준다. 다시 아래로부터 elimination

Result : Back Substitution & Inverse Matrix

5. Analysis: Pivoting to reduce error. Computer는 한정된 유효수자만 취급하기 때문에 항상 반올림오차가 발생할 수 있다. 대략 100개 이상의 방정식을 다루거나, 또는 계수 크기 자체가 반올림 오차에 영향을 끼친다. 다음과 같은 두 개의 간단한 Linear System 을 생각해 보자. 0.000000000000003X1 + 3X2 = 2.000000000000001 X1 + X2 = 1 Real solution: X1 =1/3, X2 =2/3 2X1 + 100000000000000000X2 = 100000000000000000 X1 + X2 = 2 Real solution: X1 =1.00000000000000002, X2 =0.99999999999999998

5. Analysis: Pivoting to reduce error. 0.000000000000003X1 + 3X2 = 2.000000000000001 X1 + X2 = 1 Real solution: X1 =1/3, X2 =2/3

5. Analysis: Pivoting to reduce error. 0.000000000000003X1 + 3X2 = 2.000000000000001 ……1) X1 + X2 = 1 ……2) 왜 이렇게 큰 오차가??? 식에 1/0,000000000000003곱하고 두번째 식으로부터 X1을 소거하면, -999999999999999 X2 = -666666666666666 X2 =2/3 이 결과를 1)식에 대입하여 X1을 구하면, X1 = ( 2.000000000000001 - 3(2/3) ) / 0.000000000000003 여기서 이 값은 뺄셈의 무효화로 인해 유효숫자의 개수에 매우 민감하다. 만약 Pivoting 을 수행한다면, X2 = 2/3 은 그대로고 이를 1)에 대입시키면 X1 = (1 – 2/3) / 1 을 얻을 수 있다. 이 때 위 결과보다 훨씬 정확한 해를 얻을 수 있다.

5. Analysis: Pivoting to reduce error. 2X1 + 100000000000000000X2 = 100000000000000000 X1 + X2 = 2 Real solution: X1 =1.00000000000000002, X2 =0.99999999999999998

5. Analysis: Pivoting to reduce error. 2X1 + 100000000000000000X2 = 100000000000000000 ……1) X1 + X2 = 2 ……2) 왜 이렇게 큰 오차가??? Partial Pivoting 만 한 경우, -49999999999999999 X2 = -49999999999999998 X2 =1 이 결과를 1)식에 대입하여 X1을 구하면, X1 = ( 100000000000000000 - 100000000000000000) / 2 X1 = 0 이런 오차가 나오는 이유는 order가 매우 큰 수 간의 연산에서 1은 무시되기 때문이다. 2) Scaled Partial Pivoting한 경우, X2 =1 를 식 2)에 대입하면, X1 = 2-X2 = 1 역시 위 결과보다 훨씬 정확한 해를 얻을 수 있다.

6. Summary C++을 이용하여 n x n Linear System 을 Gauss-Jordan Elimination 방법을 이용하여 해를 구하고 역행렬을 구하였다. 이 방법에서 최대한 오차를 줄이기 위해 Scaled partial Pivoting 을 수행하였다. Double Precision 에서도 severe한 오차가 날 수 있는 두 가지 간단한 Linear System 을 통해 Pivoting 을 하지 않았을 때의 해와 Partial Pivoting을 하였을 때, 그리고 Scaled Partial Pivoting 을 하였을 때의 해를 비교하였다. Pivoting 이 적절하지 않을 때 오차가 커지는 이유는, 비슷한 수 끼리의 뺄셈이나, order차이가 매우 큰 수 간의 덧셈, 뺄셈을 컴퓨터가 구분하지 못하기 때문이다. 결국 Computer 의 유효 숫자 처리에도 한계가 있기 때문에 Scaled Partial Pivoting 을 실행하여 반올림 오차를 줄여야 한다.