본문 바로가기

Contact English

【알고리즘】 25강. 수치해석 알고리즘

 

25강. 수치해석 알고리즘 모음 (출처 : KREYSZIG 공업수학 개정 10판)

 

추천글 : 【알고리즘】 알고리즘 목차 


1. Thomas 알고리즘 [본문]

2. Gauss 소거법 알고리즘 [본문]

3. Doolittle 법 [본문]

4. Cholesky 법 [본문]

5. Jacobi 반복법 [본문]

6. Gauss-Seidel 알고리즘 [본문]

7. 개선된 Euler 알고리즘 (Heum의 방법) [본문]

8. 고전적인 RUNGE-KUTTA 알고리즘 [본문]

9. 개선된 RUNGE-KUTTA 알고리즘 [본문]

10. RUNGE-KUTTA-FEHLBERG 알고리즘 [본문]

11. Adams-Bashforth 알고리즘 [본문]

12. Adams-Moulton 알고리즘 [본문]

13. Explicit Method [본문]

14. Fully (Simple) Implicit Method [본문]

15. Crank-Nicolson Method [본문]

16. 적분의 근사식 [본문]

17. 뉴턴-랩슨법 [본문]

18. Optimal Transport Theorem [본문]

19. Nelder-Mead method [본문]


 

1. Thomas 알고리즘 (A → A* = [ajk] = [Ar]) [목차]

알고리즘은 Tridiagonal Matrix인 A가  유일해, x = [xj]를 계산하거나 유일해가 존재하지 않음을 나타낸다. 

(단, A의 대각성분을 f, 대각아래 성분을 e, 대각위 성분을 g라고 하자.

 

INPUT: aj, n+1 = bj인 n × (n+1) 첨가행렬 A* = [ajk

OUTPUT: 식 (1)의 해 x = [xj] 또는 식이 유일해를 갖지 않음을 알리는 메시지

// DECOMPOSITION

DO k = 2, ..., n

ek = ek  / fk-1

fk = fk - ek × gk-1

END DO

// FORWARD SUBSTITUTION

DO k = 2, ..., n

rk = rk - ek × rk-1

END DO

// BACKWARD SUBSTITUTION

xn = rn / fn

DO k = n - 1, ..., 1

 xk = (rk - gk × xk+1) / fk

END DO

End GAUSS 

 

 

2. Gauss 소거법 알고리즘 (A → A* = [ajk] = [Ab]) [목차]

 알고리즘은 유일해, x = [xj]를 계산하거나 유일해가 존재하지 않음을 나타낸다.

 

INPUT: aj, n+1 = bj인 n × (n+1) 첨가행렬 A* = [ajk]

OUTPUT: 식 (1)의 해 x = [xj] 또는 식이 유일해를 갖지 않음을 알리는 메시지

For k = 1, ..., n - 1 do:

m = k

For j = k + 1, ..., n, do:

If |amk| < |ajk|    then m = j    End

End

If amk = 0    then 

OUTPUT "유일해 없음"

Stop

End

Else k행을 m행과 교환

For j = k + 1, ..., n, do:

mjk = ajk / akk

For p = k + 1, ..., n + 1, do:

ajp = ajp - mjkakp

End

End

End

If ann = 0    then 

OUTPUT "유일해가 존재하지 않음"

Stop

End

xn = an,n+1 / ann [역대입 시작

For i = n - 1, ..., 1, do:

xi = (1/aii)(ai,n+1 - (ai,i+1xi+1 + ... + ai, nxn))

End

OUTPUT x = [xj]

Stop

End GAUSS 

 

 

3. Doolittle법 [목차]

Ax = LUx = b

Ux = L-1b = y

x = U-1y 

 

 

4. Cholesky법 [목차]

Ax = LLTx = b

LTx = L-1b = y

x = (LT)-1y

 

 

5. Jacobi 반복법 [목차]

ex.

x1 - 0.25x2 - 0.25x3 = 50            x1 = 0.25x2 + 0.25x3 + 50

-0.25x1 + x2 - 0.25x4 = 50          x2 = 0.25x1 + 0.25x4 + 50

-0.25x1 + x3 - 0.25x4 = 25          x3 = 0.25x1 + 0.25x4 + 25

-0.25x2 - 0.25x3 + x4 = 25          x4 = 0.25x2 + 0.25x3 + 25

cf.

x(m+1) = b - Lx(m) - Ux(m) = b - (L+U)x(m)

 

 

6. Gauss-Seidel 알고리즘 (A, b, x(0), ε, N) [목차]

이 알고리즘은 A = [ajk]가 ajj ≠ 0, j = 1, ..., n인 n × n 행렬일 때 주어진 초기 근사해 x(0)에 대해 Ax = b의 해 x를 계산한다.

 

INPUT: A, b, 초기 근사값 x(0), 허용 오차 ε, 최대 반복수 N

OUTPUT: 근사해 x(m) = [xj(m)] 또는 x(N)이 허용오차 조건을 만족하지 않는다는 오류 메시지

For m = 0, ..., N - 1 do:

For j = 1, ..., n do:

xj(m) = (1/ajj)(bj - (aj1x1(m+1) + ... + aj, j-1xj-1(m+1)) - (aj, j+1xj+1(m) + ... + ajnxn(m)))

End

If  j, |xj(m+1) -  xj(m)|    then

OUTPUT x(m+1)

Stop

End

End

OUTPUT

End GAUSS-SEIDEL

 

ex.

x1 - 0.25x2 - 0.25x3 = 50            x1 = 0.25x2 + 0.25x3 + 50

-0.25x1 x2 - 0.25x4 = 50          x2 = 0.25x1 + 0.25x4 + 50

-0.25x1 + x3 - 0.25x4 = 25          x3 = 0.25x1 + 0.25x4 + 25

-0.25x2 - 0.25x3 + x4 = 25          x4 = 0.25x2 + 0.25x3 + 25

cf. 

x(m+1) = b - Lx(m+1) - Ux(m)    x(m+1) = (I + L)-1b(I + L)-1Ux(m)

 

 

7. 개선된 Euler 알고리즘 (Heum의 방법) (f, x0, y0, h, N) [목차]

이 알고리즘은 초기값 문제 y' = f(x, y), y(x0) = y0의 해를 등간격 x1 = x0 + h, x2 = x0 + 2h, ..., xN = x0 + Nh에서 계산한다.

단, f는 [x0, xN] 구간에서 이 문제가 유일한 해를 갖는 함수이다.

 

INPUT: 초기값 x0, y0, 단계간격 h, 단계수 N

OUTPUT: xn+1 = x0 + (n+1)h에서 해 y(xn+1)에 관한 근사화 yn+1 (n=0, ..., N-1)

For n = 0, 1, ..., N-1 do:

xn+1 = xn + h

k1 = hf(xn+yn)

k2 = hf(xn+1, yn+k1)

yn+1 = yn + 0.5(k1 + k2)

OUTPUT xn+1, yn+1

End

Stop

End EULER

 

 

8. 고전적인 RUNGE-KUTTA 알고리즘 (f, x0, y0, h, N) [목차]

이 알고리즘은 초기값 문제 y' = f(x, y), y(x0)y0의 해를 등간격점

 

x1 = x0 + h, x2 = x0 + 2h, ..., xN = x0 + Nh

 

에서 계산한다. 여기서 f는 주어진 문제가 구간 [x0xN]에서는 유일한 해를 갖도록 정해진다.

 

INPUT: 초기값 x0, y0, 단계간격 h, 단계수 N

OUTPUT: 단계점 xn+1 = x0 + (n+1)h에서 해 y(xn+1)의 근사값 yn+1 (n = 0, ..., N-1)

For n = 0, 1, ..., N-1 do:

k1 = hf(xnyn)

k2 = hf(xn + 0.5h, yn + 0.5k1)

k3 = hf(xn + 0.5hyn + 0.5k2)

k4 = hf(xn + hyn + k3)

xn+1 = xn + h

yn+1 = yn + (1/6)(k1 + 2k2 + 2k3 + k4)

OUTPUT xn+1yn+1

End

Stop

End RUNGE-KUTTA

 

 

9. 개선된 RUNGE-KUTTA 알고리즘 (f, x0, y0, h, N) [목차]

이 알고리즘은 초기값 문제 y' = f(x, y), y(x0) y0의 해를 등간격점

x1 = x0 + h, x2 = x0 + 2h, ..., xN = x0 + Nh

에서 계산한다. 여기서 f는 주어진 문제가 구간 [x0xN]에서는 유일한 해를 갖도록 정해진다.

 

INPUT: 초기값 x0, y0, 단계간격 h, 단계수 N

OUTPUT: 단계점 xn+1 = x0 + (n+1)h에서 해 y(xn+1)의 근사값 yn+1 (n = 0, ..., N-1)

For n = 0, 1, ..., N-1 do:

k1 = hf(xnyn)

k2 = hf(xn + (1/4)hyn + (1/4)k1)

k3 = hf(xn + (3/8)hyn + (3/32)k1 + (9/32)k2)

k4 = hf(xn + (12/13)hyn + (1932/2197)k1 - (7200/2197)k2 + (7296/2197)k3)

k5 = hf(xn + hyn + (439/216)k1 - 8k2 + (3680/513)k3 - (845/4104)k4)

xn+1 = xn + h

yn+1 = yn + (25/216)k1 + (1408/2565)k3 + (2197/4104)k4 + (-1/5)k5

OUTPUT xn+1yn+1

End

Stop

End RUNGE-KUTTA

 

 

10. RUNGE-KUTTA-FEHLBERG 알고리즘 (f, x0, y0, h, N) [목차]

이 알고리즘은 초기값 문제 y' = f(x, y), y(x0) y0의 해를 등간격점

 

x1 = x0 + h, x2 = x0 + 2h, ..., xN = x0 + Nh

 

에서 계산한다. 여기서 f는 주어진 문제가 구간 [x0xN]에서는 유일한 해를 갖도록 정해진다.

 

INPUT: 초기값 x0, y0, 단계간격 h, 단계수 N

OUTPUT: 단계점 xn+1 = x0 + (n+1)h에서 해 y(xn+1)의 근사값 yn+1 (n = 0, ..., N-1)

For n = 0, 1, ..., N-1 do:

k1 = hf(xnyn)

k2 = hf(xn + (1/4)h, yn + (1/4)k1)

k3 = hf(xn + (3/8)hyn + (3/32)k1 + (9/32)k2)

k4 = hf(xn + (12/13)hyn + (1932/2197)k1 - (7200/2197)k2 + (7296/2197)k3)

k5 = hf(xn + hyn + (439/216)k1 - 8k2 + (3680/513)k3 - (845/4104)k4)

k6 = hf(xn + (1/2)hyn - (8/27)k1 + 2k2 + (3544/2565)k3 - (1859/4104)k4 (11/40)k5)

xn+1 = xn + h

yn+1 = yn + (16/135)k1 + (6656/12825)k3 + (28561/56430)k4 + (-9/50)k5 + (2/55)k6

OUTPUT xn+1yn+1

End

Stop

End RUNGE-KUTTA

 

 

11. Adams-Bashforth 알고리 (xnxn-1xn-2xn-3, fn, fn-1fn-2fn-3, h, N) [목차]

알고리즘은 x0을 포함한 어떤 열린 구간에서 유일한 해를 가지는 초기값 문제

 

y' = f(x, y),    y(x0) = y0,    fn = (xnyn)

 

를 고려한다. 이 방법은 피적분함수 f(x, y(x))를 Newton의 후진차분공식을 써서 보간다항식으로 대체하고 적분하는 것이다. 

 

INPUT: xnxn-1xn-2xn-3, fn, fn-1fn-2fn-3, h, N

OUTPUT: 단계점 xn+m = x0 + (n+m)h에서 해 y(xn+m)의 근사값 yn+m (m = 1, ..., N)

k4 = hfn

k3 = hfn-1

k2 = hfn-2

k1 = hfn-3

For m = 1, ..., N do:

xn+m = xn+m-1 + h

yn+m = yn+(m-1) + (1/24)(55k4 - 59k3 + 37k2 - 9k1)

k1 = k2

k2 = k3

k3 = k4

k4 = hf(xn+myn+m)

OUTPUT xn+myn+m

End

Stop

End ADAMS-BASHFORTH

 

 

12. Adams-Moulton 알고리즘 (xnxn-1xn-2xn-3, fn, fn-1fn-2fn-3, h, N) [목차]

 알고리즘은 x0을 포함한 어떤 열린 구간에서 유일한 해를 가지는 초기값 문제

 

y' = f(x, y),    y(x0) = y0,    fn = (xnyn)

 

를 고려한다. 이 방법은 예측자-수정자 방법을 추가한 것이다. 오차추정은 다음과 같다.

 

εn+1 = (1/15)(yn+1 - y*n+1)

 

INPUT: xnxn-1xn-2xn-3, fn, fn-1fn-2fn-3, h, N

OUTPUT: 단계점 xn+m = x0 + (n+m)h에서 해 y(xn+m)의 근사값 yn+m (m = 1, ..., N)

k4 = hfn

k3 = hfn-1

k2 = hfn-2

k1 = hfn-3

For m = 1, ..., N do:

xn+m = xn+m-1 + h

y*n+m = yn+(m-1) + (1/24)(55k4 - 59k3 + 37k2 - 9k1)

k* = f(xn+my*n+m)

yn+m = yn+(m-1) + (1/24)(9k* + 19k4 - 5k3 + k2)

k1 = k2

k2 = k3

k3 = k4

k4 = hf(xn+myn+m)

OUTPUT xn+myn+m

End

Stop

End ADAMS-MOULTON

 

 

13. Explicit Method [목차]

x(m+1) = Ax(m) + b

 

ex.

3×3: A = ((1 - 2λ, λ, 0)T(λ, 1 - 2λ, λ)T(0, 1 - 2λ, λ)T), b = (λx0, 0, λxn+1)T

 

 

14. Fully (Simple) Implicit Method [목차]

x(m+1) = A-1x(m) - A-1b

 

ex.

3×3: A = ((1 + 2λ, -λ, 0)T(-λ, 1 + 2λ, -λ)T(0, 1 + 2λ, -λ)T), b = (λx0, 0, λxn+1)T

 

 

15. Crank-Nicolson Method [목차]

x(m+1) = Aim-1(Aexx(m) + bexA-1bim

 

ex.

3×3: A = ((1 + 2λ, -λ, 0)T(-λ, 1 + 2λ, -λ)T(0, 1 + 2λ, -λ)T), b = (λx0, 0, λxn+1)T

 

 

16. 적분의 근사식 [목차]

⑴ 심슨 공식(Simpson formula) 등

 

 

17. 뉴턴-랩슨법(Newton-Raphson method) [목차]

 

 

18. Optimal Transport Theorem [목차]

 

 

19. Nelder-Mead method (아메바 방법, 넬더-미드 방법, 활강단체법) [목차] 

이 알고리즘은 다차원 공간의 손실함수의 최솟값 또는 최댓값을 찾기 위한 수치 해석 방법이다.

 

import numpy as np
from scipy.optimize import minimize
from scipy.stats import spearmanr

def model(X, coeffs):
    return np.sum(X.T * coeffs, axis=1)

def objective_function(coeffs, X, target):
    prediction = model(X, coeffs)
    return -spearmanr(target, prediction)[0]

def optimize_spearman(X, target, initial_guess=None):
    if initial_guess is None:
        initial_guess = np.zeros(X.shape[0])  # Default to zero coefficients

    result = minimize(objective_function, initial_guess, args=(X, target), method='Nelder-Mead')
    optimal_coeffs = result.x
    maximized_corr = -objective_function(optimal_coeffs, X, target)
    return optimal_coeffs, maximized_corr

# Example usage
# new_bulk = np.array(...) # Replace with your 11x471 matrix
# target_vector = np.array(...) # Replace with your 471-D target vector

# optimal_coeffs, maximized_corr = optimize_spearman(new_bulk, target_vector)
# print("Optimal coefficients:", optimal_coeffs)
# print("Maximized Spearman Correlation:", maximized_corr)

 

구별개념 1. SLSQP method

구별개념 2. L-BFGS-B method

 

입력: 2016.12.11 02:10

수정: 2024.03.28 22:20