Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -756,23 +756,35 @@ class NutrientCalculator:
|
|
756 |
|
757 |
def calculate(self):
|
758 |
try:
|
|
|
759 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
760 |
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
761 |
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
762 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
763 |
-
|
|
|
764 |
current_no3 = self.actual_profile['N (NO3-)']
|
765 |
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
766 |
|
767 |
if no3_needed > 0.1:
|
|
|
|
|
|
|
|
|
|
|
768 |
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
769 |
-
|
|
|
770 |
self._apply_k_sulfate()
|
771 |
-
|
|
|
772 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
773 |
if k_deficit > 0.1:
|
774 |
self._apply("Калий азотнокислый", "K", k_deficit)
|
775 |
-
|
|
|
|
|
|
|
776 |
return self.results
|
777 |
except Exception as e:
|
778 |
print(f"Ошибка при расчёте: {str(e)}")
|
@@ -838,9 +850,29 @@ class NutrientCalculator:
|
|
838 |
print(f"Ошибка при расчёте сульфата калия: {str(e)}")
|
839 |
raise
|
840 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
841 |
def calculate_ec(self):
|
842 |
return round(self.total_ec, 2)
|
843 |
-
|
844 |
def print_report(self):
|
845 |
try:
|
846 |
print("\n" + "="*60)
|
|
|
756 |
|
757 |
def calculate(self):
|
758 |
try:
|
759 |
+
# 1. Вносим основные элементы
|
760 |
self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
|
761 |
self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
|
762 |
self._apply("Монофосфат калия", "P", self.target_profile['P'])
|
763 |
self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
764 |
+
|
765 |
+
# 2. Компенсируем NO3
|
766 |
current_no3 = self.actual_profile['N (NO3-)']
|
767 |
no3_needed = self.target_profile['N (NO3-)'] - current_no3
|
768 |
|
769 |
if no3_needed > 0.1:
|
770 |
+
# Ограничиваем внесение NO3, чтобы не превысить общее количество азота
|
771 |
+
max_nitrogen = self.target_profile['N (NO3-)'] + self.target_profile['N (NH4+)']
|
772 |
+
actual_nitrogen = self.actual_profile['N (NO3-)'] + self.actual_profile['N (NH4+)']
|
773 |
+
if actual_nitrogen + no3_needed > max_nitrogen:
|
774 |
+
no3_needed = max_nitrogen - actual_nitrogen
|
775 |
self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
|
776 |
+
|
777 |
+
# 3. Компенсируем K и S через сульфат калия
|
778 |
self._apply_k_sulfate()
|
779 |
+
|
780 |
+
# 4. Дополнительная компенсация K, если необходимо
|
781 |
k_deficit = self.target_profile['K'] - self.actual_profile['K']
|
782 |
if k_deficit > 0.1:
|
783 |
self._apply("Калий азотнокислый", "K", k_deficit)
|
784 |
+
|
785 |
+
# 5. Проверяем соотношение NH4:NO3
|
786 |
+
self._adjust_nh4_no3_ratio()
|
787 |
+
|
788 |
return self.results
|
789 |
except Exception as e:
|
790 |
print(f"Ошибка при расчёте: {str(e)}")
|
|
|
850 |
print(f"Ошибка при расчёте сульфата калия: {str(e)}")
|
851 |
raise
|
852 |
|
853 |
+
def _adjust_nh4_no3_ratio(self):
|
854 |
+
"""Корректировка соотношения NH4:NO3"""
|
855 |
+
nh4_actual = self.actual_profile['N (NH4+)']
|
856 |
+
no3_actual = self.actual_profile['N (NO3-)']
|
857 |
+
total_n = nh4_actual + no3_actual
|
858 |
+
|
859 |
+
if total_n > 0:
|
860 |
+
nh4_ratio = nh4_actual / total_n
|
861 |
+
target_nh4_ratio = NH4_RATIO / (NH4_RATIO + NO3_RATIO)
|
862 |
+
|
863 |
+
if abs(nh4_ratio - target_nh4_ratio) > 0.05: # Допустимая погрешность 5%
|
864 |
+
if nh4_ratio < target_nh4_ratio:
|
865 |
+
# Увеличиваем NH4+
|
866 |
+
nh4_needed = total_n * target_nh4_ratio - nh4_actual
|
867 |
+
self._apply("Аммоний азотнокислый", "N (NH4+)", nh4_needed)
|
868 |
+
else:
|
869 |
+
# Уменьшаем NH4+, увеличиваем NO3-
|
870 |
+
nh4_excess = nh4_actual - total_n * target_nh4_ratio
|
871 |
+
self._apply("Аммоний азотнокислый", "N (NH4+)", -nh4_excess)
|
872 |
+
self._apply("Калий азотнокислый", "N (NO3-)", nh4_excess)
|
873 |
+
|
874 |
def calculate_ec(self):
|
875 |
return round(self.total_ec, 2)
|
|
|
876 |
def print_report(self):
|
877 |
try:
|
878 |
print("\n" + "="*60)
|