DmitrMakeev commited on
Commit
d5710ba
·
verified ·
1 Parent(s): c2eb51b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +73 -34
app.py CHANGED
@@ -712,11 +712,14 @@ EC_COEFFICIENTS = {
712
  'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
713
  }
714
 
715
- # Целевые значения
716
  BASE_PROFILE = {
717
- 'P': 31.000, 'K': 210.000, 'Mg': 24.000,
718
- 'Ca': 84.000, 'S': 56.439,
719
- 'N (NO3-)': 0, 'N (NH4+)': 0
 
 
 
 
720
  }
721
 
722
  NUTRIENT_CONTENT_IN_FERTILIZERS = {
@@ -726,9 +729,20 @@ NUTRIENT_CONTENT_IN_FERTILIZERS = {
726
  "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
727
  "Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
728
  "Монофосфат калия": {"P": 0.218, "K": 0.275},
729
- "Сульфат кальция": {"Ca": 0.23, "S": 0.186} # Новый элемент
730
  }
731
 
 
 
 
 
 
 
 
 
 
 
 
732
  class NutrientCalculator:
733
  def __init__(self, volume_liters=1.0):
734
  self.volume = volume_liters
@@ -749,6 +763,17 @@ class NutrientCalculator:
749
  "NH4+": self.target_profile['N (NH4+)']
750
  }
751
 
 
 
 
 
 
 
 
 
 
 
 
752
  def _label(self, element):
753
  """Форматирование названий элементов для вывода"""
754
  labels = {
@@ -759,43 +784,48 @@ class NutrientCalculator:
759
 
760
  def calculate(self):
761
  try:
762
- # 1. Вносим сульфат кальция для Ca
763
- ca_needed = self.target_profile['Ca'] - self.actual_profile['Ca']
764
- if ca_needed > 0.1:
765
- self._apply("Сульфат кальция", "Ca", ca_needed)
766
-
767
- # 2. Вносим кальциевую селитру для Ca и NO3
768
- ca_needed_after_sulfate = self.target_profile['Ca'] - self.actual_profile['Ca']
769
- if ca_needed_after_sulfate > 0.1:
770
- self._apply("Кальциевая селитра", "Ca", ca_needed_after_sulfate)
771
-
772
- # 3. Вносим остальные элементы
773
- self._apply("Сульфат магния", "Mg", self.target_profile['Mg'])
774
- self._apply("Монофосфат калия", "P", self.target_profile['P'])
775
- self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
776
-
777
- # 4. Компенсируем NO3
778
- current_no3 = self.actual_profile['N (NO3-)']
779
- no3_needed = self.target_profile['N (NO3-)'] - current_no3
780
-
781
- if no3_needed > 0.1:
782
- self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
783
 
784
- # 5. Компенсируем K через сульфат калия
785
- k_deficit = self.target_profile['K'] - self.actual_profile['K']
786
- if k_deficit > 0.1:
787
- self._apply("Калий сернокислый", "K", k_deficit)
788
 
789
- # 6. Компенсируем S через сульфат калия
790
- s_deficit = self.target_profile['S'] - self.actual_profile['S']
791
- if s_deficit > 0.1:
792
- self._apply("Калий сернокислый", "S", s_deficit)
793
 
794
  return self.results
795
  except Exception as e:
796
  print(f"Ошибка при расчёте: {str(e)}")
797
  raise
798
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
799
  def _apply(self, fert_name, main_element, required_ppm):
800
  if required_ppm <= 0:
801
  return
@@ -833,6 +863,15 @@ class NutrientCalculator:
833
  def calculate_ec(self):
834
  return round(self.total_ec, 2)
835
 
 
 
 
 
 
 
 
 
 
836
  def print_initial_nitrogen_report(self):
837
  try:
838
  print("Исходный расчёт азота:")
 
712
  'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
713
  }
714
 
 
715
  BASE_PROFILE = {
716
+ "P": 60,
717
+ "K": 300,
718
+ "Mg": 70,
719
+ "Ca": 150,
720
+ "S": 120,
721
+ "N (NO3-)": 175,
722
+ "N (NH4+)": 15
723
  }
724
 
725
  NUTRIENT_CONTENT_IN_FERTILIZERS = {
 
729
  "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
730
  "Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
731
  "Монофосфат калия": {"P": 0.218, "K": 0.275},
732
+ "Сульфат кальция": {"Ca": 0.23, "S": 0.186}
733
  }
734
 
735
+ EC_COEFFICIENTS = {
736
+ 'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
737
+ 'Ca': 0.0016, 'S': 0.0014,
738
+ 'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
739
+ }
740
+
741
+ # Глобальные константы для азота
742
+ TOTAL_NITROGEN = 190 # Общее количество азота
743
+ NO3_RATIO = 7 # Соотношение NO3:NH4
744
+ NH4_RATIO = 1
745
+
746
  class NutrientCalculator:
747
  def __init__(self, volume_liters=1.0):
748
  self.volume = volume_liters
 
763
  "NH4+": self.target_profile['N (NH4+)']
764
  }
765
 
766
+ # Веса компенсации
767
+ self.compensation_weights = {
768
+ "Ca": {"weight": 0.3, "fert": "Сульфат кальция", "main_element": "Ca"},
769
+ "K": {"weight": 0.2, "fert": "Калий азотнокислый", "main_element": "K"},
770
+ "Mg": {"weight": 0.2, "fert": "Сульфат магния", "main_element": "Mg"},
771
+ "P": {"weight": 0.1, "fert": "Монофосфат калия", "main_element": "P"},
772
+ "S": {"weight": 0.1, "fert": "Калий сернокислый", "main_element": "S"},
773
+ "N (NO3-)": {"weight": 0.05, "fert": "Калий азотнокислый", "main_element": "N (NO3-)"},
774
+ "N (NH4+)": {"weight": 0.05, "fert": "Аммоний азотнокислый", "main_element": "N (NH4+)"}
775
+ }
776
+
777
  def _label(self, element):
778
  """Форматирование названий элементов для вывода"""
779
  labels = {
 
784
 
785
  def calculate(self):
786
  try:
787
+ # Первый проход: компенсация основных элементов
788
+ self._compensate_main_elements()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
789
 
790
+ # Второй проход: компенсация азота
791
+ self._compensate_nitrogen()
 
 
792
 
793
+ # Третий проход: компенсация второстепенных элементов
794
+ self._compensate_secondary_elements()
 
 
795
 
796
  return self.results
797
  except Exception as e:
798
  print(f"Ошибка при расчёте: {str(e)}")
799
  raise
800
 
801
+ def _compensate_main_elements(self):
802
+ """Компенсация основных элементов (Ca, Mg, P)"""
803
+ for element, weight_data in self.compensation_weights.items():
804
+ if element in ["Ca", "Mg", "P"]:
805
+ fert_name = weight_data["fert"]
806
+ main_element = weight_data["main_element"]
807
+ required_ppm = self.target_profile[main_element] - self.actual_profile[main_element]
808
+ if required_ppm > 0.1:
809
+ self._apply(fert_name, main_element, required_ppm)
810
+
811
+ def _compensate_nitrogen(self):
812
+ """Компенсация азота (NO3-, NH4+)"""
813
+ for nitrogen_type in ["N (NO3-)", "N (NH4+)"]:
814
+ required_ppm = self.target_profile[nitrogen_type] - self.actual_profile[nitrogen_type]
815
+ if required_ppm > 0.1:
816
+ fert_name = self.compensation_weights[nitrogen_type]["fert"]
817
+ self._apply(fert_name, nitrogen_type, required_ppm)
818
+
819
+ def _compensate_secondary_elements(self):
820
+ """Компенсация второстепенных элементов (K, S)"""
821
+ for element, weight_data in self.compensation_weights.items():
822
+ if element in ["K", "S"]:
823
+ fert_name = weight_data["fert"]
824
+ main_element = weight_data["main_element"]
825
+ required_ppm = self.target_profile[main_element] - self.actual_profile[main_element]
826
+ if required_ppm > 0.1:
827
+ self._apply(fert_name, main_element, required_ppm)
828
+
829
  def _apply(self, fert_name, main_element, required_ppm):
830
  if required_ppm <= 0:
831
  return
 
863
  def calculate_ec(self):
864
  return round(self.total_ec, 2)
865
 
866
+ def print_initial_nitrogen_report(self):
867
+ try:
868
+ print("Исходный расчёт азота:")
869
+ print(f" NO3-: {self.initial_n_profile['NO3-']} ppm")
870
+ print(f" NH4+: {self.initial_n_profile['NH4+']} ppm")
871
+ except Exception as e:
872
+ print(f"Ошибка при выводе отчёта: {str(e)}")
873
+ raise
874
+
875
  def print_initial_nitrogen_report(self):
876
  try:
877
  print("Исходный расчёт азота:")