DmitrMakeev commited on
Commit
caeeaf9
·
verified ·
1 Parent(s): a84c006

Update calculate.html

Browse files
Files changed (1) hide show
  1. calculate.html +100 -191
calculate.html CHANGED
@@ -2,8 +2,7 @@
2
  <html lang="ru">
3
  <head>
4
  <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
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>Расчёт удобрений с учётом состава и плотности</h1>
16
-
17
  <div>
18
  <h3>Введите состав удобрений (%):</h3>
19
- <label for="ca_content_ca">Ca в Ca(NO₃)₂·4H₂O:</label>
20
- <input type="number" id="ca_content_ca" value="19" step="0.1"><br>
21
- <label for="ca_content_n">N в Ca(NO₃)₂·4H₂O:</label>
22
- <input type="number" id="ca_content_n" value="14.9" step="0.1"><br>
23
-
24
- <label for="p_content">P в KH₂PO₄:</label>
25
- <input type="number" id="p_content" value="22" step="0.1"><br>
26
- <label for="k_content_kh2po4">K в KH₂PO₄:</label>
27
- <input type="number" id="k_content_kh2po4" value="28" step="0.1"><br>
28
-
29
- <label for="k_content_kno3">K в KNO₃:</label>
30
- <input type="number" id="k_content_kno3" value="46" step="0.1"><br>
31
- <label for="n_content_kno3">N в KNO₃:</label>
32
- <input type="number" id="n_content_kno3" value="13.5" step="0.1"><br>
33
-
34
- <label for="mg_content_mgso4">Mg в MgSO₄·7H₂O:</label>
35
- <input type="number" id="mg_content_mgso4" value="16" step="0.1"><br>
36
- <label for="s_content_mgso4">S в MgSO₄·7H₂O:</label>
37
- <input type="number" id="s_content_mgso4" value="13.5" step="0.1"><br>
38
-
39
- <label for="mg_content_mgno3">Mg в Mg(NO₃)₂·6H₂O:</label>
40
- <input type="number" id="mg_content_mgno3" value="9.8" step="0.1"><br>
41
- <label for="n_content_mgno3">N в Mg(NO₃)₂·6H₂O:</label>
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], [10, 1.003], /* ... */ [690, 1.2528]],
74
- "Ca(NO3)2*4H2O": [[5, 1.0015], [10, 1.0041], /* ... */ [755, 1.3519], [920, 1.4208]],
75
- "MgSO4*7H2O": [[5, 1.0014], [10, 1.0037], /* ... */ [695, 1.2974]],
76
- "Mg(NO3)2*6H2O": [[5, 1.0001], [10, 1.0023], /* ... */ [500, 1.2007]],
77
- "KNO3": [[5, 1.0011], [10, 1.0042], /* ... */ [280, 1.1627]],
78
- "K2SO4": [[5, 1.002], [10, 1.006], /* ... */ [110, 1.0825]],
79
- "KH2PO4": [[5, 1.0016], [10, 1.0051], /* ... */ [110, 1.0719]]
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 caContentCa = parseFloat(document.getElementById("ca_content_ca").value) / 100;
98
- const caContentN = parseFloat(document.getElementById("ca_content_n").value) / 100;
99
- const pContent = parseFloat(document.getElementById("p_content").value) / 100;
100
- const kContentKH2PO4 = parseFloat(document.getElementById("k_content_kh2po4").value) / 100;
101
- const kContentKNO3 = parseFloat(document.getElementById("k_content_kno3").value) / 100;
102
- const nContentKNO3 = parseFloat(document.getElementById("n_content_kno3").value) / 100;
103
- const mgContentMgSO4 = parseFloat(document.getElementById("mg_content_mgso4").value) / 100;
104
- const sContentMgSO4 = parseFloat(document.getElementById("s_content_mgso4").value) / 100;
105
- const mgContentMgNO3 = parseFloat(document.getElementById("mg_content_mgno3").value) / 100;
106
- const nContentMgNO3 = parseFloat(document.getElementById("n_content_mgno3").value) / 100;
107
- const kContentK2SO4 = parseFloat(document.getElementById("k_content_k2so4").value) / 100;
108
- const sContentK2SO4 = parseFloat(document.getElementById("s_content_k2so4").value) / 100;
109
- const nContentNH4NO3 = parseFloat(document.getElementById("n_content_nh4no3").value) / 100;
110
-
111
- // Требуемые концентрации (мг/л)
112
- const ca = parseFloat(document.getElementById("ca").value) || 0;
113
- const p = parseFloat(document.getElementById("p").value) || 0;
114
- const k = parseFloat(document.getElementById("k").value) || 0;
115
- const mg = parseFloat(document.getElementById("mg").value) || 0;
116
- const s = parseFloat(document.getElementById("s").value) || 0;
117
- const n = parseFloat(document.getElementById("n").value) || 0;
118
-
119
- if ([ca, p, k, mg, s, n].some(v => isNaN(v))) {
120
- document.getElementById("result").innerHTML = "Введите все значения!";
121
- return;
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
- let nFromCaNO3 = caNO3 * caContentN;
136
- let kFromKH2PO4 = kh2po4 * kContentKH2PO4;
137
-
138
- // MgSO₄·7H₂O и Mg(NO₃)₂·6H₂O
139
- mgso4 = mg / mgContentMgSO4;
140
- let sFromMgSO4 = mgso4 * sContentMgSO4;
141
- let mgFromMgSO4 = mgso4 * mgContentMgSO4;
142
- mgno3 = 0;
143
- let nFromMgNO3 = 0;
144
-
145
- if (sFromMgSO4 > s) {
146
- mgso4 = s / sContentMgSO4;
147
- sFromMgSO4 = mgso4 * sContentMgSO4;
148
- mgFromMgSO4 = mgso4 * mgContentMgSO4;
149
- mgno3 = (mg - mgFromMgSO4) / mgContentMgNO3;
150
- nFromMgNO3 = mgno3 * nContentMgNO3;
 
 
 
 
 
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
- let nFromCaNO3 = caNO3 * caContentN;
194
- let kFromKH2PO4 = kh2po4 * kContentKH2PO4;
195
- let sFromMgSO4 = mgso4 * sContentMgSO4;
196
- let mgFromMgSO4 = mgso4 * mgContentMgSO4;
197
- let nFromMgNO3 = mgno3 * nContentMgNO3;
198
- let mgFromMgNO3 = mgno3 * mgContentMgNO3;
199
- let kFromKNO3 = kno3 * kContentKNO3;
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
- let resultText = `
223
- <h3>Результаты расчёта (г/1000 л):</h3>
224
- <p>Ca(NO₃)₂·4H₂O: ${caNO3.toFixed(2)} (Ca: ${totalCa.toFixed(2)}, N: ${nFromCaNO3.toFixed(2)})</p>
225
- <p>KH₂PO₄: ${kh2po4.toFixed(2)} (P: ${totalP.toFixed(2)}, K: ${kFromKH2PO4.toFixed(2)})</p>
226
- <p>KNO₃: ${kno3.toFixed(2)} (K: ${kFromKNO3.toFixed(2)}, N: ${nFromKNO3.toFixed(2)})</p>
227
- <p>MgSO₄·7H₂O: ${mgso4.toFixed(2)} (Mg: ${mgFromMgSO4.toFixed(2)}, S: ${sFromMgSO4.toFixed(2)})</p>
228
- <p>Mg(NO₃)₂·6H₂O: ${mgno3.toFixed(2)} (Mg: ${mgFromMgNO3.toFixed(2)}, N: ${nFromMgNO3.toFixed(2)})</p>
229
- <p>K₂SO₄: ${k2so4.toFixed(2)} (S: ${sFromK2SO4.toFixed(2)}, K: ${kFromK2SO4.toFixed(2)})</p>
230
- <p>NH₄NO₃: ${nh4no3.toFixed(2)} (N: ${nFromNH4NO3.toFixed(2)})</p>
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>