학교수업, CS/수치해석 12

편미분 방정식(PDE, 라플라스, 포아송)

편미분 방정식은 상미분 방정식에서처럼 차수나 선형성에 대한 분류도 똑같이 적용될 수 있다. 하지만 ODE와는 달리 PDE는 다음 세 가지로 크게 분류함에 따라 해법도 달라지고 있다. 타원형, 쌍곡선형, 포물선형으로 분류한다. PDE에서 차분 방정식의 표현 어떤 종류의 PDE든지 미분향을 차분 방정식의 표현으로 고쳐서 생각할 수 있다. 주어진 영역을 사각형의 격자 모양으로 나누어서 차분 방정식들을 도출한 후, 연립 방정식의 해법으로 그 해를 구한다. #include #include #include void LAP_matrix(int out_mat[][21],int n, int m, int method) { int nl1, np1, msize, msln, i; nl1 = n - 1; np1 = n + 1; ..

상미분 방정식(오일러 방정식, 룬게쿤타방법, 투사법, 유한차분법)

상미분을 분류하는 기준 2차 혹은 고차 선형 혹은 비선형 초기 조건 혹은 경계 조건 첫째 기준인 1차 혹은 고차는 단순히 방정식 중 미분향의 최고차항의 차수가 1차인지 그 이상인지에 따라 나눈 기준으로 보통 그 차수의 개수만큼의 조건식이 주어진다 선형 혹은 비현형의 분류는 방정식 중 미분향의 계수를 보고 따지는 것인데 그 계수가 y에 관한 함수이면 비선형으로 보고 상수나 혹은 x에 관한 함수며 선형으로 볼 수 있다. 선형 비선형 모두 식을 푸는 알고리즘 면에서는 큰 차이가 없으나 계산량과 복잡도 면에서 비선형 미방을 푸는 것이 더 복잡하다 초기 조건과 경계 조건의 분류인데 고차 미방에서의 값이 각각주어지면 초기 조건의 문제라고 불 수 있다. 일반적으로 경계조건의 문제가 더 복잡하며 또 초기 조건의 문제를..

수치미분(테일러시리즈, 리차드슨, 직사각형 수치미분, 사다리꼴 적분, 심프슨의 수치적분)

테일러 시리즈를 이용한 수치미분 차분 근사법: i+1번째 항에서 i번째 항을 빼어 미분값을 계산하는 방법 뒤에서 빼는 차분 근사법: i번째 미분값을 계산하는데 i번째 항에서 i-1번째 항을 빼어서 사용하는 방법 중간 차분 근사법: i번째 차분법을 계산하는데 i-1번째 항에서 i-1번째 항을 빼서 계산하는 방법 이러한 3가지 방법의 성능을 배교해 본다면 같은 계산량에 대해서 앞의 두 가지 방법이 h에 비례하는 오차를 갖지만 마지막 방법은 hxh에 비례하는 오차를 가진다. 따라서 중간 차분 근사법이 정확도 면에서 가장 우수하다 중간 차분 근사식을 이용하여 함수의 미분 계수를 추정하는 프로그램 #include #include #include float eval_f(float x) { float y; y = x..

푸리에 변환(DFT, FFT, 파워스펙트럼 추정, 자기상관도)

고전적인 수치 해석학에서는 푸리에 변환이나 파워스펙트럼 분석과 같은 이산 수학이 포함되지 않는다. 하지만 수치 해석과 더불어 컴퓨터의 발달과 함께 발달한 분야이고 거의 모든 공학과 자연 과학에서 사용되고 있는 분야이다. 아날로그 양을 샘플링하여 이산 데이터로 만드는 과정과 신호를 모델링하여 원하는 형태로 바꾸는 과정도 푸리에 변환이다. DFT DFT는 보통의 아날로그 푸리에 변환이 갖는 성질을 거의 모두 그대로 가진다. x [n]이 실수뿐 아니라 복소수 신호에 대해서도 DFT관계는 그대로 성립한다. 그러나 실제의 경우에 있어서 x [n]은 실수부만 값을 갖는 경우가 많은데 이러한 경우 DFT는 대칭성이 성립하여 계산을 간단히 할 수 있는 경우가 많다. FFT FFT는 DFT를 계산하는데 있어서 결과는 같..

난수(변환법, 거부법, 가우시안 분포, 몬테카를로 적분)

난수 발생 알고리즘 적당한 크기의 배열을 잡아서 그 안의 내용을 균일한 편차를 갖는 난수로 채운다. srand()로 초기화하고 rand()로 난수를 발생시킨다 난수 발생을 요구할 때마다 배열의 인덱스를 난수로 발생시키고 그 내부값을 리턴하기 전에 한번 사용한 값은 버리고 rand()를 이용하여 새로운 값으로 채운다 2번 과정을 필요한 횟수만큼 반복한다 #include #include #include #define seed 31 #define NUM 100 #define MX 32767 static double table[100], index; double ran_gen() { unsigned int i; i = (int)(1 + 99.0 * index / MX); if (i > 99 || i < 0) {..

보간법(선형, 랑그라제, 네빌레, 뉴튼 다항식, 전/후향 차분법, 스플라인)

선형 보간법 선형 보간법은 여러 기본적인 수치해석 방법의 기초가 된다. 선형 보간법을 이용하여 사다리꼴 법이라는 한 적분 방법도 유도해 낼 수 있으며 미분 방정식을 푸는데도 사용된다. 선형 보간법은 단순히 주어진 두 점을 이은 직선으로 구하는 방법이다. #include #include #include #include void clrscr(void) { COORD Cur = { 0, 0 }; unsigned long dwLen; FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ', 80 * 25, Cur, &dwLen); } double linear_interpol(double* x1, double* x2, double* y1, double* ..

최소 자승법(촐레스키법을 이용한 행렬의 제곱근)

두 고유 벡터는 서로 직교한다. 즉 대칭 행렬의 서로 다른 고유 벡터들은 서로 직교한다. 이와 같이 대칭 행렬에는 그 자신만의 특이한 성질이 있다. 실수로 원소로 가지는 대칭 행렬의 고유치들은 모두 실수이다. 따라서 그 고유 벡터들도 실수로 이루어져 있다 서로 다른 고유치에 해당하는 고유 벡터들은 서로 직교한다 실수로 원소를 가지는 nxn의 대칭 행렬 S가 p중근의 고유치를 가지면 rank값은 n-p가 된다 앞의 성질3에 의해서 대칭 행렬 S를 대각화하는 닮음 변환은 항상 존재한다 위에서 찾아지는 닮음 변환에 해당하는 행렬 P는 직교 행렬이 된다 대칭 행렬의 제곱근 양의 정부호나 양의 반 정부호인 행렬들의 제곱근은 쉽게 구할 수 있다. 첫 번째 방식은 행렬의 대각화를 이용하는 방식이고, 다른 한 가지 방..

고유치(파데브-레브리어의 알고리즘)

고유치 고유치의 성질 0이 행렬 A의 고유치가 되기 위한 필요충분조건은 행렬 A가 singular인 것이다 k가 임의의 실수이 ㄴ경우 행렬의 고유치는 원래의 행렬 A의 고유치의 k배에 해당하는 값이 된다 대각 행렬의 고유치는 그 대각 원소들이다 행렬 A의 고유치들의 합은 trace(A)가 된다 행렬 A의 고유치들의 곱은 행렬 A의 행렬식이 된다 고유백터의 성질 서로 다른 고유치에 해당하는 고유 벡터들은 서로 선형독립이다 실수들을 원소로 가지는 행렬 A의 고유 벡터들 중에 복소수가 있으면 그 들은 서로 켤레 복소수의 관계를 가지고 있다 임의의 실수 k에 대해서 행렬의 고유 벡터들은 행렬 A의 고유 벡터들과 같다 고유치들은 고유 벡터들을 어떻게 나열했는지에 따라 다른 위치에 나타나게 된다. 결국 같은 고유 ..

행렬&역행렬

행렬식 행렬식은 다음의 조건을 가진다 임의의 행렬의 행렬식은 그 행렬의 임의의 행이나 열에 다른 행이나 열을 더하거나 빼도 변하지 않는다 임의의 행렬의 모든 원소에 k를 곱하면 그 행렬의 행렬식의 값도 k배가 된다 단위행렬의 행렬식의 값은 1이다 임의의 행렬에서 두 개의 행이나 열을 서로 바꾸면 행렬식의 부호가 반대로 된다 임의의 행렬에서 어느 한 행이나 열의 모든 원소가 0이면 그 행렬의 행렬식은 0이 된다. 그리고 어느 한 행이나 열이 다른 행이나 열과 비례해도 행렬식은 0이 된다 임의의 대각 행렬의 행렬식은 그 대각 원소들을 모두 곱한 것과 같다 임의의 행렬의 전치 행렬의 행렬식은 원래 행렬의 행렬식과 같다 임의의 삼각 행렬의 행렬식은 그 대각 원소들을 모두 곱한 것과 같다 두 개의 행렬의 곱으로 ..

연립방정식(가우스 조단의 피보팅, 가우스 자이달 방법)

가우스 조단의 피보팅 연립 방정식에서는 각 방정식들 간의 덧셈이나 뺄셈을 통하여 서로 동치인 방정식들을 만들 수 있다. 즉 어떤 방정식에 일정한 수를 곱하여 다른 방정식과 더하거나 빼는 과정을 거쳐서 만들어진 새로운 방정식도 이전의 방정식과 같은 해를 가진다. #include void main() { int i, j, k, num_eq, num_var; double coeff[20][20], known[20]; printf("Enter the Number of Eqations.: "); scanf_s("%d", &num_eq); printf("Enter the Number of Variables.: "); scanf_s("%d", &num_var); for (i = 0; i < num_eq; i++) {..