Update calculate.html
Browse files- calculate.html +34 -32
calculate.html
CHANGED
@@ -15,26 +15,29 @@
|
|
15 |
<div>
|
16 |
<h3>Введите состав удобрений (%):</h3>
|
17 |
<label>Ca в Ca(NO₃)₂·4H₂O:</label><input id="ca_content_ca" value="19" step="0.1"><br>
|
18 |
-
<label>
|
19 |
<label>P в KH₂PO₄:</label><input id="p_content" value="22" step="0.1"><br>
|
20 |
<label>K в KH₂PO₄:</label><input id="k_content_kh2po4" value="28" step="0.1"><br>
|
21 |
<label>K в KNO₃:</label><input id="k_content_kno3" value="46" step="0.1"><br>
|
22 |
-
<label>
|
23 |
<label>Mg в MgSO₄·7H₂O:</label><input id="mg_content_mgso4" value="16" step="0.1"><br>
|
24 |
<label>S в MgSO₄·7H₂O:</label><input id="s_content_mgso4" value="13.5" step="0.1"><br>
|
25 |
<label>Mg в Mg(NO₃)₂·6H₂O:</label><input id="mg_content_mgno3" value="9.8" step="0.1"><br>
|
26 |
-
<label>
|
27 |
<label>K в K₂SO₄:</label><input id="k_content_k2so4" value="41.5" step="0.1"><br>
|
28 |
<label>S в K₂SO₄:</label><input id="s_content_k2so4" value="18" step="0.1"><br>
|
29 |
-
<label>
|
|
|
30 |
|
31 |
<h3>Требуемые концентрации (мг/л):</h3>
|
32 |
-
<label>
|
33 |
-
<label>
|
34 |
-
<label>
|
35 |
-
<label>
|
36 |
-
<label>
|
37 |
-
<label>
|
|
|
|
|
38 |
|
39 |
<button onclick="calculate()">Рассчитать</button>
|
40 |
</div>
|
@@ -42,17 +45,14 @@
|
|
42 |
|
43 |
<script>
|
44 |
const DENSITY_DATA = {
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
"MgSO4*7H2O": [[5, 1.0014], [10, 1.0037], [15, 1.0061], [20, 1.0084], [25, 1.0108], [30, 1.0132], [35, 1.0155], [40, 1.0178], [45, 1.0202], [50, 1.0225], [55, 1.0249], [60, 1.0272], [65, 1.0295], [70, 1.0318], [75, 1.0342], [80, 1.0365], [85, 1.0388], [90, 1.0411], [95, 1.0434], [100, 1.0457], [105, 1.048], [110, 1.0503], [115, 1.0526], [120, 1.0549], [125, 1.0572], [130, 1.0595], [135, 1.0618], [140, 1.0641], [145, 1.0663], [150, 1.0686], [155, 1.0709], [160, 1.0732], [165, 1.0754], [170, 1.0777], [175, 1.0799], [180, 1.0822], [185, 1.0844], [190, 1.0867], [195, 1.0889], [200, 1.0912], [205, 1.0934], [210, 1.0957], [215, 1.0979], [220, 1.1001], [225, 1.1023], [230, 1.1046], [235, 1.1068], [240, 1.109], [245, 1.1112], [250, 1.1134], [255, 1.1156], [260, 1.1178], [265, 1.12], [270, 1.1222], [275, 1.1244], [280, 1.1266], [285, 1.1288], [290, 1.131], [295, 1.1332], [300, 1.1354], [305, 1.1375], [310, 1.1397], [315, 1.1419], [320, 1.144], [325, 1.1462], [330, 1.1484], [335, 1.1505], [340, 1.1527], [345, 1.1548], [350, 1.157], [355, 1.1591], [360, 1.1613], [365, 1.1634], [370, 1.1655], [375, 1.1677], [380, 1.1698], [385, 1.1719], [390, 1.174], [395, 1.1761], [400, 1.1783], [405, 1.1804], [410, 1.1825], [415, 1.1846], [420, 1.1867], [425, 1.1888], [430, 1.1909], [435, 1.193], [440, 1.1951], [445, 1.1971], [450, 1.1992], [455, 1.2013], [460, 1.2034], [465, 1.2055], [470, 1.2075], [475, 1.2096], [480, 1.2117], [485, 1.2137], [490, 1.2158], [495, 1.2178], [500, 1.2199], [505, 1.2219], [510, 1.224], [515, 1.226], [520, 1.228], [525, 1.2301], [530, 1.2321], [535, 1.2341], [540, 1.2362], [545, 1.2382], [550, 1.2402], [555, 1.2422], [560, 1.2442], [565, 1.2462], [570, 1.2482], [575, 1.2502], [580, 1.2522], [585, 1.2542], [590, 1.2562], [595, 1.2582], [600, 1.2602], [605, 1.2622], [610, 1.2642], [615, 1.2662], [620, 1.2681], [625, 1.2701], [630, 1.2721], [635, 1.274], [640, 1.276], [645, 1.2779], [650, 1.2799], [655, 1.2819], [660, 1.2838], [665, 1.2857], [670, 1.2877], [675, 1.2896], [680, 1.2916], [685, 1.2935], [690, 1.2954], [695, 1.2974]],
|
54 |
-
"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]]
|
55 |
-
};
|
56 |
|
57 |
function getDensity(fertilizer, mass) {
|
58 |
const data = DENSITY_DATA[fertilizer];
|
@@ -74,29 +74,31 @@
|
|
74 |
function calculate() {
|
75 |
// Состав удобрений (% → доли)
|
76 |
const fertilizers = {
|
77 |
-
"Ca(NO3)2*4H2O": { Ca: parseFloat(document.getElementById("ca_content_ca").value) / 100,
|
78 |
"KH2PO4": { P: parseFloat(document.getElementById("p_content").value) / 100, K: parseFloat(document.getElementById("k_content_kh2po4").value) / 100 },
|
79 |
-
"KNO3": { K: parseFloat(document.getElementById("k_content_kno3").value) / 100,
|
80 |
"MgSO4*7H2O": { Mg: parseFloat(document.getElementById("mg_content_mgso4").value) / 100, S: parseFloat(document.getElementById("s_content_mgso4").value) / 100 },
|
81 |
-
"Mg(NO3)2*6H2O": { Mg: parseFloat(document.getElementById("mg_content_mgno3").value) / 100,
|
82 |
"K2SO4": { K: parseFloat(document.getElementById("k_content_k2so4").value) / 100, S: parseFloat(document.getElementById("s_content_k2so4").value) / 100 },
|
83 |
-
"NH4NO3": {
|
84 |
};
|
85 |
|
86 |
// Целевые концентрации
|
87 |
const need = {
|
88 |
-
|
|
|
89 |
P: parseFloat(document.getElementById("p").value),
|
90 |
K: parseFloat(document.getElementById("k").value),
|
|
|
91 |
Mg: parseFloat(document.getElementById("mg").value),
|
92 |
S: parseFloat(document.getElementById("s").value),
|
93 |
-
|
94 |
};
|
95 |
|
96 |
// Приоритеты
|
97 |
-
const priority = { Ca: 3000, P: 3000, K: 2000, Mg: 2000, S: 2000,
|
98 |
const weights = {};
|
99 |
-
const calcElements = {
|
100 |
let remaining = { ...need };
|
101 |
|
102 |
// Итеративный расчёт
|
@@ -104,7 +106,7 @@
|
|
104 |
for (const [id, elements] of Object.entries(fertilizers)) {
|
105 |
const sorted = Object.entries(elements)
|
106 |
.filter(([_, v]) => v > 0)
|
107 |
-
.sort(([a], [b]) => (priority[b] || 0) - (priority[a] || 0) + (remaining[b] || 0) / elements[b] - (remaining[a] || 0) / elements[a]);
|
108 |
const primary = sorted[0]?.[0];
|
109 |
if (!primary || remaining[primary] <= 0) continue;
|
110 |
|
@@ -125,7 +127,7 @@
|
|
125 |
}
|
126 |
}
|
127 |
|
128 |
-
// Финальная плотность
|
129 |
const density = Object.keys(weights).reduce((acc, key) => acc + getDensity(key, weights[key] || 0), 0) / Object.keys(weights).length || 1;
|
130 |
const finalElements = {};
|
131 |
for (const [id, weight] of Object.entries(weights)) {
|
@@ -142,7 +144,7 @@
|
|
142 |
resultText += ` (${contributions})</p>`;
|
143 |
}
|
144 |
resultText += `<h3>Итоговые концентрации (мг/л, плотность ${round(density, 4)}):</h3>`;
|
145 |
-
resultText += `
|
146 |
document.getElementById("result").innerHTML = resultText;
|
147 |
}
|
148 |
</script>
|
|
|
15 |
<div>
|
16 |
<h3>Введите состав удобрений (%):</h3>
|
17 |
<label>Ca в Ca(NO₃)₂·4H₂O:</label><input id="ca_content_ca" value="19" step="0.1"><br>
|
18 |
+
<label>NO3 в Ca(NO₃)₂·4H₂O:</label><input id="ca_content_no3" value="14.9" step="0.1"><br>
|
19 |
<label>P в KH₂PO₄:</label><input id="p_content" value="22" step="0.1"><br>
|
20 |
<label>K в KH₂PO₄:</label><input id="k_content_kh2po4" value="28" step="0.1"><br>
|
21 |
<label>K в KNO₃:</label><input id="k_content_kno3" value="46" step="0.1"><br>
|
22 |
+
<label>NO3 в KNO₃:</label><input id="n_content_kno3" value="13.5" step="0.1"><br>
|
23 |
<label>Mg в MgSO₄·7H₂O:</label><input id="mg_content_mgso4" value="16" step="0.1"><br>
|
24 |
<label>S в MgSO₄·7H₂O:</label><input id="s_content_mgso4" value="13.5" step="0.1"><br>
|
25 |
<label>Mg в Mg(NO₃)₂·6H₂O:</label><input id="mg_content_mgno3" value="9.8" step="0.1"><br>
|
26 |
+
<label>NO3 в Mg(NO₃)₂·6H₂O:</label><input id="n_content_mgno3" value="11" step="0.1"><br>
|
27 |
<label>K в K₂SO₄:</label><input id="k_content_k2so4" value="41.5" step="0.1"><br>
|
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>
|
34 |
+
<label>NH4:</label><input id="nh4" value="17"><br>
|
35 |
+
<label>P:</label><input id="p" value="46"><br>
|
36 |
+
<label>K:</label><input id="k" value="371"><br>
|
37 |
+
<label>Ca:</label><input id="ca" value="216"><br>
|
38 |
+
<label>Mg:</label><input id="mg" value="58"><br>
|
39 |
+
<label>S:</label><input id="s" value="141"><br>
|
40 |
+
<label>Cl:</label><input id="cl" value="35"><br>
|
41 |
|
42 |
<button onclick="calculate()">Рассчитать</button>
|
43 |
</div>
|
|
|
45 |
|
46 |
<script>
|
47 |
const DENSITY_DATA = {
|
48 |
+
"NH4NO3": [[5, 1.001], [690, 1.2528]],
|
49 |
+
"Ca(NO3)2*4H2O": [[5, 1.0015], [920, 1.4208]],
|
50 |
+
"MgSO4*7H2O": [[5, 1.0014], [695, 1.2974]],
|
51 |
+
"Mg(NO3)2*6H2O": [[5, 1.0001], [500, 1.2007]],
|
52 |
+
"KNO3": [[5, 1.0011], [280, 1.1627]],
|
53 |
+
"K2SO4": [[5, 1.002], [110, 1.0825]],
|
54 |
+
"KH2PO4": [[5, 1.0016], [110, 1.0719]]
|
55 |
+
};
|
|
|
|
|
|
|
56 |
|
57 |
function getDensity(fertilizer, mass) {
|
58 |
const data = DENSITY_DATA[fertilizer];
|
|
|
74 |
function calculate() {
|
75 |
// Состав удобрений (% → доли)
|
76 |
const fertilizers = {
|
77 |
+
"Ca(NO3)2*4H2O": { Ca: parseFloat(document.getElementById("ca_content_ca").value) / 100, NO3: parseFloat(document.getElementById("ca_content_no3").value) / 100 },
|
78 |
"KH2PO4": { P: parseFloat(document.getElementById("p_content").value) / 100, K: parseFloat(document.getElementById("k_content_kh2po4").value) / 100 },
|
79 |
+
"KNO3": { K: parseFloat(document.getElementById("k_content_kno3").value) / 100, NO3: parseFloat(document.getElementById("n_content_kno3").value) / 100 },
|
80 |
"MgSO4*7H2O": { Mg: parseFloat(document.getElementById("mg_content_mgso4").value) / 100, S: parseFloat(document.getElementById("s_content_mgso4").value) / 100 },
|
81 |
+
"Mg(NO3)2*6H2O": { Mg: parseFloat(document.getElementById("mg_content_mgno3").value) / 100, NO3: parseFloat(document.getElementById("n_content_mgno3").value) / 100 },
|
82 |
"K2SO4": { K: parseFloat(document.getElementById("k_content_k2so4").value) / 100, S: parseFloat(document.getElementById("s_content_k2so4").value) / 100 },
|
83 |
+
"NH4NO3": { NH4: parseFloat(document.getElementById("nh4_content_nh4no3").value) / 100, NO3: parseFloat(document.getElementById("no3_content_nh4no3").value) / 100 }
|
84 |
};
|
85 |
|
86 |
// Целевые концентрации
|
87 |
const need = {
|
88 |
+
NO3: parseFloat(document.getElementById("no3").value),
|
89 |
+
NH4: parseFloat(document.getElementById("nh4").value),
|
90 |
P: parseFloat(document.getElementById("p").value),
|
91 |
K: parseFloat(document.getElementById("k").value),
|
92 |
+
Ca: parseFloat(document.getElementById("ca").value),
|
93 |
Mg: parseFloat(document.getElementById("mg").value),
|
94 |
S: parseFloat(document.getElementById("s").value),
|
95 |
+
Cl: parseFloat(document.getElementById("cl").value)
|
96 |
};
|
97 |
|
98 |
// Приоритеты
|
99 |
+
const priority = { Ca: 3000, P: 3000, K: 2000, Mg: 2000, S: 2000, NO3: 1500, NH4: 1500, Cl: 1000 };
|
100 |
const weights = {};
|
101 |
+
const calcElements = { NO3: 0, NH4: 0, P: 0, K: 0, Ca: 0, Mg: 0, S: 0, Cl: 0 };
|
102 |
let remaining = { ...need };
|
103 |
|
104 |
// Итеративный расчёт
|
|
|
106 |
for (const [id, elements] of Object.entries(fertilizers)) {
|
107 |
const sorted = Object.entries(elements)
|
108 |
.filter(([_, v]) => v > 0)
|
109 |
+
.sort(([a], [b]) => (priority[b] || 0) - (priority[a] || 0) + (remaining[b] || 0) / (elements[b] || 1) - (remaining[a] || 0) / (elements[a] || 1));
|
110 |
const primary = sorted[0]?.[0];
|
111 |
if (!primary || remaining[primary] <= 0) continue;
|
112 |
|
|
|
127 |
}
|
128 |
}
|
129 |
|
130 |
+
// Финальная плотность и концентрации
|
131 |
const density = Object.keys(weights).reduce((acc, key) => acc + getDensity(key, weights[key] || 0), 0) / Object.keys(weights).length || 1;
|
132 |
const finalElements = {};
|
133 |
for (const [id, weight] of Object.entries(weights)) {
|
|
|
144 |
resultText += ` (${contributions})</p>`;
|
145 |
}
|
146 |
resultText += `<h3>Итоговые концентрации (мг/л, плотность ${round(density, 4)}):</h3>`;
|
147 |
+
resultText += `NO3: ${round(finalElements.NO3 || 0)}, NH4: ${round(finalElements.NH4 || 0)}, P: ${round(finalElements.P || 0)}, K: ${round(finalElements.K || 0)}, Ca: ${round(finalElements.Ca || 0)}, Mg: ${round(finalElements.Mg || 0)}, S: ${round(finalElements.S || 0)}, Cl: ${round(finalElements.Cl || 0)}`;
|
148 |
document.getElementById("result").innerHTML = resultText;
|
149 |
}
|
150 |
</script>
|