DmitrMakeev commited on
Commit
dce81a7
·
verified ·
1 Parent(s): ed10de7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +68 -52
app.py CHANGED
@@ -798,14 +798,14 @@ class NutrientCalculator:
798
  self.fertilizers = NUTRIENT_CONTENT_IN_FERTILIZERS
799
  self.total_ec = 0.0
800
 
801
- # Веса для компенсации
802
  self.compensation_weights = {
803
- "POTASSIUM_NITRATE": {"weight": 0.5, "fert": "Калий азотнокислый", "main_element": "K"},
804
- "CALCIUM_NITRATE": {"weight": 0.3, "fert": "Кальциевая селитра", "main_element": "Ca"},
805
- "POTASSIUM_SULFATE": {"weight": 0.2, "fert": "Калий сернокислый", "main_element": "K"}
806
  }
807
 
808
- # Расчёт азота (оставляем без изменений)
809
  total_parts = NO3_RATIO + NH4_RATIO
810
  self.target_profile['N (NO3-)'] = TOTAL_NITROGEN * (NO3_RATIO / total_parts)
811
  self.target_profile['N (NH4+)'] = TOTAL_NITROGEN * (NH4_RATIO / total_parts)
@@ -815,7 +815,6 @@ class NutrientCalculator:
815
  }
816
 
817
  def _label(self, element):
818
- """Форматирование названий элементов для вывода"""
819
  labels = {
820
  'N (NO3-)': 'NO3',
821
  'N (NH4+)': 'NH4'
@@ -823,7 +822,6 @@ class NutrientCalculator:
823
  return labels.get(element, element)
824
 
825
  def _apply(self, fert_name, main_element, required_ppm):
826
- """Внесение удобрения"""
827
  if required_ppm <= 0:
828
  return
829
 
@@ -842,7 +840,7 @@ class NutrientCalculator:
842
  self.results[fert_name] = result
843
 
844
  self.results[fert_name]['граммы'] += grams
845
- self.results[fert_name]['миллиграммы'] = int(self.results[fert_name]['граммы'] * 1000)
846
 
847
  fert_ec = 0.0
848
  for element, percent in self.fertilizers[fert_name].items():
@@ -857,61 +855,59 @@ class NutrientCalculator:
857
  print(f"Ошибка: отсутствует элемент {str(e)} в удобрении {fert_name}")
858
  raise
859
 
860
- def _compensate_element(self, element: str, needed_ppm: float):
861
- """Компенсация дефицита элемента с учетом весов"""
862
- suitable_ferts = []
863
- for fert_key, fert_data in self.compensation_weights.items():
864
- fert_name = fert_data['fert']
865
- if fert_name in self.fertilizers and element in self.fertilizers[fert_name]:
866
- suitable_ferts.append({
 
 
 
 
 
 
867
  'name': fert_name,
868
- 'weight': fert_data['weight'],
869
- 'content': self.fertilizers[fert_name][element]
870
  })
871
-
872
- if not suitable_ferts:
873
- raise ValueError(f"Нет подходящих удобрений для элемента {element}")
874
 
875
- total_weight = sum(f['weight'] for f in suitable_ferts)
876
- for fert in suitable_ferts:
877
- share = fert['weight'] / total_weight
878
- ppm_to_apply = needed_ppm * share
879
- self._apply(fert['name'], element, ppm_to_apply)
880
 
881
- def _apply_k_sulfate(self):
882
- """Внесение калия сернокислого с учетом весов"""
883
- s_def = self.target_profile['S'] - self.actual_profile['S']
884
- if s_def > 0.1:
885
- self._compensate_element("S", s_def)
 
 
 
 
886
 
887
  def calculate(self):
888
- """Основной расчет"""
889
  try:
890
  # 1. Вносим магний
891
  self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
892
 
893
- # 2. Вносим кальций
894
- self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
895
 
896
  # 3. Вносим фосфор
897
  self._apply("Монофосфат калия", "P", self.target_profile['P'])
898
 
899
- # 4. Вносим аммонийный азот (логика не меняется)
900
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
901
 
902
- # 5. Компенсируем нитратный азот (логика не меняется)
903
- current_no3 = self.actual_profile['N (NO3-)']
904
- no3_needed = self.target_profile['N (NO3-)'] - current_no3
905
- if no3_needed > 0.1:
906
- self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
907
 
908
- # 6. Вносим серу и калий с учетом весов
909
- self._apply_k_sulfate()
910
 
911
- # 7. Компенсируем остаточный дефицит калия с учетом весов
912
- k_deficit = self.target_profile['K'] - self.actual_profile['K']
913
- if k_deficit > 0.1:
914
- self._compensate_element("K", k_deficit)
915
 
916
  return self.results
917
  except Exception as e:
@@ -919,11 +915,9 @@ class NutrientCalculator:
919
  raise
920
 
921
  def calculate_ec(self):
922
- """Расчет общей электропроводности"""
923
  return round(self.total_ec, 2)
924
 
925
  def print_report(self):
926
- """Вывод отчета"""
927
  try:
928
  print("\n" + "="*60)
929
  print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА (ИТОГО):")
@@ -971,11 +965,33 @@ class NutrientCalculator:
971
  raise
972
 
973
  if __name__ == "__main__":
974
- # Убедитесь, что эти константы определены
975
- TOTAL_NITROGEN = 155.0 # Примерное значение, замените на своё
976
- NO3_RATIO = 9.0 # Примерное значение, замените на своё
977
- NH4_RATIO = 1.0 # Примерное значение, замените на своё
978
- VOLUME_LITERS = 1.0 # Примерное значение, замените на своё
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
979
 
980
  try:
981
  calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)
 
798
  self.fertilizers = NUTRIENT_CONTENT_IN_FERTILIZERS
799
  self.total_ec = 0.0
800
 
801
+ # Инициализация весов компенсации
802
  self.compensation_weights = {
803
+ "Калий азотнокислый": {"weight": 0.5, "main_elements": ["K", "N (NO3-)"]},
804
+ "Кальциевая селитра": {"weight": 0.3, "main_elements": ["Ca", "N (NO3-)"]},
805
+ "Калий сернокислый": {"weight": 0.2, "main_elements": ["K", "S"]}
806
  }
807
 
808
+ # Расчёт азота
809
  total_parts = NO3_RATIO + NH4_RATIO
810
  self.target_profile['N (NO3-)'] = TOTAL_NITROGEN * (NO3_RATIO / total_parts)
811
  self.target_profile['N (NH4+)'] = TOTAL_NITROGEN * (NH4_RATIO / total_parts)
 
815
  }
816
 
817
  def _label(self, element):
 
818
  labels = {
819
  'N (NO3-)': 'NO3',
820
  'N (NH4+)': 'NH4'
 
822
  return labels.get(element, element)
823
 
824
  def _apply(self, fert_name, main_element, required_ppm):
 
825
  if required_ppm <= 0:
826
  return
827
 
 
840
  self.results[fert_name] = result
841
 
842
  self.results[fert_name]['граммы'] += grams
843
+ self.results[fert_name]['миллиграммы'] = int(grams * 1000)
844
 
845
  fert_ec = 0.0
846
  for element, percent in self.fertilizers[fert_name].items():
 
855
  print(f"Ошибка: отсутствует элемент {str(e)} в удобрении {fert_name}")
856
  raise
857
 
858
+ def _compensate_element(self, element):
859
+ """Улучшенная компенсация с приоритетами"""
860
+ needed = self.target_profile[element] - self.actual_profile[element]
861
+ if needed <= 0:
862
+ return
863
+
864
+ # Находим все удобрения, содержащие нужный элемент
865
+ candidates = []
866
+ for fert_name, fert_data in self.fertilizers.items():
867
+ if element in fert_data:
868
+ weight = next((w['weight'] for w in self.compensation_weights.values()
869
+ if w['fert'] == fert_name), 0.1)
870
+ candidates.append({
871
  'name': fert_name,
872
+ 'weight': weight,
873
+ 'content': fert_data[element]
874
  })
 
 
 
875
 
876
+ if not candidates:
877
+ raise ValueError(f"Нет удобрений для элемента {element}")
 
 
 
878
 
879
+ # Сортируем по весу (убывание)
880
+ candidates.sort(key=lambda x: x['weight'], reverse=True)
881
+ total_weight = sum(c['weight'] for c in candidates)
882
+
883
+ # Вносим пропорционально весам
884
+ for candidate in candidates:
885
+ share = candidate['weight'] / total_weight
886
+ ppm_to_apply = needed * share
887
+ self._apply(candidate['name'], element, ppm_to_apply)
888
 
889
  def calculate(self):
 
890
  try:
891
  # 1. Вносим магний
892
  self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
893
 
894
+ # 2. Вносим кальций через компенсацию
895
+ self._compensate_element("Ca")
896
 
897
  # 3. Вносим фосфор
898
  self._apply("Монофосфат калия", "P", self.target_profile['P'])
899
 
900
+ # 4. Вносим аммонийный азот
901
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
902
 
903
+ # 5. Компенсируем нитратный азот
904
+ self._compensate_element("N (NO3-)")
 
 
 
905
 
906
+ # 6. Компенсируем серу
907
+ self._compensate_element("S")
908
 
909
+ # 7. Компенсируем калий
910
+ self._compensate_element("K")
 
 
911
 
912
  return self.results
913
  except Exception as e:
 
915
  raise
916
 
917
  def calculate_ec(self):
 
918
  return round(self.total_ec, 2)
919
 
920
  def print_report(self):
 
921
  try:
922
  print("\n" + "="*60)
923
  print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА (ИТОГО):")
 
965
  raise
966
 
967
  if __name__ == "__main__":
968
+ # Константы (замените на свои значения)
969
+ TOTAL_NITROGEN = 125.0
970
+ NO3_RATIO = 8.25
971
+ NH4_RATIO = 1.0
972
+ VOLUME_LITERS = 100
973
+
974
+ # Убедитесь, что эти словари определены
975
+ BASE_PROFILE = {
976
+ 'P': 31.0, 'K': 210.0, 'Mg': 24.0,
977
+ 'Ca': 84.0, 'S': 56.439,
978
+ 'N (NO3-)': 0.0, 'N (NH4+)': 0.0
979
+ }
980
+
981
+ NUTRIENT_CONTENT_IN_FERTILIZERS = {
982
+ "Кальциевая селитра": {"N (NO3-)": 0.11863, "Ca": 0.16972},
983
+ "Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
984
+ "Калий сернокислый": {"K": 0.44874, "S": 0.18401},
985
+ "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
986
+ "Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
987
+ "Монофосфат калия": {"P": 0.218, "K": 0.275}
988
+ }
989
+
990
+ EC_COEFFICIENTS = {
991
+ 'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
992
+ 'Ca': 0.0016, 'S': 0.0014,
993
+ 'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
994
+ }
995
 
996
  try:
997
  calculator = NutrientCalculator(volume_liters=VOLUME_LITERS)