MATLAB을 이용한 임의 경사면 태양 복사량 시뮬레이션 및 분석

태양광 발전 시스템의 효율을 극대화하기 위해서는 지표면의 고도, 경사도(Tilt) 및 방위각(Azimuth)에 따른 태양 복사 에너지의 변화를 정확하게 예측하는 것이 필수적입니다. 본 문서에서는 MATLAB을 활용하여 임의의 평면에서 수신되는 태양 복사량을 계산하는 물리적 모델의 구현 방법을 설명합니다.

1. 태양 복사 모델의 물리적 구성

경사면에서 수신되는 전체 일사량(\(I_{total}\))은 크게 세 가지 성분으로 구분됩니다.

  • 직달 일사량(Direct Beam Radiation, \(I_b\)): 태양으로부터 가려짐 없이 직접 지표면에 도달하는 성분입니다.
  • 산란 일사량(Diffuse Sky Radiation, \(I_d\)): 대기 중의 입자에 의해 산란되어 도달하는 성분입니다.
  • 반사 일사량(Ground Reflected Radiation, \(I_r\)): 주변 지면에서 반사되어 경사면에 도달하는 성분입니다.

2. 태양 위치 및 좌표 계산 알고리즘

먼저 특정 위도와 경도, 시간에서 태양의 고도각(Altitude)과 방위각(Azimuth)을 산출해야 합니다. 아래 함수는 적위(Declination)와 시각(Hour Angle)을 기반으로 태양 위치를 계산합니다.

function [sunElev, sunAzim] = getSunPosition(lat, lon, targetTime)
    % lat: 위도, lon: 경도, targetTime: datetime 객체
    
    dayOfYear = day(targetTime, 'dayofyear');
    % 태양 적위 계산 (Cooper의 식)
    declination = 23.45 * sin(deg2rad(360 * (284 + dayOfYear) / 365));
    
    % 지방시 및 시각 계산
    localHour = hour(targetTime) + minute(targetTime)/60;
    timeOffset = (lon - 120) * 4 / 60; % 기준 자오선(한국/중국 등) 기준 보정
    solarTime = localHour + timeOffset;
    hourAngle = 15 * (solarTime - 12);
    
    % 고도각 계산
    sinElev = sin(deg2rad(lat)) * sin(deg2rad(declination)) + ...
              cos(deg2rad(lat)) * cos(deg2rad(declination)) * cos(deg2rad(hourAngle));
    sunElev = rad2deg(asin(sinElev));
    
    % 방위각 계산
    cosAzim = (sin(deg2rad(declination)) - sinElev * sin(deg2rad(lat))) / ...
              (cos(deg2rad(sunElev)) * cos(deg2rad(lat)));
    sunAzim = rad2deg(acos(max(min(cosAzim, 1), -1)));
    
    if hourAngle > 0
        sunAzim = 360 - sunAzim;
    end
end

3. 경사면 복사량 산출 모듈

임의의 경사각(\(\beta\))과 면의 방위각(\(\alpha\))을 가진 평면에 도달하는 복사 강도를 계산합니다. 여기서는 Hottel의 맑은 하늘 모델을 기반으로 대기 투과율을 고려합니다.

function totalIrradiance = computeSlopeIrradiance(lat, lon, timestamp, tilt, surfaceAzim, Gsc)
    % Gsc: 태양 상수 (약 1367 W/m^2)
    
    [alt, azim] = getSunPosition(lat, lon, timestamp);
    
    if alt <= 0
        totalIrradiance = 0;
        return;
    end
    
    % 대기 투과율 모델 (간략화된 Hottel 모델)
    transmissivity = 0.7^(1/sin(deg2rad(alt)));
    
    % 입사각(Angle of Incidence) 계산
    cosTheta = sin(deg2rad(alt)) * cos(deg2rad(tilt)) + ...
               cos(deg2rad(alt)) * sin(deg2rad(tilt)) * cos(deg2rad(azim - surfaceAzim));
    
    % 1. 직달 성분
    Ib = Gsc * transmissivity * max(0, cosTheta);
    
    % 2. 산란 성분 (Isotropic Sky 모델)
    Id = Gsc * 0.3 * (1 - transmissivity) * sin(deg2rad(alt)) * (1 + cos(deg2rad(tilt))) / 2;
    
    % 3. 지면 반사 성분 (반사율 0.2 가정)
    Ir = Gsc * sin(deg2rad(alt)) * 0.2 * (1 - cos(deg2rad(tilt))) / 2;
    
    totalIrradiance = Ib + Id + Ir;
end

4. 응용 예제: 최적 경사각 탐색

특정 위치에서 특정 날짜의 누적 에너지 수신량을 최대화하는 최적 경사각을 찾는 시뮬레이션입니다.

% 설정 파라미터
latitude = 37.56; % 서울 기준
longitude = 126.97;
targetDate = datetime(2025, 5, 20);
solarConstant = 1367;

tilts = 0:1:90;
energyYield = zeros(size(tilts));

for i = 1:length(tilts)
    hourlyEnergy = 0;
    % 일출부터 일몰까지 10분 간격 적분
    for h = 6:1/6:18
        currentTime = targetDate + hours(h);
        val = computeSlopeIrradiance(latitude, longitude, currentTime, tilts(i), 180, solarConstant);
        hourlyEnergy = hourlyEnergy + val * (1/6);
    end
    energyYield(i) = hourlyEnergy;
end

[maxEnergy, idx] = max(energyYield);
fprintf('최적 경사각: %d도, 예상 일일 복사량: %.2f Wh/m^2\n', tilts(idx), maxEnergy);

plot(tilts, energyYield, 'LineWidth', 2);
grid on;
xlabel('Tilt Angle (deg)');
ylabel('Daily Energy (Wh/m^2)');
title('경사각에 따른 일일 수신 에너지 변화');

5. 지형 차폐 및 고도 데이터 활용

복잡한 산악 지형에서는 주변 산의 그림자에 의한 차폐 효과를 고려해야 합니다. DEM(Digital Elevation Model) 데이터를 사용하면 각 격자점에서의 가시선(Line of Sight) 분석을 통해 그림자 여부를 판단할 수 있습니다. viewshed 함수나 벡터의 내적을 활용하여 태양 벡터가 지형 선에 의해 가려지는지 체크함으로써 모델의 정밀도를 높일 수 있습니다.

또한 대규모 연산을 수행할 경우 MATLAB의 parfor를 이용한 병렬 처리나 GPU 배열을 활용하여 수만 개의 격자점에 대한 복사량 분포 지도를 빠르게 생성할 수 있습니다.

태그: Matlab SolarEnergy Photovoltaics AtmosphericPhysics NumericalSimulation

6월 27일 23:34에 게시됨