Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -726,7 +726,7 @@ class NutrientCalculator:
|
|
726 |
self.fertilizers = NUTRIENT_CONTENT_IN_FERTILIZERS
|
727 |
self.total_ec = 0.0
|
728 |
|
729 |
-
#
|
730 |
total_parts = NO3_RATIO + NH4_RATIO
|
731 |
self.target_profile['N (NO3-)'] = TOTAL_NITROGEN * (NO3_RATIO / total_parts)
|
732 |
self.target_profile['N (NH4+)'] = TOTAL_NITROGEN * (NH4_RATIO / total_parts)
|
@@ -743,26 +743,66 @@ class NutrientCalculator:
|
|
743 |
}
|
744 |
return labels.get(element, element)
|
745 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
746 |
def calculate(self):
|
|
|
747 |
try:
|
|
|
748 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
749 |
-
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
750 |
-
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
751 |
-
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
752 |
|
753 |
-
|
754 |
-
|
755 |
|
756 |
-
|
757 |
-
|
|
|
|
|
758 |
|
759 |
-
|
|
|
|
|
|
|
760 |
|
761 |
-
|
762 |
-
|
763 |
-
|
|
|
764 |
|
765 |
return self.results
|
|
|
766 |
except Exception as e:
|
767 |
print(f"Ошибка при расчёте: {str(e)}")
|
768 |
raise
|
|
|
726 |
self.fertilizers = NUTRIENT_CONTENT_IN_FERTILIZERS
|
727 |
self.total_ec = 0.0
|
728 |
|
729 |
+
# Расчет азота
|
730 |
total_parts = NO3_RATIO + NH4_RATIO
|
731 |
self.target_profile['N (NO3-)'] = TOTAL_NITROGEN * (NO3_RATIO / total_parts)
|
732 |
self.target_profile['N (NH4+)'] = TOTAL_NITROGEN * (NH4_RATIO / total_parts)
|
|
|
743 |
}
|
744 |
return labels.get(element, element)
|
745 |
|
746 |
+
def _balance_nitrogen_with_k(self):
|
747 |
+
"""Новый метод с компенсацией калия"""
|
748 |
+
# 1. Вносим NH4 через аммиачную селитру
|
749 |
+
nh4_needed = self.target_profile['N (NH4+)'] - self.actual_profile['N (NH4+)']
|
750 |
+
if nh4_needed > 0.1:
|
751 |
+
self._apply("Аммоний азотнокислый", "N (NH4+)", nh4_needed)
|
752 |
+
|
753 |
+
# 2. Рассчитываем сколько NO3 нужно внести
|
754 |
+
no3_needed = self.target_profile['N (NO3-)'] - self.actual_profile['N (NO3-)']
|
755 |
+
|
756 |
+
# 3. Сначала вносим через кальциевую селитру (для Ca)
|
757 |
+
ca_needed = self.target_profile['Ca'] - self.actual_profile['Ca']
|
758 |
+
if ca_needed > 0.1 and no3_needed > 0.1:
|
759 |
+
max_ca_no3 = (ca_needed / self.fertilizers["Кальциевая селитра"]["Ca"]) * \
|
760 |
+
self.fertilizers["Кальциевая селитра"]["N (NO3-)"]
|
761 |
+
ca_no3_part = min(no3_needed, max_ca_no3)
|
762 |
+
self._apply("Кальциевая селитра", "N (NO3-)", ca_no3_part)
|
763 |
+
no3_needed -= ca_no3_part
|
764 |
+
|
765 |
+
# 4. Остаток NO3 вносим через калийную селитру
|
766 |
+
if no3_needed > 0.1:
|
767 |
+
# Рассчитываем сколько K внесется с этим NO3
|
768 |
+
k_from_kno3 = (no3_needed / self.fertilizers["Калий азотнокислый"]["N (NO3-)"]) * \
|
769 |
+
self.fertilizers["Калий азотнокислый"]["K"]
|
770 |
+
|
771 |
+
# Проверяем, не превысит ли это целевое значение K
|
772 |
+
k_remaining = self.target_profile['K'] - self.actual_profile['K']
|
773 |
+
if k_from_kno3 > k_remaining:
|
774 |
+
# Если превысит - уменьшаем количество KNO3
|
775 |
+
no3_needed = (k_remaining / self.fertilizers["Калий азотнокислый"]["K"]) * \
|
776 |
+
self.fertilizers["Калий азотнокислый"]["N (NO3-)"]
|
777 |
+
|
778 |
+
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
779 |
+
|
780 |
def calculate(self):
|
781 |
+
"""Основной метод расчета с новой логикой"""
|
782 |
try:
|
783 |
+
# 1. Вносим Mg и S
|
784 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
|
|
|
|
|
|
785 |
|
786 |
+
# 2. Балансируем азот с учетом калия
|
787 |
+
self._balance_nitrogen_with_k()
|
788 |
|
789 |
+
# 3. Вносим Ca (остаток)
|
790 |
+
ca_needed = self.target_profile['Ca'] - self.actual_profile['Ca']
|
791 |
+
if ca_needed > 0.1:
|
792 |
+
self._apply("Кальциевая селитра", "Ca", ca_needed)
|
793 |
|
794 |
+
# 4. Вносим P
|
795 |
+
p_needed = self.target_profile['P'] - self.actual_profile['P']
|
796 |
+
if p_needed > 0.1:
|
797 |
+
self._apply("Монофосфат калия", "P", p_needed)
|
798 |
|
799 |
+
# 5. Корректируем K через сульфат калия (если остался дефицит)
|
800 |
+
k_needed = self.target_profile['K'] - self.actual_profile['K']
|
801 |
+
if k_needed > 0.1:
|
802 |
+
self._apply("Калий сернокислый", "K", k_needed)
|
803 |
|
804 |
return self.results
|
805 |
+
|
806 |
except Exception as e:
|
807 |
print(f"Ошибка при расчёте: {str(e)}")
|
808 |
raise
|