Update calculate.html
Browse files- calculate.html +100 -191
calculate.html
CHANGED
@@ -2,8 +2,7 @@
|
|
2 |
<html lang="ru">
|
3 |
<head>
|
4 |
<meta charset="UTF-8">
|
5 |
-
<
|
6 |
-
<title>Расчёт удобрений с учётом плотности</title>
|
7 |
<style>
|
8 |
body { font-family: Arial, sans-serif; margin: 20px; }
|
9 |
input { padding: 8px; margin: 5px; width: 200px; }
|
@@ -12,71 +11,44 @@
|
|
12 |
</style>
|
13 |
</head>
|
14 |
<body>
|
15 |
-
<h1>Расчёт удобрений с учётом
|
16 |
-
|
17 |
<div>
|
18 |
<h3>Введите состав удобрений (%):</h3>
|
19 |
-
<label
|
20 |
-
<input
|
21 |
-
<label
|
22 |
-
<input
|
23 |
-
|
24 |
-
<label
|
25 |
-
<input
|
26 |
-
<label
|
27 |
-
<input
|
28 |
-
|
29 |
-
<label
|
30 |
-
<input
|
31 |
-
<label
|
32 |
-
|
33 |
-
|
34 |
-
<label
|
35 |
-
<input
|
36 |
-
<label
|
37 |
-
<input
|
38 |
-
|
39 |
-
<label
|
40 |
-
|
41 |
-
<
|
42 |
-
<input type="number" id="n_content_mgno3" value="11" step="0.1"><br>
|
43 |
-
|
44 |
-
<label for="k_content_k2so4">K в K₂SO₄:</label>
|
45 |
-
<input type="number" id="k_content_k2so4" value="41.5" step="0.1"><br>
|
46 |
-
<label for="s_content_k2so4">S в K₂SO₄:</label>
|
47 |
-
<input type="number" id="s_content_k2so4" value="18" step="0.1"><br>
|
48 |
-
|
49 |
-
<label for="n_content_nh4no3">N в NH₄NO₃:</label>
|
50 |
-
<input type="number" id="n_content_nh4no3" value="34" step="0.1"><br>
|
51 |
-
|
52 |
-
<h3>Введите требуемые концентрации элементов (мг/л):</h3>
|
53 |
-
<label for="ca">Кальций (Ca):</label>
|
54 |
-
<input type="number" id="ca" value="115"><br>
|
55 |
-
<label for="p">Фосфор (P):</label>
|
56 |
-
<input type="number" id="p" value="60"><br>
|
57 |
-
<label for="k">Калий (K):</label>
|
58 |
-
<input type="number" id="k" value="149.5"><br>
|
59 |
-
<label for="mg">Магний (Mg):</label>
|
60 |
-
<input type="number" id="mg" value="42.71"><br>
|
61 |
-
<label for="s">Сера (S):</label>
|
62 |
-
<input type="number" id="s" value="74.691"><br>
|
63 |
-
<label for="n">Азот (N):</label>
|
64 |
-
<input type="number" id="n" value="110.74"><br>
|
65 |
-
|
66 |
-
<button onclick="calculate()">Рассчитать количество удобрений</button>
|
67 |
</div>
|
68 |
-
|
69 |
<div class="result" id="result"></div>
|
70 |
|
71 |
<script>
|
72 |
const DENSITY_DATA = {
|
73 |
-
"NH4NO3": [[5, 1.001],
|
74 |
-
"Ca(NO3)2*4H2O": [[5, 1.0015],
|
75 |
-
"MgSO4*7H2O": [[5, 1.0014],
|
76 |
-
"Mg(NO3)2*6H2O": [[5, 1.0001],
|
77 |
-
"KNO3": [[5, 1.0011],
|
78 |
-
"K2SO4": [[5, 1.002],
|
79 |
-
"KH2PO4": [[5, 1.0016],
|
80 |
};
|
81 |
|
82 |
function getDensity(fertilizer, mass) {
|
@@ -89,148 +61,85 @@
|
|
89 |
return y1 + (mass - x1) * (y2 - y1) / (x2 - x1);
|
90 |
}
|
91 |
}
|
92 |
-
return data[data.length - 1][1];
|
|
|
|
|
|
|
|
|
93 |
}
|
94 |
|
95 |
function calculate() {
|
96 |
// Состав удобрений (% → доли)
|
97 |
-
const
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
const
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
}
|
123 |
-
|
124 |
-
// Инициализация масс (г/1000 л)
|
125 |
-
let caNO3 = ca / caContentCa;
|
126 |
-
let kh2po4 = p / pContent;
|
127 |
-
let mgso4 = 0;
|
128 |
-
let mgno3 = 0;
|
129 |
-
let kno3 = 0;
|
130 |
-
let k2so4 = 0;
|
131 |
-
let nh4no3 = 0;
|
132 |
|
133 |
// Итеративный расчёт
|
134 |
for (let i = 0; i < 10; i++) {
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
|
|
|
|
|
|
|
|
|
|
151 |
}
|
152 |
-
|
153 |
-
// KNO₃
|
154 |
-
let nRemaining = n - nFromCaNO3 - nFromMgNO3;
|
155 |
-
kno3 = nRemaining > 0 ? nRemaining / nContentKNO3 : 0;
|
156 |
-
let kFromKNO3 = kno3 * kContentKNO3;
|
157 |
-
let nFromKNO3 = kno3 * nContentKNO3;
|
158 |
-
|
159 |
-
// K₂SO₄
|
160 |
-
let kRemaining = k - kFromKH2PO4 - kFromKNO3;
|
161 |
-
let sRemaining = s - sFromMgSO4;
|
162 |
-
k2so4 = Math.min(kRemaining / kContentK2SO4, sRemaining / sContentK2SO4);
|
163 |
-
if (k2so4 < 0) k2so4 = 0;
|
164 |
-
let sFromK2SO4 = k2so4 * sContentK2SO4;
|
165 |
-
let kFromK2SO4 = k2so4 * kContentK2SO4;
|
166 |
-
|
167 |
-
// NH₄NO₃
|
168 |
-
nRemaining = n - nFromCaNO3 - nFromMgNO3 - nFromKNO3;
|
169 |
-
nh4no3 = nRemaining > 0 ? nRemaining / nContentNH4NO3 : 0;
|
170 |
-
|
171 |
-
// Плотность
|
172 |
-
let density = (
|
173 |
-
getDensity("Ca(NO3)2*4H2O", caNO3) +
|
174 |
-
getDensity("KH2PO4", kh2po4) +
|
175 |
-
getDensity("KNO3", kno3) +
|
176 |
-
getDensity("MgSO4*7H2O", mgso4) +
|
177 |
-
getDensity("Mg(NO3)2*6H2O", mgno3) +
|
178 |
-
getDensity("K2SO4", k2so4) +
|
179 |
-
getDensity("NH4NO3", nh4no3)
|
180 |
-
) / 7;
|
181 |
-
|
182 |
-
// Корректировка масс
|
183 |
-
caNO3 *= density;
|
184 |
-
kh2po4 *= density;
|
185 |
-
mgso4 *= density;
|
186 |
-
mgno3 *= density;
|
187 |
-
kno3 *= density;
|
188 |
-
k2so4 *= density;
|
189 |
-
nh4no3 *= density;
|
190 |
}
|
191 |
|
192 |
-
//
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
let nFromKNO3 = kno3 * nContentKNO3;
|
201 |
-
let sFromK2SO4 = k2so4 * sContentK2SO4;
|
202 |
-
let kFromK2SO4 = k2so4 * kContentK2SO4;
|
203 |
-
let nFromNH4NO3 = nh4no3 * nContentNH4NO3;
|
204 |
-
|
205 |
-
let density = (
|
206 |
-
getDensity("Ca(NO3)2*4H2O", caNO3) +
|
207 |
-
getDensity("KH2PO4", kh2po4) +
|
208 |
-
getDensity("KNO3", kno3) +
|
209 |
-
getDensity("MgSO4*7H2O", mgso4) +
|
210 |
-
getDensity("Mg(NO3)2*6H2O", mgno3) +
|
211 |
-
getDensity("K2SO4", k2so4) +
|
212 |
-
getDensity("NH4NO3", nh4no3)
|
213 |
-
) / 7;
|
214 |
-
|
215 |
-
let totalN = (nFromCaNO3 + nFromKNO3 + nFromMgNO3 + nFromNH4NO3) / density;
|
216 |
-
let totalP = (kh2po4 * pContent) / density;
|
217 |
-
let totalK = (kFromKH2PO4 + kFromKNO3 + kFromK2SO4) / density;
|
218 |
-
let totalCa = (caNO3 * caContentCa) / density;
|
219 |
-
let totalMg = (mgFromMgSO4 + mgFromMgNO3) / density;
|
220 |
-
let totalS = (sFromMgSO4 + sFromK2SO4) / density;
|
221 |
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
<h3>Итоговые концентрации (мг/л, плотность ${density.toFixed(4)}):</h3>
|
232 |
-
<p>N: ${totalN.toFixed(2)}, P: ${totalP.toFixed(2)}, K: ${totalK.toFixed(2)}, Ca: ${totalCa.toFixed(2)}, Mg: ${totalMg.toFixed(2)}, S: ${totalS.toFixed(2)}</p>
|
233 |
-
`;
|
234 |
document.getElementById("result").innerHTML = resultText;
|
235 |
}
|
236 |
</script>
|
|
|
2 |
<html lang="ru">
|
3 |
<head>
|
4 |
<meta charset="UTF-8">
|
5 |
+
<title>Расчёт удобрений с плотностью</title>
|
|
|
6 |
<style>
|
7 |
body { font-family: Arial, sans-serif; margin: 20px; }
|
8 |
input { padding: 8px; margin: 5px; width: 200px; }
|
|
|
11 |
</style>
|
12 |
</head>
|
13 |
<body>
|
14 |
+
<h1>Расчёт удобрений с учётом плотности</h1>
|
|
|
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>N в Ca(NO₃)₂·4H₂O:</label><input id="ca_content_n" 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>N в 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>N в 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>N в NH₄NO₃:</label><input id="n_content_nh4no3" value="34" step="0.1"><br>
|
30 |
+
|
31 |
+
<h3>Требуемые концентрации (мг/л):</h3>
|
32 |
+
<label>Ca:</label><input id="ca" value="115"><br>
|
33 |
+
<label>P:</label><input id="p" value="60"><br>
|
34 |
+
<label>K:</label><input id="k" value="149.5"><br>
|
35 |
+
<label>Mg:</label><input id="mg" value="42.71"><br>
|
36 |
+
<label>S:</label><input id="s" value="74.691"><br>
|
37 |
+
<label>N:</label><input id="n" value="110.74"><br>
|
38 |
+
|
39 |
+
<button onclick="calculate()">Рассчитать</button>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
</div>
|
|
|
41 |
<div class="result" id="result"></div>
|
42 |
|
43 |
<script>
|
44 |
const DENSITY_DATA = {
|
45 |
+
"NH4NO3": [[5, 1.001], /* ... */ [690, 1.2528]],
|
46 |
+
"Ca(NO3)2*4H2O": [[5, 1.0015], /* ... */ [920, 1.4208]],
|
47 |
+
"MgSO4*7H2O": [[5, 1.0014], /* ... */ [695, 1.2974]],
|
48 |
+
"Mg(NO3)2*6H2O": [[5, 1.0001], /* ... */ [500, 1.2007]],
|
49 |
+
"KNO3": [[5, 1.0011], /* ... */ [280, 1.1627]],
|
50 |
+
"K2SO4": [[5, 1.002], /* ... */ [110, 1.0825]],
|
51 |
+
"KH2PO4": [[5, 1.0016], /* ... */ [110, 1.0719]]
|
52 |
};
|
53 |
|
54 |
function getDensity(fertilizer, mass) {
|
|
|
61 |
return y1 + (mass - x1) * (y2 - y1) / (x2 - x1);
|
62 |
}
|
63 |
}
|
64 |
+
return data[data.length - 1][1];
|
65 |
+
}
|
66 |
+
|
67 |
+
function round(value, precision = 2) {
|
68 |
+
return Number(value.toFixed(precision));
|
69 |
}
|
70 |
|
71 |
function calculate() {
|
72 |
// Состав удобрений (% → доли)
|
73 |
+
const fertilizers = {
|
74 |
+
"Ca(NO3)2*4H2O": { Ca: parseFloat(document.getElementById("ca_content_ca").value) / 100, N: parseFloat(document.getElementById("ca_content_n").value) / 100 },
|
75 |
+
"KH2PO4": { P: parseFloat(document.getElementById("p_content").value) / 100, K: parseFloat(document.getElementById("k_content_kh2po4").value) / 100 },
|
76 |
+
"KNO3": { K: parseFloat(document.getElementById("k_content_kno3").value) / 100, N: parseFloat(document.getElementById("n_content_kno3").value) / 100 },
|
77 |
+
"MgSO4*7H2O": { Mg: parseFloat(document.getElementById("mg_content_mgso4").value) / 100, S: parseFloat(document.getElementById("s_content_mgso4").value) / 100 },
|
78 |
+
"Mg(NO3)2*6H2O": { Mg: parseFloat(document.getElementById("mg_content_mgno3").value) / 100, N: parseFloat(document.getElementById("n_content_mgno3").value) / 100 },
|
79 |
+
"K2SO4": { K: parseFloat(document.getElementById("k_content_k2so4").value) / 100, S: parseFloat(document.getElementById("s_content_k2so4").value) / 100 },
|
80 |
+
"NH4NO3": { N: parseFloat(document.getElementById("n_content_nh4no3").value) / 100 }
|
81 |
+
};
|
82 |
+
|
83 |
+
// Целевые концентрации
|
84 |
+
const need = {
|
85 |
+
Ca: parseFloat(document.getElementById("ca").value),
|
86 |
+
P: parseFloat(document.getElementById("p").value),
|
87 |
+
K: parseFloat(document.getElementById("k").value),
|
88 |
+
Mg: parseFloat(document.getElementById("mg").value),
|
89 |
+
S: parseFloat(document.getElementById("s").value),
|
90 |
+
N: parseFloat(document.getElementById("n").value)
|
91 |
+
};
|
92 |
+
|
93 |
+
// Приоритеты
|
94 |
+
const priority = { Ca: 3000, P: 3000, K: 2000, Mg: 2000, S: 2000, N: 1000 };
|
95 |
+
const weights = {};
|
96 |
+
const calcElements = { Ca: 0, P: 0, K: 0, Mg: 0, S: 0, N: 0 };
|
97 |
+
let remaining = { ...need };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
|
99 |
// Итеративный расчёт
|
100 |
for (let i = 0; i < 10; i++) {
|
101 |
+
for (const [id, elements] of Object.entries(fertilizers)) {
|
102 |
+
const sorted = Object.entries(elements)
|
103 |
+
.filter(([_, v]) => v > 0)
|
104 |
+
.sort(([a], [b]) => (priority[b] || 0) - (priority[a] || 0) + (remaining[b] || 0) / elements[b] - (remaining[a] || 0) / elements[a]);
|
105 |
+
const primary = sorted[0]?.[0];
|
106 |
+
if (!primary || remaining[primary] <= 0) continue;
|
107 |
+
|
108 |
+
let weight = remaining[primary] / elements[primary];
|
109 |
+
weights[id] = (weights[id] || 0) + weight;
|
110 |
+
|
111 |
+
for (const [elem, value] of Object.entries(elements)) {
|
112 |
+
const contribution = weight * value;
|
113 |
+
calcElements[elem] += contribution;
|
114 |
+
remaining[elem] = (need[elem] || 0) - calcElements[elem];
|
115 |
+
}
|
116 |
+
|
117 |
+
// Учёт плотности
|
118 |
+
const density = Object.keys(weights).reduce((acc, key) => acc + getDensity(key, weights[key] || 0), 0) / Object.keys(weights).length || 1;
|
119 |
+
for (const key in weights) {
|
120 |
+
weights[key] *= density;
|
121 |
+
}
|
122 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
}
|
124 |
|
125 |
+
// Финальная плотность
|
126 |
+
const density = Object.keys(weights).reduce((acc, key) => acc + getDensity(key, weights[key] || 0), 0) / Object.keys(weights).length || 1;
|
127 |
+
const finalElements = {};
|
128 |
+
for (const [id, weight] of Object.entries(weights)) {
|
129 |
+
for (const [elem, value] of Object.entries(fertilizers[id])) {
|
130 |
+
finalElements[elem] = (finalElements[elem] || 0) + (weight * value) / density;
|
131 |
+
}
|
132 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
133 |
|
134 |
+
// Вывод результата
|
135 |
+
let resultText = "<h3>Результаты (г/1000 л):</h3>";
|
136 |
+
for (const [id, weight] of Object.entries(weights)) {
|
137 |
+
resultText += `<p>${id}: ${round(weight)}`;
|
138 |
+
const contributions = Object.entries(fertilizers[id]).map(([e, v]) => `${e}: ${round(weight * v / density)}`).join(", ");
|
139 |
+
resultText += ` (${contributions})</p>`;
|
140 |
+
}
|
141 |
+
resultText += `<h3>Итоговые концентрации (мг/л, плотность ${round(density, 4)}):</h3>`;
|
142 |
+
resultText += `N: ${round(finalElements.N)}, P: ${round(finalElements.P)}, K: ${round(finalElements.K)}, Ca: ${round(finalElements.Ca)}, Mg: ${round(finalElements.Mg)}, S: ${round(finalElements.S)}`;
|
|
|
|
|
|
|
143 |
document.getElementById("result").innerHTML = resultText;
|
144 |
}
|
145 |
</script>
|