DmitrMakeev commited on
Commit
6c19f61
·
verified ·
1 Parent(s): d7b2c13

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -17
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
- suitable_ferts = [
861
- (fert_name, fert_data)
862
- for fert_name, fert_data in self.fertilizers.items()
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 fert_name, _ in suitable_ferts:
877
  if remaining_ppm <= 0:
878
  break
879
- self._apply_fertilizer(fert_name, element, remaining_ppm)
 
 
 
 
 
 
 
 
880
  remaining_ppm = self.target_profile[element] - self.actual_profile[element]
881
 
882
- def calculate(self) -> Dict[str, Any]:
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: