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는 입력 데이터가 잘못 때문에 프로그램을 충돌이 있는지 확실하지 않습니다 또는 그냥 수식을 구현하는 경우 잘못된 :
문제는이 선 것 같다.
입니다. arccos (x)는 -1 =
그래,하지만이 컨텍스트에서이/아래에있는 이유는 확실하지 않습니다. 값은이 입력 형식으로 사용되어야하지만 값입니다. –
'tanx'는'-inf'에서'+ inf'까지 갈 수 있습니다. 그래서 ** - 1 * Math.tan (Lat_local) * Math.tan (D) **가' -1, 1]' – kidwon