DmitrMakeev commited on
Commit
1d83858
·
verified ·
1 Parent(s): 2c220be

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -12
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
- current_no3 = self.actual_profile['N (NO3-)']
754
- no3_needed = self.target_profile['N (NO3-)'] - current_no3
755
 
756
- if no3_needed > 0.1:
757
- self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
 
 
758
 
759
- self._apply_k_sulfate()
 
 
 
760
 
761
- k_deficit = self.target_profile['K'] - self.actual_profile['K']
762
- if k_deficit > 0.1:
763
- self._apply("Калий азотнокислый", "K", k_deficit)
 
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