프랙탈 기하학과 프랙탈 차원
추천글 : 【수학】 수학 목차
Q.
프랙탈 기하학의 의미를 설명하고, 원호의 차원을 구하시오.
Solution.
프랙탈(fractal)은 부분이 전체를 닮은 도형을 의미한다. 기본 도형에 affine transformation(회전 + 병진 + 스케일링 + ···)을 적용하여 프랙탈 도형을 만들 수 있다.
Figure. 1. 프랙탈의 예시
프랙탈 기하학(fractal geometry)은 이렇게 복잡한 패턴을 가진 도형에 대한 학문이다. 점은 0차원, 직선은 1차원, 평면은 2차원, 직육면체는 3차원이라는 사실이 잘 알려져 있다. 그런데, 프랙탈은 직선과 같이 선분으로만 이루어진 도형이지만, 분명히 공간을 차지하고 있어 단순히 1차원으로 보면 안 될 것이라는 직관이 생긴다. 그렇다면, 프랙탈의 차원은 어떻게 정의할까? 이를 직관적으로 이해하기 위해 다음과 같은 원호를 상상하자.
Figure. 2. 원호(arc)를 n개의 구획으로 나눈 모습
위 원호는 반지름이 r이고 중심각이 θ이며, θ1 = θ2 = ··· = θn = θ / n으로 총 n개의 구획으로 나뉘어져 있다. 프랙탈 차원을 계산할 때, 색칠한 부분처럼 각각의 작은 원호가 휩쓸고 지나가는 면적을 고려해야 한다. 물론 각 원호의 양쪽의 면적을 고려하는 게 맞지만, 프랙탈 차원의 결론이 바뀌지 않아서 여기에서는 원호의 굽은 안쪽 면적을 고려하는 것으로 하자. 그러면 위 색칠한 면적의 합 Sn은 다음과 같다.
r = 1, θ = π / 2라고 가정하면, n 대 Sn의 곡선은 다음과 같다.
Figure. 3.n 대 Sn의 곡선
import numpy as np
import matplotlib.pyplot as plt
# Constants
theta = np.pi / 2 # theta = pi/2
r = 1 # r = 1
# Function for S
def S(n):
return n * 0.5 * r**2 * (theta / n - np.sin(theta / n))
# Values of n
n_values = np.linspace(1, 100, 500)
# Calculate S for each n
S_values = S(n_values)
# Plotting n vs S
plt.figure(figsize=(10, 6))
plt.plot(n_values, S_values, label=r"$S = n \times 0.5 \times r^2 \times \left(\frac{\theta}{n} - \sin\left(\frac{\theta}{n}\right)\right)$")
plt.xlabel('n')
plt.ylabel('S')
plt.title('Plot of n vs S')
plt.legend()
plt.grid(True)
plt.show()
분명히 n 대 Sn의 곡선은 멱법칙(power law)을 따르고 있으며, 이는 프랙탈 도형이 갖추고 있는 특징 중 하나이다. 이제, log n 대 log Sn의 그래프를 그리면 다음과 같다.
Figure. 4. log n 대 log Sn의 곡선
import numpy as np
import matplotlib.pyplot as plt
# Constants
theta = np.pi / 2 # theta = pi/2
r = 1 # r = 1
# Function for S
def S(n):
return n * 0.5 * r**2 * (theta / n - np.sin(theta / n))
# Values of n
n_values = np.linspace(1, 100, 500)
# Calculate S for each n
S_values = S(n_values)
# Calculate log(n) and log(S)
log_n_values = np.log(n_values)
log_S_values = np.log(S_values)
# Fit a linear trend line (log S = a * log n + b)
coefficients = np.polyfit(log_n_values, log_S_values, 1)
linear_fit = np.poly1d(coefficients)
# Plotting log(n) vs log(S) with the linear trend line
plt.figure(figsize=(10, 6))
plt.plot(log_n_values, log_S_values, label='log(S) vs log(n)', color='blue')
plt.plot(log_n_values, linear_fit(log_n_values), label=f'Linear fit: log(S) = {coefficients[0]:.2f} * log(n) + {coefficients[1]:.2f}', color='red')
plt.xlabel('log(n)')
plt.ylabel('log(S)')
plt.title('Plot of log(n) vs log(S) with Linear Trend Line')
plt.legend()
plt.grid(True)
plt.show()
그러자 그 기울기의 절댓값은 2이고, 이를 프랙탈 차원이라고 할 수 있다. (단, 여기에서 2라는 절댓값이 나온 이유는 테일러 전개 sin θ ≃ θ - θ3 / 3! + θ5 / 5! - ···로부터 쉽게 예측할 수 있다.) 물론, 실제 프랙탈 차원의 정의는 좀 더 정교하며, 실제 원호의 프랙탈 차원은 1과 2 사이의 어느 값이다. 분명한 것은, 단순한 직선의 차원인 1보다는 높은 값이라는 점이다. 참고로, 유클리드 차원은 직선이든 원호든 모두 1이라는 점을 유의해야 한다.
이렇게 선분으로 구성된 도형이 복잡할수록 프랙탈 차원은 증가하는 경향이 있다. 따라서, 신호 처리 분야에서 변동이 심한 신호(jitter)일수록 프랙탈 차원이 커진다는 사실을 적극적으로 활용하고 있다. 예를 들어, 나이가 들거나 병약해질수록 신체 활동 및 신호 세기가 약해져서 EEG와 ECG의 프랙탈 차원은 감소한다. 또한, heart rate variability의 프랙탈 차원을 조사함으로써 질병 진단을 할 수 있다.
일반적으로 ECG에서 자주 사용되는 프랙탈 차원에는 박스 카운팅 방법(Box counting method)과 히구치 프랙탈 차원(Higuchi's fractal dimension)이 있습니다. 박스 카운팅 방법은 점진적으로 박스의 크기를 줄이고, 각 박스 내에서 신호의 부분 개수를 세어 나간다. 반면, 히구치 프랙탈 차원은 반복을 통해 점차 간격을 증가시키고, 각 간격만큼 떨어진 신호 간의 절대값 차이를 측정한다. 이러한 방식으로 두 방법 모두 개수 속성에서 신호의 자기유사성(프랙탈 패턴)을 측정할 수 있다.
다음은 1D 신호의 절대값 차이를 이용하는 Higuchi's fractal dimension을 MATLAB으로 구하는 코드이다.
function Lk = higuchi_fd(signal, k_max)
% Higuchi Fractal Dimension Calculation
% Inputs:
% signal: the 1D time series signal (e.g., ECG window)
% k_max: the maximum value of k (scale factor for subseries)
% Outputs:
% Lk: Higuchi fractal dimension
N = length(signal); % Length of the signal
L = zeros(1, k_max); % Initialize array to store curve lengths for each k
for k = 1:k_max
% Create k different sub-series of the original signal
Lmk = zeros(1, k);
for m = 1:k
idx = m:k:N;
Lm = sum(abs(diff(signal(idx)))) * (N-1) / ((N - m) * k);
Lmk(m) = Lm;
end
L(k) = sum(Lmk) / k; % Average length for this k
end
ln_L = log(L);
ln_k = log(1:k_max);
coeffs = polyfit(ln_k, ln_L, 1);
Lk = -coeffs(1); % The fractal dimension is the slope of the line multiplied by -1
end
입력: 2024.09.12 14:03
'▶ 자연과학 > ▷ 기하학' 카테고리의 다른 글
【AlphaGeometry】 jgex_ag_231 기하 문제 풀이 [221-231] (0) | 2024.08.25 |
---|---|
【AlphaGeometry】 jgex_ag_231 기하 문제 풀이 [201-220] (0) | 2024.08.23 |
【AlphaGeometry】 jgex_ag_231 기하 문제 풀이 [181-200] (0) | 2024.08.18 |
【AlphaGeometry】 jgex_ag_231 기하 문제 풀이 [161-180] (0) | 2024.08.18 |
【AlphaGeometry】 jgex_ag_231 기하 문제 풀이 [141-160] (0) | 2024.08.16 |
최근댓글