Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -856,31 +856,44 @@ class NutrientCalculator:
|
|
856 |
return round(self.total_ec, 2)
|
857 |
|
858 |
def _compensate_element(self, element: str, needed_ppm: float):
|
859 |
-
"""
|
860 |
-
|
861 |
-
|
862 |
-
|
863 |
-
if element in fert_data
|
864 |
-
|
|
|
|
|
|
|
|
|
|
|
865 |
|
866 |
if not suitable_ferts:
|
867 |
raise ValueError(f"Нет удобрений для элемента {element}")
|
868 |
|
869 |
-
#
|
870 |
-
suitable_ferts.sort(
|
871 |
-
key=lambda x: self.compensation_weights.get(x[0], {}).get('weight', 0.1),
|
872 |
-
reverse=True
|
873 |
-
)
|
874 |
|
|
|
|
|
|
|
875 |
remaining_ppm = needed_ppm
|
876 |
-
for
|
877 |
if remaining_ppm <= 0:
|
878 |
break
|
879 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
880 |
remaining_ppm = self.target_profile[element] - self.actual_profile[element]
|
881 |
|
882 |
-
def calculate(self)
|
883 |
-
"""Основной расчет
|
884 |
try:
|
885 |
# 1. Вносим магний (сульфат магния)
|
886 |
self._apply_fertilizer("Сульфат магния", "Mg", self.target_profile['Mg'])
|
@@ -888,15 +901,20 @@ class NutrientCalculator:
|
|
888 |
# 2. Вносим аммонийный азот
|
889 |
self._apply_fertilizer("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
890 |
|
891 |
-
# 3. Компенсируем нитратный азот
|
892 |
self._compensate_element("N (NO3-)", self.target_profile['N (NO3-)'])
|
893 |
|
894 |
# 4. Вносим фосфор
|
895 |
self._apply_fertilizer("Монофосфат калия", "P", self.target_profile['P'])
|
896 |
|
897 |
-
# 5. Компенсируем калий
|
898 |
self._compensate_element("K", self.target_profile['K'])
|
899 |
|
|
|
|
|
|
|
|
|
|
|
900 |
return self._prepare_results()
|
901 |
|
902 |
except Exception as e:
|
|
|
856 |
return round(self.total_ec, 2)
|
857 |
|
858 |
def _compensate_element(self, element: str, needed_ppm: float):
|
859 |
+
"""Исправленная компенсация с правильным учетом весов"""
|
860 |
+
# Находим все подходящие удобрения
|
861 |
+
suitable_ferts = []
|
862 |
+
for fert_name, fert_data in self.fertilizers.items():
|
863 |
+
if element in fert_data:
|
864 |
+
weight = self.compensation_weights.get(fert_name, {}).get('weight', 0.1)
|
865 |
+
suitable_ferts.append({
|
866 |
+
'name': fert_name,
|
867 |
+
'weight': weight,
|
868 |
+
'content': fert_data[element]
|
869 |
+
})
|
870 |
|
871 |
if not suitable_ferts:
|
872 |
raise ValueError(f"Нет удобрений для элемента {element}")
|
873 |
|
874 |
+
# Сортируем по весу (убывание)
|
875 |
+
suitable_ferts.sort(key=lambda x: x['weight'], reverse=True)
|
|
|
|
|
|
|
876 |
|
877 |
+
# Рассчитываем общий вес для нормализации
|
878 |
+
total_weight = sum(f['weight'] for f in suitable_ferts)
|
879 |
+
|
880 |
remaining_ppm = needed_ppm
|
881 |
+
for fert in suitable_ferts:
|
882 |
if remaining_ppm <= 0:
|
883 |
break
|
884 |
+
|
885 |
+
# Рассчитываем долю этого удобрения
|
886 |
+
share = fert['weight'] / total_weight
|
887 |
+
ppm_to_apply = remaining_ppm * share
|
888 |
+
|
889 |
+
# Вносим рассчитанную долю
|
890 |
+
self._apply_fertilizer(fert['name'], element, ppm_to_apply)
|
891 |
+
|
892 |
+
# Обновляем оставшийся дефицит
|
893 |
remaining_ppm = self.target_profile[element] - self.actual_profile[element]
|
894 |
|
895 |
+
def calculate(self):
|
896 |
+
"""Основной расчет с исправленной компенсацией"""
|
897 |
try:
|
898 |
# 1. Вносим магний (сульфат магния)
|
899 |
self._apply_fertilizer("Сульфат магния", "Mg", self.target_profile['Mg'])
|
|
|
901 |
# 2. Вносим аммонийный азот
|
902 |
self._apply_fertilizer("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
903 |
|
904 |
+
# 3. Компенсируем нитратный азот с учетом весов
|
905 |
self._compensate_element("N (NO3-)", self.target_profile['N (NO3-)'])
|
906 |
|
907 |
# 4. Вносим фосфор
|
908 |
self._apply_fertilizer("Монофосфат калия", "P", self.target_profile['P'])
|
909 |
|
910 |
+
# 5. Компенсируем калий с учетом весов
|
911 |
self._compensate_element("K", self.target_profile['K'])
|
912 |
|
913 |
+
# 6. Компенсируем кальций (если нужно)
|
914 |
+
ca_needed = self.target_profile['Ca'] - self.actual_profile['Ca']
|
915 |
+
if ca_needed > 0:
|
916 |
+
self._compensate_element("Ca", ca_needed)
|
917 |
+
|
918 |
return self._prepare_results()
|
919 |
|
920 |
except Exception as e:
|