DmitrMakeev commited on
Commit
76d85f7
·
verified ·
1 Parent(s): aa27e8a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +92 -35
app.py CHANGED
@@ -690,6 +690,74 @@ def nutri_call():
690
 
691
 
692
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
693
  from tabulate import tabulate
694
 
695
  # Константы
@@ -767,11 +835,9 @@ class NutrientCalculator:
767
 
768
  # Веса компенсации для элементов (кроме азотов)
769
  self.element_compensation_weights = {
770
- "POTASSIUM_SULFATE": {"weight": -0.18, "fert": "Калий сернокислый", "main_element": "K"},
771
- "MAGNESIUM_SULFATE": {"weight": -0.1, "fert": "Сульфат магния", "main_element": "Mg"},
772
- "MONOPOTASSIUM_PHOSPHATE": {"weight": -0.14, "fert": "Монофосфат калия", "main_element": "P"},
773
- "CALCIUM_NITRATE": {"weight": 0.25, "fert": "Кальциевая селитра", "main_element": "Ca"},
774
- "CALCIUM_NITRATE_NO3": {"weight": 0.25, "fert": "Кальциевая селитра", "main_element": "NO3"}
775
  }
776
 
777
  # Расчёт азота
@@ -792,8 +858,8 @@ class NutrientCalculator:
792
  # Вносим магний через компенсацию
793
  self._compensate_element("Mg")
794
 
795
- # Вносим кальций через компенсацию
796
- self._compensate_element("Ca")
797
 
798
  # Вносим фосфор через компенсацию
799
  self._compensate_element("P")
@@ -801,8 +867,11 @@ class NutrientCalculator:
801
  # Вносим аммонийный азот напрямую
802
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
803
 
804
- # Компенсируем нитратный азот через компенсацию
805
- self._compensate_element("N (NO3-)")
 
 
 
806
 
807
  # Компенсируем серу через компенсацию
808
  self._compensate_element("S")
@@ -849,48 +918,30 @@ class NutrientCalculator:
849
  print(f"Ошибка: отсутствует элемент {str(e)} в удобрении {fert_name}")
850
  raise
851
 
852
-
853
  def _compensate_element(self, element):
854
  needed = self.target_profile[element] - self.actual_profile.get(element, 0)
855
  if needed <= 0:
856
  return
857
 
858
  candidates = []
859
-
860
- # Для азотных соединений особый случай
861
- if element in ['N (NH4+)', 'N (NO3-)']:
862
- # Здесь ваша текущая логика для NH4 и NO3
863
- pass
864
- else:
865
- # Стандартная компенсация для других элементов
866
- for weight_key, weight_data in self.element_compensation_weights.items():
867
- fert_name = weight_data["fert"]
868
- main_element = weight_data["main_element"]
869
-
870
- # Проверяем, что удобрение содержит нужный элемент
871
- if main_element == element and element in self.fertilizers.get(fert_name, {}):
872
- candidates.append({
873
- 'name': fert_name,
874
- 'weight': weight_data["weight"],
875
- 'content': self.fertilizers[fert_name][element]
876
- })
877
 
878
  if not candidates:
879
  raise ValueError(f"Нет удобрений для элемента {element}")
880
 
881
- # Для отрицательных весов нужно инвертировать знак needed
882
- if any(c['weight'] < 0 for c in candidates):
883
- needed = -needed
884
-
885
  total_weight = sum(c['weight'] for c in candidates)
886
  for candidate in candidates:
887
  share = candidate['weight'] / total_weight
888
  ppm_to_apply = needed * share
889
  self._apply(candidate['name'], element, ppm_to_apply)
890
 
891
-
892
-
893
-
894
  def calculate_ec(self):
895
  return round(self.total_ec, 2)
896
 
@@ -1006,6 +1057,12 @@ def handle_calculation():
1006
 
1007
 
1008
 
 
 
 
 
 
 
1009
 
1010
 
1011
 
 
690
 
691
 
692
 
693
+ from tabulate import tabulate
694
+
695
+ # Константы
696
+ TOTAL_NITROGEN = 125.000
697
+ NO3_RATIO = 8.25
698
+ NH4_RATIO = 1.00
699
+ VOLUME_LITERS = 100
700
+
701
+ # Коэффициенты электропроводности
702
+ EC_COEFFICIENTS = {
703
+ 'P': 0.0012, 'K': 0.0018, 'Mg': 0.0015,
704
+ 'Ca': 0.0016, 'S': 0.0014,
705
+ 'N (NO3-)': 0.0017, 'N (NH4+)': 0.0019
706
+ }
707
+
708
+ # Целевые значения
709
+ BASE_PROFILE = {
710
+ 'P': 31.000, 'K': 210.000, 'Mg': 24.000,
711
+ 'Ca': 84.000, 'S': 56.439,
712
+ 'N (NO3-)': 0, 'N (NH4+)': 0
713
+ }
714
+
715
+ NUTRIENT_CONTENT_IN_FERTILIZERS = {
716
+ "Кальциевая селитра": {"N (NO3-)": 0.11863, "Ca": 0.16972},
717
+ "Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
718
+ "Калий сернокислый": {"K": 0.44874, "S": 0.18401},
719
+ "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
720
+ "Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
721
+ "Монофосфат калия": {"P": 0.218, "K": 0.275}
722
+ }
723
+
724
+
725
+
726
+ from tabulate import tabulate
727
+
728
+ # Константы
729
+ TOTAL_NITROGEN = 125.000
730
+ NO3_RATIO = 8.25
731
+ NH4_RATIO = 1.00
732
+ VOLUME_LITERS = 100
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
+ BASE_PROFILE = {
743
+ 'P': 31.000, 'K': 210.000, 'Mg': 24.000,
744
+ 'Ca': 84.000, 'S': 56.439,
745
+ 'N (NO3-)': 0, 'N (NH4+)': 0
746
+ }
747
+
748
+ NUTRIENT_CONTENT_IN_FERTILIZERS = {
749
+ "Кальциевая селитра": {"N (NO3-)": 0.11863, "Ca": 0.16972},
750
+ "Калий азотнокислый": {"N (NO3-)": 0.136, "K": 0.382},
751
+ "Калий сернокислый": {"K": 0.44874, "S": 0.18401},
752
+ "Аммоний азотнокислый": {"N (NO3-)": 0.17499, "N (NH4+)": 0.17499},
753
+ "Сульфат магния": {"Mg": 0.09861, "S": 0.13010},
754
+ "Монофосфат калия": {"P": 0.218, "K": 0.275}
755
+ }
756
+
757
+
758
+
759
+
760
+
761
  from tabulate import tabulate
762
 
763
  # Константы
 
835
 
836
  # Веса компенсации для элементов (кроме азотов)
837
  self.element_compensation_weights = {
838
+ "POTASSIUM_SULFATE": {"weight": -0.18, "fert": "Калий сернокислый", "main_element": "K"},
839
+ "MAGNESIUM_SULFATE": {"weight": -0.1, "fert": "Сульфат магния", "main_element": "Mg"},
840
+ "MONOPOTASSIUM_PHOSPHATE": {"weight": -0.14, "fert": "Монофосфат калия", "main_element": "P"}
 
 
841
  }
842
 
843
  # Расчёт азота
 
858
  # Вносим магний через компенсацию
859
  self._compensate_element("Mg")
860
 
861
+ # Вносим кальций напрямую
862
+ self._apply("Кальциевая селитра", "Ca", self.target_profile['Ca'])
863
 
864
  # Вносим фосфор через компенсацию
865
  self._compensate_element("P")
 
867
  # Вносим аммонийный азот напрямую
868
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
869
 
870
+ # Компенсируем нитратный азот напрямую
871
+ current_no3 = self.actual_profile['N (NO3-)']
872
+ no3_needed = self.target_profile['N (NO3-)'] - current_no3
873
+ if no3_needed > 0.1:
874
+ self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
875
 
876
  # Компенсируем серу через компенсацию
877
  self._compensate_element("S")
 
918
  print(f"Ошибка: отсутствует элемент {str(e)} в удобрении {fert_name}")
919
  raise
920
 
 
921
  def _compensate_element(self, element):
922
  needed = self.target_profile[element] - self.actual_profile.get(element, 0)
923
  if needed <= 0:
924
  return
925
 
926
  candidates = []
927
+ for weight_key, weight_data in self.element_compensation_weights.items():
928
+ fert_name = weight_data["fert"]
929
+ if element in self.fertilizers.get(fert_name, {}):
930
+ candidates.append({
931
+ 'name': fert_name,
932
+ 'weight': weight_data["weight"],
933
+ 'content': self.fertilizers[fert_name][element]
934
+ })
 
 
 
 
 
 
 
 
 
 
935
 
936
  if not candidates:
937
  raise ValueError(f"Нет удобрений для элемента {element}")
938
 
 
 
 
 
939
  total_weight = sum(c['weight'] for c in candidates)
940
  for candidate in candidates:
941
  share = candidate['weight'] / total_weight
942
  ppm_to_apply = needed * share
943
  self._apply(candidate['name'], element, ppm_to_apply)
944
 
 
 
 
945
  def calculate_ec(self):
946
  return round(self.total_ec, 2)
947
 
 
1057
 
1058
 
1059
 
1060
+
1061
+
1062
+
1063
+
1064
+
1065
+
1066
 
1067
 
1068