Update calculate.html
Browse files- calculate.html +30 -14
calculate.html
CHANGED
@@ -28,6 +28,8 @@
|
|
28 |
<label>S в K₂SO₄:</label><input id="s_content_k2so4" value="18" step="0.1"><br>
|
29 |
<label>NH4 в NH₄NO₃:</label><input id="nh4_content_nh4no3" value="17" step="0.1"><br>
|
30 |
<label>NO3 в NH₄NO₃:</label><input id="no3_content_nh4no3" value="17" step="0.1"><br>
|
|
|
|
|
31 |
|
32 |
<h3>Требуемые концентрации (мг/л):</h3>
|
33 |
<label>NO3:</label><input id="no3" value="210"><br>
|
@@ -45,17 +47,15 @@
|
|
45 |
|
46 |
<script>
|
47 |
const DENSITY_DATA = {
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
"Mg(NO3)2*6H2O": [[5, 1.0001], [10, 1.0023], [15, 1.0044], [20, 1.0065], [25, 1.0086], [30, 1.0107], [35, 1.0129], [40, 1.015], [45, 1.0171], [50, 1.0192], [55, 1.0213], [60, 1.0234], [65, 1.0255], [70, 1.0276], [75, 1.0297], [80, 1.0318], [85, 1.0339], [90, 1.036], [95, 1.0381], [100, 1.0402], [105, 1.0423], [110, 1.0443], [115, 1.0464], [120, 1.0485], [125, 1.0506], [130, 1.0527], [135, 1.0547], [140, 1.0568], [145, 1.0589], [150, 1.0609], [155, 1.063], [160, 1.0651], [165, 1.0671], [170, 1.0692], [175, 1.0713], [180, 1.0733], [185, 1.0754], [190, 1.0774], [195, 1.0795], [200, 1.0815], [205, 1.0836], [210, 1.0856], [215, 1.0877], [220, 1.0897], [225, 1.0917], [230, 1.0938], [235, 1.0958], [240, 1.0978], [245, 1.0999], [250, 1.1019], [255, 1.1039], [260, 1.106], [265, 1.108], [270, 1.11], [275, 1.112], [280, 1.114], [285, 1.116], [290, 1.1181], [295, 1.1201], [300, 1.1221], [305, 1.1241], [310, 1.1261], [315, 1.1281], [320, 1.1301], [325, 1.1321], [330, 1.1341], [335, 1.1361], [340, 1.1381], [345, 1.1401], [350, 1.142], [355, 1.144], [360, 1.146], [365, 1.148], [370, 1.15], [375, 1.152], [380, 1.1539], [385, 1.1559], [390, 1.1579], [395, 1.1598], [400, 1.1618], [405, 1.1638], [410, 1.1657], [415, 1.1677], [420, 1.1697], [425, 1.1716], [430, 1.1736], [435, 1.1755], [440, 1.1775], [445, 1.1794], [450, 1.1814], [455, 1.1833], [460, 1.1853], [465, 1.1872], [470, 1.1891], [475, 1.1911], [480, 1.193], [485, 1.195], [490, 1.1969], [495, 1.1988], [500, 1.2007]]
|
58 |
-
};
|
59 |
|
60 |
function getDensity(fertilizer, mass) {
|
61 |
const data = DENSITY_DATA[fertilizer];
|
@@ -83,7 +83,8 @@
|
|
83 |
"MgSO4*7H2O": { Mg: parseFloat(document.getElementById("mg_content_mgso4").value) / 100, S: parseFloat(document.getElementById("s_content_mgso4").value) / 100 },
|
84 |
"Mg(NO3)2*6H2O": { Mg: parseFloat(document.getElementById("mg_content_mgno3").value) / 100, NO3: parseFloat(document.getElementById("n_content_mgno3").value) / 100 },
|
85 |
"K2SO4": { K: parseFloat(document.getElementById("k_content_k2so4").value) / 100, S: parseFloat(document.getElementById("s_content_k2so4").value) / 100 },
|
86 |
-
"NH4NO3": { NH4: parseFloat(document.getElementById("nh4_content_nh4no3").value) / 100, NO3: parseFloat(document.getElementById("no3_content_nh4no3").value) / 100 }
|
|
|
87 |
};
|
88 |
|
89 |
// Целевые концентрации
|
@@ -104,7 +105,7 @@
|
|
104 |
const calcElements = { NO3: 0, NH4: 0, P: 0, K: 0, Ca: 0, Mg: 0, S: 0, Cl: 0 };
|
105 |
let remaining = { ...need };
|
106 |
|
107 |
-
// Итеративный расчёт
|
108 |
for (let i = 0; i < 10; i++) {
|
109 |
for (const [id, elements] of Object.entries(fertilizers)) {
|
110 |
const sorted = Object.entries(elements)
|
@@ -114,10 +115,25 @@
|
|
114 |
if (!primary || remaining[primary] <= 0) continue;
|
115 |
|
116 |
let weight = remaining[primary] / elements[primary];
|
117 |
-
weights[id] =
|
118 |
|
|
|
119 |
for (const [elem, value] of Object.entries(elements)) {
|
120 |
const contribution = weight * value;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
calcElements[elem] += contribution;
|
122 |
remaining[elem] = (need[elem] || 0) - calcElements[elem];
|
123 |
}
|
|
|
28 |
<label>S в K₂SO₄:</label><input id="s_content_k2so4" value="18" step="0.1"><br>
|
29 |
<label>NH4 в NH₄NO₃:</label><input id="nh4_content_nh4no3" value="17" step="0.1"><br>
|
30 |
<label>NO3 в NH₄NO₃:</label><input id="no3_content_nh4no3" value="17" step="0.1"><br>
|
31 |
+
<label>K в KCl:</label><input id="k_content_kcl" value="52.4" step="0.1"><br>
|
32 |
+
<label>Cl в KCl:</label><input id="cl_content_kcl" value="47.6" step="0.1"><br>
|
33 |
|
34 |
<h3>Требуемые концентрации (мг/л):</h3>
|
35 |
<label>NO3:</label><input id="no3" value="210"><br>
|
|
|
47 |
|
48 |
<script>
|
49 |
const DENSITY_DATA = {
|
50 |
+
"NH4NO3": [[5, 1.001], [690, 1.2528]],
|
51 |
+
"Ca(NO3)2*4H2O": [[5, 1.0015], [920, 1.4208]],
|
52 |
+
"MgSO4*7H2O": [[5, 1.0014], [695, 1.2974]],
|
53 |
+
"Mg(NO3)2*6H2O": [[5, 1.0001], [500, 1.2007]],
|
54 |
+
"KNO3": [[5, 1.0011], [280, 1.1627]],
|
55 |
+
"K2SO4": [[5, 1.002], [110, 1.0825]],
|
56 |
+
"KH2PO4": [[5, 1.0016], [110, 1.0719]],
|
57 |
+
"KCl": [[5, 1.002], [100, 1.045]] // Примерные данные для KCl
|
58 |
+
};
|
|
|
|
|
59 |
|
60 |
function getDensity(fertilizer, mass) {
|
61 |
const data = DENSITY_DATA[fertilizer];
|
|
|
83 |
"MgSO4*7H2O": { Mg: parseFloat(document.getElementById("mg_content_mgso4").value) / 100, S: parseFloat(document.getElementById("s_content_mgso4").value) / 100 },
|
84 |
"Mg(NO3)2*6H2O": { Mg: parseFloat(document.getElementById("mg_content_mgno3").value) / 100, NO3: parseFloat(document.getElementById("n_content_mgno3").value) / 100 },
|
85 |
"K2SO4": { K: parseFloat(document.getElementById("k_content_k2so4").value) / 100, S: parseFloat(document.getElementById("s_content_k2so4").value) / 100 },
|
86 |
+
"NH4NO3": { NH4: parseFloat(document.getElementById("nh4_content_nh4no3").value) / 100, NO3: parseFloat(document.getElementById("no3_content_nh4no3").value) / 100 },
|
87 |
+
"KCl": { K: parseFloat(document.getElementById("k_content_kcl").value) / 100, Cl: parseFloat(document.getElementById("cl_content_kcl").value) / 100 }
|
88 |
};
|
89 |
|
90 |
// Целевые концентрации
|
|
|
105 |
const calcElements = { NO3: 0, NH4: 0, P: 0, K: 0, Ca: 0, Mg: 0, S: 0, Cl: 0 };
|
106 |
let remaining = { ...need };
|
107 |
|
108 |
+
// Итеративный расчёт с ограничением превышения
|
109 |
for (let i = 0; i < 10; i++) {
|
110 |
for (const [id, elements] of Object.entries(fertilizers)) {
|
111 |
const sorted = Object.entries(elements)
|
|
|
115 |
if (!primary || remaining[primary] <= 0) continue;
|
116 |
|
117 |
let weight = remaining[primary] / elements[primary];
|
118 |
+
weights[id] = weight; // Перезаписываем, а не суммируем
|
119 |
|
120 |
+
// Проверяем вклад и корректируем вес, чтобы не превысить цель
|
121 |
for (const [elem, value] of Object.entries(elements)) {
|
122 |
const contribution = weight * value;
|
123 |
+
if (calcElements[elem] + contribution > need[elem]) {
|
124 |
+
weight = (need[elem] - calcElements[elem]) / value;
|
125 |
+
weights[id] = weight > 0 ? weight : 0;
|
126 |
+
}
|
127 |
+
}
|
128 |
+
|
129 |
+
// Обнуляем предыдущий вклад этого удобрения
|
130 |
+
for (const [elem] of Object.entries(elements)) {
|
131 |
+
calcElements[elem] -= (weights[id] * elements[elem] || 0);
|
132 |
+
}
|
133 |
+
|
134 |
+
// Добавляем новый вклад
|
135 |
+
for (const [elem, value] of Object.entries(elements)) {
|
136 |
+
const contribution = weights[id] * value;
|
137 |
calcElements[elem] += contribution;
|
138 |
remaining[elem] = (need[elem] || 0) - calcElements[elem];
|
139 |
}
|