File size: 10,366 Bytes
2737675
 
 
 
caeeaf9
2737675
 
f2890ea
2737675
 
 
 
 
caeeaf9
2737675
93a28dc
caeeaf9
6d5d408
caeeaf9
 
 
6d5d408
caeeaf9
 
 
6d5d408
caeeaf9
 
6d5d408
 
418e38e
 
caeeaf9
 
6d5d408
 
 
 
 
 
 
 
caeeaf9
 
2737675
93a28dc
 
944b3f0
9b65f68
418e38e
 
 
 
 
 
 
 
 
9b65f68
 
 
 
 
 
 
 
 
 
 
caeeaf9
 
 
 
 
9b65f68
 
944b3f0
 
caeeaf9
6d5d408
caeeaf9
6d5d408
caeeaf9
6d5d408
caeeaf9
418e38e
 
caeeaf9
 
 
 
6d5d408
 
caeeaf9
 
6d5d408
caeeaf9
 
6d5d408
caeeaf9
 
 
6d5d408
caeeaf9
6d5d408
caeeaf9
a84c006
418e38e
a84c006
caeeaf9
 
 
6d5d408
caeeaf9
 
 
 
418e38e
caeeaf9
418e38e
caeeaf9
 
418e38e
 
 
 
 
 
 
 
 
 
 
 
 
 
caeeaf9
 
 
 
 
 
 
 
 
a84c006
 
 
6d5d408
caeeaf9
 
 
 
 
 
 
f2890ea
caeeaf9
 
 
 
 
 
 
 
6d5d408
f2890ea
944b3f0
93a28dc
2737675
93a28dc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Расчёт удобрений с плотностью</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        input { padding: 8px; margin: 5px; width: 200px; }
        button { padding: 8px 12px; cursor: pointer; margin-top: 10px; }
        .result { margin-top: 20px; }
    </style>
</head>
<body>
    <h1>Расчёт удобрений с учётом плотности</h1>
    <div>
        <h3>Введите состав удобрений (%):</h3>
        <label>Ca в Ca(NO₃)₂·4H₂O:</label><input id="ca_content_ca" value="19" step="0.1"><br>
        <label>NO3 в Ca(NO₃)₂·4H₂O:</label><input id="ca_content_no3" value="14.9" step="0.1"><br>
        <label>P в KH₂PO₄:</label><input id="p_content" value="22" step="0.1"><br>
        <label>K в KH₂PO₄:</label><input id="k_content_kh2po4" value="28" step="0.1"><br>
        <label>K в KNO₃:</label><input id="k_content_kno3" value="46" step="0.1"><br>
        <label>NO3 в KNO₃:</label><input id="n_content_kno3" value="13.5" step="0.1"><br>
        <label>Mg в MgSO₄·7H₂O:</label><input id="mg_content_mgso4" value="16" step="0.1"><br>
        <label>S в MgSO₄·7H₂O:</label><input id="s_content_mgso4" value="13.5" step="0.1"><br>
        <label>Mg в Mg(NO₃)₂·6H₂O:</label><input id="mg_content_mgno3" value="9.8" step="0.1"><br>
        <label>NO3 в Mg(NO₃)₂·6H₂O:</label><input id="n_content_mgno3" value="11" step="0.1"><br>
        <label>K в K₂SO₄:</label><input id="k_content_k2so4" value="41.5" step="0.1"><br>
        <label>S в K₂SO₄:</label><input id="s_content_k2so4" value="18" step="0.1"><br>
        <label>NH4 в NH₄NO₃:</label><input id="nh4_content_nh4no3" value="17" step="0.1"><br>
        <label>NO3 в NH₄NO₃:</label><input id="no3_content_nh4no3" value="17" step="0.1"><br>
        <label>K в KCl:</label><input id="k_content_kcl" value="52.4" step="0.1"><br>
        <label>Cl в KCl:</label><input id="cl_content_kcl" value="47.6" step="0.1"><br>

        <h3>Требуемые концентрации (мг/л):</h3>
        <label>NO3:</label><input id="no3" value="210"><br>
        <label>NH4:</label><input id="nh4" value="17"><br>
        <label>P:</label><input id="p" value="46"><br>
        <label>K:</label><input id="k" value="371"><br>
        <label>Ca:</label><input id="ca" value="216"><br>
        <label>Mg:</label><input id="mg" value="58"><br>
        <label>S:</label><input id="s" value="141"><br>
        <label>Cl:</label><input id="cl" value="35"><br>

        <button onclick="calculate()">Рассчитать</button>
    </div>
    <div class="result" id="result"></div>

    <script>
        const DENSITY_DATA = {
            "NH4NO3": [[5, 1.001], [690, 1.2528]],
            "Ca(NO3)2*4H2O": [[5, 1.0015], [920, 1.4208]],
            "MgSO4*7H2O": [[5, 1.0014], [695, 1.2974]],
            "Mg(NO3)2*6H2O": [[5, 1.0001], [500, 1.2007]],
            "KNO3": [[5, 1.0011], [280, 1.1627]],
            "K2SO4": [[5, 1.002], [110, 1.0825]],
            "KH2PO4": [[5, 1.0016], [110, 1.0719]],
            "KCl": [[5, 1.002], [100, 1.045]] // Примерные данные для KCl
        };

        function getDensity(fertilizer, mass) {
            const data = DENSITY_DATA[fertilizer];
            if (!data || mass <= 0) return 1;
            for (let i = 0; i < data.length - 1; i++) {
                if (mass >= data[i][0] && mass <= data[i + 1][0]) {
                    const [x1, y1] = data[i];
                    const [x2, y2] = data[i + 1];
                    return y1 + (mass - x1) * (y2 - y1) / (x2 - x1);
                }
            }
            return data[data.length - 1][1];
        }

        function round(value, precision = 2) {
            return Number(value.toFixed(precision));
        }

        function calculate() {
            // Состав удобрений (% → доли)
            const fertilizers = {
                "Ca(NO3)2*4H2O": { Ca: parseFloat(document.getElementById("ca_content_ca").value) / 100, NO3: parseFloat(document.getElementById("ca_content_no3").value) / 100 },
                "KH2PO4": { P: parseFloat(document.getElementById("p_content").value) / 100, K: parseFloat(document.getElementById("k_content_kh2po4").value) / 100 },
                "KNO3": { K: parseFloat(document.getElementById("k_content_kno3").value) / 100, NO3: parseFloat(document.getElementById("n_content_kno3").value) / 100 },
                "MgSO4*7H2O": { Mg: parseFloat(document.getElementById("mg_content_mgso4").value) / 100, S: parseFloat(document.getElementById("s_content_mgso4").value) / 100 },
                "Mg(NO3)2*6H2O": { Mg: parseFloat(document.getElementById("mg_content_mgno3").value) / 100, NO3: parseFloat(document.getElementById("n_content_mgno3").value) / 100 },
                "K2SO4": { K: parseFloat(document.getElementById("k_content_k2so4").value) / 100, S: parseFloat(document.getElementById("s_content_k2so4").value) / 100 },
                "NH4NO3": { NH4: parseFloat(document.getElementById("nh4_content_nh4no3").value) / 100, NO3: parseFloat(document.getElementById("no3_content_nh4no3").value) / 100 },
                "KCl": { K: parseFloat(document.getElementById("k_content_kcl").value) / 100, Cl: parseFloat(document.getElementById("cl_content_kcl").value) / 100 }
            };

            // Целевые концентрации
            const need = {
                NO3: parseFloat(document.getElementById("no3").value),
                NH4: parseFloat(document.getElementById("nh4").value),
                P: parseFloat(document.getElementById("p").value),
                K: parseFloat(document.getElementById("k").value),
                Ca: parseFloat(document.getElementById("ca").value),
                Mg: parseFloat(document.getElementById("mg").value),
                S: parseFloat(document.getElementById("s").value),
                Cl: parseFloat(document.getElementById("cl").value)
            };

            // Приоритеты
            const priority = { Ca: 3000, P: 3000, K: 2000, Mg: 2000, S: 2000, NO3: 1500, NH4: 1500, Cl: 1000 };
            const weights = {};
            const calcElements = { NO3: 0, NH4: 0, P: 0, K: 0, Ca: 0, Mg: 0, S: 0, Cl: 0 };
            let remaining = { ...need };

            // Итеративный расчёт с ограничением превышения
            for (let i = 0; i < 10; i++) {
                for (const [id, elements] of Object.entries(fertilizers)) {
                    const sorted = Object.entries(elements)
                        .filter(([_, v]) => v > 0)
                        .sort(([a], [b]) => (priority[b] || 0) - (priority[a] || 0) + (remaining[b] || 0) / (elements[b] || 1) - (remaining[a] || 0) / (elements[a] || 1));
                    const primary = sorted[0]?.[0];
                    if (!primary || remaining[primary] <= 0) continue;

                    let weight = remaining[primary] / elements[primary];
                    weights[id] = weight; // Перезаписываем, а не суммируем

                    // Проверяем вклад и корректируем вес, чтобы не превысить цель
                    for (const [elem, value] of Object.entries(elements)) {
                        const contribution = weight * value;
                        if (calcElements[elem] + contribution > need[elem]) {
                            weight = (need[elem] - calcElements[elem]) / value;
                            weights[id] = weight > 0 ? weight : 0;
                        }
                    }

                    // Обнуляем предыдущий вклад этого удобрения
                    for (const [elem] of Object.entries(elements)) {
                        calcElements[elem] -= (weights[id] * elements[elem] || 0);
                    }

                    // Добавляем новый вклад
                    for (const [elem, value] of Object.entries(elements)) {
                        const contribution = weights[id] * value;
                        calcElements[elem] += contribution;
                        remaining[elem] = (need[elem] || 0) - calcElements[elem];
                    }

                    // Учёт плотности
                    const density = Object.keys(weights).reduce((acc, key) => acc + getDensity(key, weights[key] || 0), 0) / Object.keys(weights).length || 1;
                    for (const key in weights) {
                        weights[key] *= density;
                    }
                }
            }

            // Финальная плотность и концентрации
            const density = Object.keys(weights).reduce((acc, key) => acc + getDensity(key, weights[key] || 0), 0) / Object.keys(weights).length || 1;
            const finalElements = {};
            for (const [id, weight] of Object.entries(weights)) {
                for (const [elem, value] of Object.entries(fertilizers[id])) {
                    finalElements[elem] = (finalElements[elem] || 0) + (weight * value) / density;
                }
            }

            // Вывод результата
            let resultText = "<h3>Результаты (г/1000 л):</h3>";
            for (const [id, weight] of Object.entries(weights)) {
                resultText += `<p>${id}: ${round(weight)}`;
                const contributions = Object.entries(fertilizers[id]).map(([e, v]) => `${e}: ${round(weight * v / density)}`).join(", ");
                resultText += ` (${contributions})</p>`;
            }
            resultText += `<h3>Итоговые концентрации (мг/л, плотность ${round(density, 4)}):</h3>`;
            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)}`;
            document.getElementById("result").innerHTML = resultText;
        }
    </script>
</body>
</html>