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