2013-02-16 5 views
0

기울어 진 태양 전지판에서 발생하는 전 지구 적 방사능을 계산하는 데 필요한 수식을 구현하려고합니다. 내가 사용하는물리 수식 구현 문제

수식은 다음과 같은 연구 논문에서 발견되었다 :

-> ipac.kacst.edu.sa/eDoc/2010/191048_1.pdf

다음

주석 자바 스크립트 코드는 다음과 같습니다

var config = require('./configuration.json'), 
    pi = Math.PI; 

function solar_efficiency(angle, day) { 
    var R_mD, // average sun-earth distance (m) 
     a,  // semi-major axis (km) 
     e,  // oval orbit eccentricity (km) 
     theta, // angle with the perihelion 
     n,  // current nth day of the year (int) 
     R_D, // actual sun-earth distance (m) 
     I_o; // extraterrestrial radiation (indice) 

    R_mD = config.avg_sun_earth_dist; 
    a = config.semi_major_axis; 
    e = config.eccentricity; 
    n = day; 
    theta = n * 365.25/360; 
    R_D = a * (1 - e * e)/(1 + e * Math.cos(theta)); 
    I_o = 1367 * Math.pow(R_mD/R_D, 2); 

    var axis, // angle of the earth's axis 
     D;  // sun declination (radian) 

    axis = config.earth_axis; 
    D = ((axis * pi)/180) * Math.sin(((2 * pi) * (284 + n))/365); 

    var Eq_t; // solar time correction (float) 

    if((1 <= n) && (n <= 106)) { 
     Eq_t = -14.2 * Math.sin((pi * (n + 7))/111); 
    } 
    else if((107 <= n) && (n <= 166)) { 
     Eq_t = 4.0 * Math.sin((pi * (n - 106))/59); 
    } 
    else if((167 <= n) && (n <= 246)) { 
     Eq_t = -6.5 * Math.sin((pi * (n - 166))/80); 
    } 
    else if((247 <= n) && (n <= 365)) { 
     Eq_t = 16.4 * Math.sin((pi * (n - 247))/113); 
    } 

    var Long_sm, // longitude of the standard meridian (longitude) 
     Long_local, // longitude of the panels (longitude) 
     T_local, // local time (h) 
     T_solar; // solar time (h) 

    Long_sm = config.std_meridian_long; 
    Long_local = config.current_longitutde; 
    T_local = config.local_time; 
    T_solar = T_local + (Eq_t/60) + ((Long_sm - Long_local)/15); 

    var W; // hour angle (radian) 

    W = pi * ((12 - T_solar)/12); 

    var Lat_local, // latitude of the panels (latitude) 
     W_sr,  // sunrise hour angle (°) 
     W_ss;  // sunset hour angle (°) 

    Lat_local = config.current_latitude; 
    W_sr = W_ss = Math.acos(-1 * Math.tan(Lat_local) * Math.tan(D)); 

    var alpha, // angle between solar panel and horizontal (°)  -FIND!!! 
     R_b; // ratio of avg. beam radiation on horiz./inclined surface 

    alpha = angle; // /!\ TESTING ONLY /!\ 

    var num_1 = Math.cos(Lat_local - alpha) * Math.cos(D) * Math.sin(W_ss); 
    var num_2 = W_ss * Math.sin(Lat_local - alpha) * Math.sin(D); 
    var det_1 = Math.cos(Lat_local) * Math.cos(D) * Math.sin(W_ss); 
    var det_2 = W_ss * Math.sin(Lat_local) * Math.sin(D); 

    R_b = (num_1 + num_2)/(det_1 + det_2); // in the northern hemisphere 

    var H_g, // global radiation on horizontal surface (W h/m^2/day) ---DB!!! 
     H_d, // diffuse radiation on horizontal surface (W h/m^2/day) ---DB!!! 
     H_B; // beam radiation on inclined surface (W h/m^2/day) 

    H_g = 700; 
    H_d = 500; 
    H_B = (H_g - H_d)/R_b; 

    var R_d; // ratio of avg. daily diffuse radiation tilted/horiz. surface 

    R_d = (3 + Math.cos(2 * alpha))/2; // isotropic Badesco model 

    var H_D; // sky-diffuse radiation on inclined surface (W h/m^2/day) 

    H_D = R_d * H_d; 

    var p, // albedo std. = 0.2 (soil = 0.17, grass = 0.25, concrete = 0.55) 
     H_R; // ground reflected radiation on inclined surface (W h/m^2/day) 

    p = config.ground_albedo; 
    H_R = H_g * p * ((1 - Math.cos(alpha))/2); 

    var H_T; // daily global radiation on a tilted surface (W h/m^2/day) 

    H_T = H_B + H_D + H_R; 
    return H_T; 
} 

var results = {}, current_day; 
for(var i = 0; i < 365; i++) { 
    current_day = []; 
    for(var k = 0; k <= 90; k++) { 
     current_day.push([k, solar_efficiency(k, i)]); 
    } 
    current_day.sort(function(a, b) { return b[1] - a[1]; }); 
    current_day.length = 1; 
    results[i] = current_day[0]; 
} 

console.log(results); 

위도 및 경도와 같은 구성은 JSON 파일에 있습니다. 는 여기에 내가 가진 프로그램을 테스트하고있어 값입니다 : 당신이 위도를 변경하는 경우

{ 
    "avg_sun_earth_dist" : 149597870.7, 
    "earth_axis" : 23.45, 

    "eccentricity" : 0.0167, 
    "semi_major_axis" : 149598261, 

    "local_time" : 12, 

    "std_meridian_long" : 0, 
    "current_longitude" : 2.294351, 
    "current_latitude" : 48.858844, 

    "ground_albedo" : 0.2 
} 

조금 당신이 특정 값을 갑자기 NaN을 얻을 중 하나 또는 값이 안정 있지만 것을 볼 수 있습니다 "I"단지 유성 불꽃.

W_sr = W_ss = Math.acos(-1 * Math.tan(Lat_local) * Math.tan(D)); 

I는 입력 데이터가 잘못 때문에 프로그램을 충돌이 있는지 확실하지 않습니다 또는 그냥 수식을 구현하는 경우 잘못된 :

문제는이 선 것 같다.

+0

입니다. arccos (x)는 -1 =

+0

그래,하지만이 컨텍스트에서이/아래에있는 이유는 확실하지 않습니다. 값은이 입력 형식으로 사용되어야하지만 값입니다. –

+0

'tanx'는'-inf'에서'+ inf'까지 갈 수 있습니다. 그래서 ** - 1 * Math.tan (Lat_local) * Math.tan (D) **가' -1, 1]' – kidwon

답변

0

library, floats은 이러한 계산에 적합하지 않습니다. 당신은 언제나 오류로 끝날 것입니다. 그런 모든 산술에 사용 된 언어는 BigDecimal s