Update calculate.html
Browse files- calculate.html +73 -60
calculate.html
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
<head>
|
4 |
<meta charset="UTF-8">
|
5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
-
<title>Расчёт удобрений с учётом
|
7 |
<style>
|
8 |
body { font-family: Arial, sans-serif; margin: 20px; }
|
9 |
input { padding: 8px; margin: 5px; width: 200px; }
|
@@ -12,7 +12,7 @@
|
|
12 |
</style>
|
13 |
</head>
|
14 |
<body>
|
15 |
-
<h1>Расчёт
|
16 |
|
17 |
<div>
|
18 |
<h3>Введите состав удобрений (%):</h3>
|
@@ -51,17 +51,17 @@
|
|
51 |
|
52 |
<h3>Введите требуемые концентрации элементов (мг/л):</h3>
|
53 |
<label for="ca">Кальций (Ca):</label>
|
54 |
-
<input type="number" id="ca"
|
55 |
<label for="p">Фосфор (P):</label>
|
56 |
-
<input type="number" id="p"
|
57 |
<label for="k">Калий (K):</label>
|
58 |
-
<input type="number" id="k"
|
59 |
<label for="mg">Магний (Mg):</label>
|
60 |
-
<input type="number" id="mg"
|
61 |
<label for="s">Сера (S):</label>
|
62 |
-
<input type="number" id="s"
|
63 |
<label for="n">Азот (N):</label>
|
64 |
-
<input type="number" id="n"
|
65 |
|
66 |
<button onclick="calculate()">Рассчитать количество удобрений</button>
|
67 |
</div>
|
@@ -69,6 +69,29 @@
|
|
69 |
<div class="result" id="result"></div>
|
70 |
|
71 |
<script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
function calculate() {
|
73 |
// Состав удобрений (% → доли)
|
74 |
const caContentCa = parseFloat(document.getElementById("ca_content_ca").value) / 100;
|
@@ -93,85 +116,75 @@
|
|
93 |
const s = parseFloat(document.getElementById("s").value) || 0;
|
94 |
const n = parseFloat(document.getElementById("n").value) || 0;
|
95 |
|
96 |
-
// Проверка ввода
|
97 |
if ([ca, p, k, mg, s, n].some(v => isNaN(v))) {
|
98 |
document.getElementById("result").innerHTML = "Введите все значения!";
|
99 |
return;
|
100 |
}
|
101 |
|
102 |
-
// 1. Ca(NO₃)₂·4H₂O
|
103 |
let caNO3 = ca / caContentCa;
|
104 |
let nFromCaNO3 = caNO3 * caContentN;
|
105 |
|
106 |
-
// 2. KH₂PO₄
|
107 |
let kh2po4 = p / pContent;
|
108 |
let kFromKH2PO4 = kh2po4 * kContentKH2PO4;
|
109 |
|
110 |
-
// 3. MgSO₄·7H₂O и Mg(NO₃)₂
|
111 |
-
let mgso4 =
|
112 |
-
let mgFromMgSO4 = mgso4 * mgContentMgSO4;
|
113 |
let sFromMgSO4 = mgso4 * sContentMgSO4;
|
|
|
|
|
114 |
|
115 |
-
|
116 |
-
let
|
117 |
-
let
|
118 |
-
|
119 |
-
if (mgFromMgSO4 > mg) {
|
120 |
-
mgso4 = mg / mgContentMgSO4;
|
121 |
-
sFromMgSO4 = mgso4 * sContentMgSO4;
|
122 |
-
mgno3 = 0;
|
123 |
-
nFromMgNO3 = 0;
|
124 |
-
}
|
125 |
-
|
126 |
-
// 4. KNO₃ для остатка N
|
127 |
-
let nRemaining = n - nFromCaNO3 - nFromMgNO3;
|
128 |
-
let kno3FromN = nRemaining > 0 ? nRemaining / nContentKNO3 : 0;
|
129 |
-
let kFromKNO3FromN = kno3FromN * kContentKNO3;
|
130 |
-
|
131 |
-
let kRemaining = k - kFromKH2PO4;
|
132 |
-
let kno3FromK = kRemaining > 0 ? kRemaining / kContentKNO3 : 0;
|
133 |
-
let nFromKNO3FromK = kno3FromK * nContentKNO3;
|
134 |
-
|
135 |
-
let kno3 = Math.min(kno3FromN, kno3FromK);
|
136 |
-
let nFromKNO3 = kno3 * nContentKNO3;
|
137 |
let kFromKNO3 = kno3 * kContentKNO3;
|
|
|
138 |
|
139 |
-
// 5.
|
140 |
-
|
141 |
-
let nh4no3 = nRemaining > 0 ? nRemaining / nContentNH4NO3 : 0;
|
142 |
-
|
143 |
-
// 6. K₂SO₄ для остатка S и K
|
144 |
let sRemaining = s - sFromMgSO4;
|
145 |
-
let k2so4FromS = sRemaining > 0 ? sRemaining / sContentK2SO4 : 0;
|
146 |
-
let kFromK2SO4FromS = k2so4FromS * kContentK2SO4;
|
147 |
-
|
148 |
-
kRemaining = k - kFromKH2PO4 - kFromKNO3;
|
149 |
let k2so4FromK = kRemaining > 0 ? kRemaining / kContentK2SO4 : 0;
|
150 |
-
|
151 |
-
let k2so4 = Math.min(
|
152 |
let sFromK2SO4 = k2so4 * sContentK2SO4;
|
153 |
let kFromK2SO4 = k2so4 * kContentK2SO4;
|
154 |
|
155 |
-
//
|
156 |
-
|
157 |
-
let
|
158 |
-
|
159 |
-
|
160 |
-
let
|
161 |
-
let
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
162 |
|
163 |
-
// Результаты
|
164 |
let resultText = `
|
165 |
<h3>Результаты расчёта (г/1000 л):</h3>
|
166 |
-
<p>Ca(NO₃)₂·4H₂O: ${caNO3.toFixed(2)} (Ca: ${totalCa}, N: ${nFromCaNO3.toFixed(2)})</p>
|
167 |
-
<p>KH₂PO₄: ${kh2po4.toFixed(2)} (P: ${totalP}, K: ${kFromKH2PO4.toFixed(2)})</p>
|
168 |
<p>KNO₃: ${kno3.toFixed(2)} (K: ${kFromKNO3.toFixed(2)}, N: ${nFromKNO3.toFixed(2)})</p>
|
169 |
-
<p>MgSO₄·7H₂O: ${mgso4.toFixed(2)} (Mg: ${
|
170 |
<p>Mg(NO₃)₂: ${mgno3.toFixed(2)} (Mg: ${(mgno3 * mgContentMgNO3).toFixed(2)}, N: ${nFromMgNO3.toFixed(2)})</p>
|
171 |
<p>K₂SO₄: ${k2so4.toFixed(2)} (S: ${sFromK2SO4.toFixed(2)}, K: ${kFromK2SO4.toFixed(2)})</p>
|
172 |
<p>NH₄NO₃: ${nh4no3.toFixed(2)} (N: ${(nh4no3 * nContentNH4NO3).toFixed(2)})</p>
|
173 |
-
<h3>Итоговые концентрации (
|
174 |
-
<p>N: ${totalN}, P: ${totalP}, K: ${totalK}, Ca: ${totalCa}, Mg: ${totalMg}, S: ${totalS}</p>
|
175 |
`;
|
176 |
document.getElementById("result").innerHTML = resultText;
|
177 |
}
|
|
|
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 |
</style>
|
13 |
</head>
|
14 |
<body>
|
15 |
+
<h1>Расчёт удобрений с учётом состава и плотности</h1>
|
16 |
|
17 |
<div>
|
18 |
<h3>Введите состав удобрений (%):</h3>
|
|
|
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>
|
|
|
69 |
<div class="result" id="result"></div>
|
70 |
|
71 |
<script>
|
72 |
+
const DENSITY_DATA = {
|
73 |
+
"Ca(NO3)2*4H2O": [[5, 1.0015], [10, 1.0041], /* ... */ [605, 1.2868], /* ... */],
|
74 |
+
"KH2PO4": [[5, 1.0016], [10, 1.0051], /* ... */ [110, 1.0719]],
|
75 |
+
"KNO3": [[5, 1.0011], [10, 1.0042], /* ... */ [280, 1.1627]],
|
76 |
+
"MgSO4*7H2O": [[5, 1.0014], [10, 1.0037], /* ... */ [695, 1.2974]],
|
77 |
+
"Mg(NO3)2*6H2O": [[5, 1.0001], [10, 1.0023], /* ... */ [500, 1.2007]],
|
78 |
+
"K2SO4": [[5, 1.002], [10, 1.006], /* ... */ [110, 1.0825]],
|
79 |
+
"NH4NO3": [[5, 1.001], [10, 1.003], /* ... */ [690, 1.2528]]
|
80 |
+
};
|
81 |
+
|
82 |
+
function getDensity(fertilizer, mass) {
|
83 |
+
const data = DENSITY_DATA[fertilizer];
|
84 |
+
if (!data || mass <= 0) return 1;
|
85 |
+
for (let i = 0; i < data.length - 1; i++) {
|
86 |
+
if (mass >= data[i][0] && mass <= data[i + 1][0]) {
|
87 |
+
const [x1, y1] = data[i];
|
88 |
+
const [x2, y2] = data[i + 1];
|
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;
|
|
|
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 |
+
// 1. Ca(NO₃)₂·4H₂O
|
125 |
let caNO3 = ca / caContentCa;
|
126 |
let nFromCaNO3 = caNO3 * caContentN;
|
127 |
|
128 |
+
// 2. KH₂PO₄
|
129 |
let kh2po4 = p / pContent;
|
130 |
let kFromKH2PO4 = kh2po4 * kContentKH2PO4;
|
131 |
|
132 |
+
// 3. MgSO₄·7H₂O и Mg(NO₃)₂
|
133 |
+
let mgso4 = mg / mgContentMgSO4;
|
|
|
134 |
let sFromMgSO4 = mgso4 * sContentMgSO4;
|
135 |
+
let mgno3 = 0;
|
136 |
+
let nFromMgNO3 = 0;
|
137 |
|
138 |
+
// 4. KNO₃
|
139 |
+
let nRemaining = n - nFromCaNO3;
|
140 |
+
let kno3 = nRemaining > 0 ? nRemaining / nContentKNO3 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
let kFromKNO3 = kno3 * kContentKNO3;
|
142 |
+
let nFromKNO3 = kno3 * nContentKNO3;
|
143 |
|
144 |
+
// 5. K₂SO₄
|
145 |
+
let kRemaining = k - kFromKH2PO4 - kFromKNO3;
|
|
|
|
|
|
|
146 |
let sRemaining = s - sFromMgSO4;
|
|
|
|
|
|
|
|
|
147 |
let k2so4FromK = kRemaining > 0 ? kRemaining / kContentK2SO4 : 0;
|
148 |
+
let k2so4FromS = sRemaining > 0 ? sRemaining / sContentK2SO4 : 0;
|
149 |
+
let k2so4 = Math.min(k2so4FromK, k2so4FromS);
|
150 |
let sFromK2SO4 = k2so4 * sContentK2SO4;
|
151 |
let kFromK2SO4 = k2so4 * kContentK2SO4;
|
152 |
|
153 |
+
// 6. NH₄NO₃
|
154 |
+
nRemaining = n - nFromCaNO3 - nFromKNO3 - nFromMgNO3;
|
155 |
+
let nh4no3 = nRemaining > 0 ? nRemaining / nContentNH4NO3 : 0;
|
156 |
+
|
157 |
+
// Учёт плотности (итеративно)
|
158 |
+
let totalMass = caNO3 + kh2po4 + kno3 + mgso4 + k2so4 + nh4no3;
|
159 |
+
let density = (
|
160 |
+
getDensity("Ca(NO3)2*4H2O", caNO3) +
|
161 |
+
getDensity("KH2PO4", kh2po4) +
|
162 |
+
getDensity("KNO3", kno3) +
|
163 |
+
getDensity("MgSO4*7H2O", mgso4) +
|
164 |
+
getDensity("K2SO4", k2so4) +
|
165 |
+
getDensity("NH4NO3", nh4no3)
|
166 |
+
) / 6; // Средняя плотность
|
167 |
+
let volume = 1000 * density; // Реальный объём
|
168 |
+
|
169 |
+
// Корректировка концентраций
|
170 |
+
let totalN = (nFromCaNO3 + nFromKNO3 + nh4no3 * nContentNH4NO3) / density;
|
171 |
+
let totalP = (kh2po4 * pContent) / density;
|
172 |
+
let totalK = (kFromKH2PO4 + kFromKNO3 + kFromK2SO4) / density;
|
173 |
+
let totalCa = (caNO3 * caContentCa) / density;
|
174 |
+
let totalMg = (mgso4 * mgContentMgSO4) / density;
|
175 |
+
let totalS = (sFromMgSO4 + sFromK2SO4) / density;
|
176 |
|
|
|
177 |
let resultText = `
|
178 |
<h3>Результаты расчёта (г/1000 л):</h3>
|
179 |
+
<p>Ca(NO₃)₂·4H₂O: ${caNO3.toFixed(2)} (Ca: ${totalCa.toFixed(2)}, N: ${nFromCaNO3.toFixed(2)})</p>
|
180 |
+
<p>KH₂PO₄: ${kh2po4.toFixed(2)} (P: ${totalP.toFixed(2)}, K: ${kFromKH2PO4.toFixed(2)})</p>
|
181 |
<p>KNO₃: ${kno3.toFixed(2)} (K: ${kFromKNO3.toFixed(2)}, N: ${nFromKNO3.toFixed(2)})</p>
|
182 |
+
<p>MgSO₄·7H₂O: ${mgso4.toFixed(2)} (Mg: ${totalMg.toFixed(2)}, S: ${sFromMgSO4.toFixed(2)})</p>
|
183 |
<p>Mg(NO₃)₂: ${mgno3.toFixed(2)} (Mg: ${(mgno3 * mgContentMgNO3).toFixed(2)}, N: ${nFromMgNO3.toFixed(2)})</p>
|
184 |
<p>K₂SO₄: ${k2so4.toFixed(2)} (S: ${sFromK2SO4.toFixed(2)}, K: ${kFromK2SO4.toFixed(2)})</p>
|
185 |
<p>NH₄NO₃: ${nh4no3.toFixed(2)} (N: ${(nh4no3 * nContentNH4NO3).toFixed(2)})</p>
|
186 |
+
<h3>Итоговые концентрации (мг/л, с учётом плотности ${density.toFixed(4)}):</h3>
|
187 |
+
<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>
|
188 |
`;
|
189 |
document.getElementById("result").innerHTML = resultText;
|
190 |
}
|