Spaces:
Sleeping
Sleeping
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>
|