기초 수학 연산 및 삼각함수
MATLAB은 수치 해석 및 공학 계산을 위해 방대한 수학 함수 라이브러리를 제공한다. 가장 기본적으로 사용되는 삼각함수는 라디안(Radian)을 기본 단위로 사용하지만, 도(Degree) 단위를 사용하는 함수도 별도로 존재한다. 예를 들어 sin은 라디안을 입력받지만, sind는 도 단위를 입력받는다. 또한 sinpi와 같은 함수는 \( \sin(X \cdot \pi) \)를 부동소수점 오차 없이 정밀하게 계산할 때 유용하다.
삼각함수 시각화
주기 함수의 특성을 파악하기 위해 사인(Sine)과 코사인(Cosine) 파형을 생성하고 시각화하는 과정은 다음과 같다. 데이터 포인트의 밀도를 조절하여 부드러운 곡선을 그릴 수 있다.
% 라디안 기반의 각도 벡터 생성
theta = linspace(0, 2*pi, 200);
% 삼각함수 값 계산
sinWave = sin(theta);
cosWave = cos(theta);
% 그래프 시각화
figure('Name', 'Trigonometric Functions', 'Color', 'w');
plot(theta, sinWave, 'LineWidth', 2, 'Color', [0 0.4470 0.7410]); hold on;
plot(theta, cosWave, 'LineWidth', 2, 'LineStyle', '--', 'Color', [0.8500 0.3250 0.0980]);
grid on;
xlabel('Angle (radians)');
ylabel('Amplitude');
legend('sin(\theta)', 'cos(\theta)', 'Location', 'best');
title('Sine and Cosine Waves');
지수 및 로그 함수
지수 함수(exp)와 자연 로그(log)는 성장 모델링 및 감쇠 현상을 분석하는 데 필수적이다. 매우 작은 값에 대해서는 expm1과 log1p를 사용하여 정밀도를 높일 수 있다. 또한 결과가 복소수가 되는 것을 방지하고 실수 영역에서만 연산을 수행하고 싶다면 realpow, reallog, realsqrt를 사용한다.
% 지수 및 로그 함수의 정의역 설정
domainExp = -2:0.05:3;
domainLog = 0.01:0.05:5;
% 함수 값 계산
expVals = exp(domainExp);
logVals = log(domainLog);
% 서브플롯을 활용한 비교 시각화
figure('Color', 'w');
subplot(2,1,1);
plot(domainExp, expVals, 'g-', 'LineWidth', 1.5);
title('Exponential Function: e^x');
grid on;
subplot(2,1,2);
plot(domainLog, logVals, 'm-', 'LineWidth', 1.5);
title('Natural Logarithm: ln(x)');
grid on;
복소수 연산과 위상 보정
복소수 데이터의 실부(real), 허수부(imag), 절댓값(abs), 위상각(angle)을 추출하는 것은 신호 처리에서 매우 중요하다. 특히 위상각을 계산할 때 atan2 함수는 \([-\pi, \pi]\) 범위의 값을 반환하는데, 이로 인해 위상 불연속성이 발생할 수 있다. 이를 해결하기 위해 unwrap 함수를 사용하여 위상을 연속적으로 보정한다.
% 3차원 나선형 궤적 데이터 생성
t = linspace(0, 10*pi, 500);
xCoord = (t / (2*pi)) .* cos(t);
yCoord = (t / (2*pi)) .* sin(t);
% 위상각 계산 및 불연속성 보정
rawPhase = atan2(yCoord, xCoord);
smoothPhase = unwrap(rawPhase);
% 위상 보정 결과 비교 플롯
figure('Color', 'w');
plot(t, rawPhase, 'k.', 'MarkerSize', 10); hold on;
plot(t, smoothPhase, 'r-', 'LineWidth', 2);
legend('Raw Phase (Wrapped)', 'Unwrapped Phase');
xlabel('Time Parameter (t)');
ylabel('Phase Angle (rad)');
title('Phase Unwrapping using unwrap()');
grid on;
반올림, 버림 및 나머지 연산
수치를 정수로 변환할 때는 목적에 따라 적절한 함수를 선택해야 한다. fix는 0 방향, floor는 음의 무한대, ceil은 양의 무한대 방향으로 반올림한다. 나머지 연산의 경우 rem은 피제수(나눠지는 수)의 부호를 따르는 반면, mod는 제수(나누는 수)의 부호를 따른다.
% 다양한 반올림 방식 테스트
testValues = [-3.8, -2.1, 2.1, 3.8];
fprintf('Original: '); disp(testValues);
fprintf('Fix: '); disp(fix(testValues));
fprintf('Floor: '); disp(floor(testValues));
fprintf('Ceil: '); disp(ceil(testValues));
% rem과 mod의 부호 처리 차이 비교
numA = [17, -17, 17, -17];
numB = [5, 5, -5, -5];
disp('rem(A, B) results:'); disp(rem(numA, numB));
disp('mod(A, B) results:'); disp(mod(numA, numB));
고급 특수 수학 함수
물리학 및 고급 공학 문제에서는 미분 방정식의 해로 나타나는 특수 함수들이 빈번하게 사용된다.
베셀(Bessel) 함수
베셀 방정식 \( Z^2 \frac{\mathrm{d}^2 y}{\mathrm{d} Z^2} + Z \frac{\mathrm{d} y}{\mathrm{d} Z} + (Z^2 - v^2)y = 0 \) 의 해인 베셀 함수는 원통형 좌표계에서의 파동 전파나 열전도 문제를 풀 때 필수적이다. 제1종 베셀 함수는 besselj, 제2종은 bessely로 계산한다.
% 제1종 및 제2종 베셀 함수 시각화
zDomain = 0.1:0.1:15; % 0을 피하여 bessely의 특이점 방지
nu = 1; % 차수(Order)
J_vals = besselj(nu, zDomain);
Y_vals = bessely(nu, zDomain);
figure('Color', 'w');
plot(zDomain, J_vals, 'b-', 'LineWidth', 2); hold on;
plot(zDomain, Y_vals, 'r--', 'LineWidth', 2);
yline(0, 'k:');
legend('J_1(z)', 'Y_1(z)');
xlabel('z'); ylabel('Function Value');
title('Bessel Functions of the First and Second Kind');
grid on;
감마(Gamma) 및 베타(Beta) 함수
감마 함수는 계승(Factorial) 개념을 실수 및 복소수 영역으로 확장한 것으로, \( \Gamma(a) = \int_0^{\infty} \mathrm{e}^{-t} t^{a-1} \,\mathrm{d}t \) 로 정의된다. 값이 매우 커질 때 오버플로를 방지하기 위해 로그 감마 함수인 gammaln을 사용하는 것이 좋다. 베타 함수는 두 감마 함수의 비율로 표현되며 확률 분포 계산에 주로 쓰인다.
오차 함수(Error Function)
정규 분포의 누적 확률을 계산할 때 사용되는 오차 함수 \( \mathrm{erf}(x) \) 는 erf 함수로 구한다. \( \mathrm{erf}(x) \) 가 1에 매우 가까운 영역에서는 정밀도 손실을 막기 위해 여오차 함수 erfc를 사용하여 \( 1 - \mathrm{erf}(x) \) 를 대체하는 것이 수치적으로 안정적이다.
좌표계 변환과 정수론
좌표계 변환
3차원 공간에서 데카르트 좌표계(Cartesian), 극좌표계(Polar), 구면 좌표계(Spherical) 간의 변환은 기하학적 모델링에 필수적이다. pol2cart, cart2pol, sph2cart 등의 함수를 사용하면 복잡한 삼각함수 수식을 직접 작성할 필요 없이 좌표를 쉽게 변환할 수 있다.
% 구면 좌표(Spherical)를 데카르트 좌표(Cartesian)로 변환
% 입력: 방위각(azimuth), 고도(elevation), 반지름(r)
az = pi / 4; % 45 degrees
el = pi / 6; % 30 degrees
r = 10;
[x, y, z] = sph2cart(az, el, r);
fprintf('Spherical to Cartesian -> X: %.3f, Y: %.3f, Z: %.3f\n', x, y, z);
% 데카르트 좌표를 원통 좌표(Cylindrical/Polar)로 역변환
[theta, rho, zCyl] = cart2pol(x, y, z);
fprintf('Cartesian to Polar -> Theta: %.3f rad, Rho: %.3f, Z: %.3f\n', theta, rho, zCyl);
정수론(Number Theory) 함수
암호학이나 이산 수학에서는 소인수 분해, 최대공약수(GCD), 최소공배수(LCM) 등의 정수론 함수가 활용된다. factor는 소인수 목록을 반환하며, isprime은 소수 판별에 사용된다.
% 소인수 분해 및 소수 판별
targetNum = 360;
primeFactors = factor(targetNum);
fprintf('Prime factors of %d: ', targetNum);
disp(primeFactors);
% 행렬 요소 간의 최대공약수(GCD) 및 최소공배수(LCM) 계산
matrixA = [45, 105; 12, 88];
matrixB = [60, 35; 18, 44];
gcdMatrix = gcd(matrixA, matrixB);
lcmMatrix = lcm(matrixA, matrixB);
disp('GCD Matrix:'); disp(gcdMatrix);
disp('LCM Matrix:'); disp(lcmMatrix);