DmitrMakeev commited on
Commit
01d3120
·
verified ·
1 Parent(s): a8e969d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -27
app.py CHANGED
@@ -683,10 +683,13 @@ def view_image():
683
 
684
 
685
 
 
 
686
  # Константы для расчёта
687
  TOTAL_NITROGEN = 220.871 # ppm
688
- N_RATIO = (5, 1) # Соотношение NO3:NH4
689
- VOLUME_LITERS = 10 # Объём раствора
 
690
 
691
  # Базовый профиль (без азота)
692
  BASE_PROFILE = {
@@ -733,23 +736,23 @@ class NutrientCalculator:
733
  self.total_ppm = 0
734
  self.calculated_profile = {}
735
 
736
- def calculate_nitrogen(self, total_n, n_ratio):
737
- """Расчёт распределения азота по формам"""
738
- total_parts = n_ratio[0] + n_ratio[1]
739
- no3 = total_n * (n_ratio[0] / total_parts)
740
- nh4 = total_n * (n_ratio[1] / total_parts)
741
 
742
  self.calculated_profile = {
743
- 'N (NO3-)': round(no3, 1),
744
- 'N (NH4+)': round(nh4, 1),
745
  **BASE_PROFILE
746
  }
747
  return self.calculated_profile
748
 
749
- def calculate(self, total_n, n_ratio):
750
  """Основной расчёт питательного раствора"""
751
  # Сначала рассчитываем азот
752
- profile = self.calculate_nitrogen(total_n, n_ratio)
753
  self.final_profile = profile.copy()
754
  self.total_ppm = total_n + sum(BASE_PROFILE.values())
755
 
@@ -780,7 +783,7 @@ class NutrientCalculator:
780
  self._apply_fertilizer(
781
  "Сульфат магния",
782
  grams,
783
- {'внесет S': round(added_s, 1)}
784
  )
785
  self.final_profile['Mg'] = 0
786
 
@@ -791,7 +794,11 @@ class NutrientCalculator:
791
  added_n = grams * fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
792
 
793
  self.final_profile['N (NO3-)'] -= added_n
794
- self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
 
 
 
 
795
  self.final_profile['Ca'] = 0
796
 
797
  def _apply_mkp(self):
@@ -801,7 +808,11 @@ class NutrientCalculator:
801
  added_k = grams * fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
802
 
803
  self.final_profile['K'] -= added_k
804
- self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
 
 
 
 
805
  self.final_profile['P'] = 0
806
 
807
  def _apply_potassium_fertilizers(self):
@@ -823,8 +834,8 @@ class NutrientCalculator:
823
  added_s = s_deficit
824
 
825
  self._apply_fertilizer("Калий сернокислый", k2so4_grams, {
826
- 'внесет K': round(added_k, 1),
827
- 'внесет S': round(added_s, 1)
828
  })
829
  self.final_profile['K'] -= added_k
830
  self.final_profile['S'] -= added_s
@@ -834,7 +845,11 @@ class NutrientCalculator:
834
  kno3_grams = (k_need * self.volume) / (fertilizers_db["Калий азотнокислый"]["K"] * 1000)
835
  added_n = kno3_grams * fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
836
 
837
- self._apply_fertilizer("Калий азотнокислый", kno3_grams, {'внесет NO3': round(added_n, 1)})
 
 
 
 
838
  self.final_profile['K'] = 0
839
  self.final_profile['N (NO3-)'] -= added_n
840
 
@@ -847,12 +862,16 @@ class NutrientCalculator:
847
  added_n = grams * fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
848
 
849
  self.final_profile['N (NO3-)'] -= added_n
850
- self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
 
 
 
 
851
  self.final_profile['N (NH4+)'] = 0
852
 
853
  def calculate_ec(self):
854
  """Расчёт электропроводимости"""
855
- return round(self.total_ppm / 700, 2)
856
 
857
  def print_report(self):
858
  """Вывод результатов расчёта"""
@@ -860,8 +879,10 @@ class NutrientCalculator:
860
  print("\n" + "="*60)
861
  print("РАСЧЁТНЫЙ ПРОФИЛЬ (после расчёта азота):")
862
  print("="*60)
 
 
863
  profile_table = [
864
- [element, value]
865
  for element, value in self.calculated_profile.items()
866
  ]
867
  print(tabulate(profile_table, headers=["Элемент", "Концентрация ppm"]))
@@ -870,20 +891,20 @@ class NutrientCalculator:
870
  print("\n" + "="*60)
871
  print(f"РЕЗУЛЬТАТЫ РАСЧЁТА ДЛЯ {self.volume} ЛИТРОВ")
872
  print("="*60)
873
- print(f"Общая концентрация: {self.total_ppm} ppm")
874
  print(f"EC: {self.calculate_ec()} mS/cm")
875
 
876
  print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
877
  fert_table = []
878
  for fert, data in self.results.items():
879
  details = [
880
- f"+{k}: {v} ppm"
881
  for k, v in data.items()
882
  if k.startswith('внесет')
883
  ]
884
  fert_table.append([
885
  fert,
886
- f"{data['граммы']} г",
887
  f"{data['миллиграммы']} мг",
888
  "\n".join(details)
889
  ])
@@ -892,20 +913,24 @@ class NutrientCalculator:
892
 
893
  print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
894
  deficit = {
895
- k: round(v, 1)
896
  for k, v in self.final_profile.items()
897
- if v > 0.1
898
  }
899
  if deficit:
900
  for el, val in deficit.items():
901
- print(f" {el}: {val} ppm")
902
  else:
903
  print(" Все элементы покрыты полностью")
904
 
905
  # Пример использования
906
  if __name__ == "__main__":
 
 
 
 
907
  calc = NutrientCalculator(volume_liters=VOLUME_LITERS)
908
- calc.calculate(TOTAL_NITROGEN, N_RATIO)
909
  calc.print_report()
910
 
911
 
 
683
 
684
 
685
 
686
+ from tabulate import tabulate
687
+
688
  # Константы для расчёта
689
  TOTAL_NITROGEN = 220.871 # ppm
690
+ NO3_RATIO = 5.00 # Доля нитратного азота (можно задавать 1.23, 5.67 и т.д.)
691
+ NH4_RATIO = 1.00 # Доля аммонийного азота
692
+ VOLUME_LITERS = 10 # Объём раствора
693
 
694
  # Базовый профиль (без азота)
695
  BASE_PROFILE = {
 
736
  self.total_ppm = 0
737
  self.calculated_profile = {}
738
 
739
+ def calculate_nitrogen(self, total_n, no3_ratio, nh4_ratio):
740
+ """Расчёт распределения азота по формам с точными соотношениями"""
741
+ total_parts = no3_ratio + nh4_ratio
742
+ no3 = total_n * (no3_ratio / total_parts)
743
+ nh4 = total_n * (nh4_ratio / total_parts)
744
 
745
  self.calculated_profile = {
746
+ 'N (NO3-)': round(no3, 2),
747
+ 'N (NH4+)': round(nh4, 2),
748
  **BASE_PROFILE
749
  }
750
  return self.calculated_profile
751
 
752
+ def calculate(self, total_n, no3_ratio, nh4_ratio):
753
  """Основной расчёт питательного раствора"""
754
  # Сначала рассчитываем азот
755
+ profile = self.calculate_nitrogen(total_n, no3_ratio, nh4_ratio)
756
  self.final_profile = profile.copy()
757
  self.total_ppm = total_n + sum(BASE_PROFILE.values())
758
 
 
783
  self._apply_fertilizer(
784
  "Сульфат магния",
785
  grams,
786
+ {'внесет S': round(added_s, 2)}
787
  )
788
  self.final_profile['Mg'] = 0
789
 
 
794
  added_n = grams * fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
795
 
796
  self.final_profile['N (NO3-)'] -= added_n
797
+ self._apply_fertilizer(
798
+ "Кальциевая селитра",
799
+ grams,
800
+ {'внесет NO3': round(added_n, 2)}
801
+ )
802
  self.final_profile['Ca'] = 0
803
 
804
  def _apply_mkp(self):
 
808
  added_k = grams * fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
809
 
810
  self.final_profile['K'] -= added_k
811
+ self._apply_fertilizer(
812
+ "Монофосфат калия",
813
+ grams,
814
+ {'внесет K': round(added_k, 2)}
815
+ )
816
  self.final_profile['P'] = 0
817
 
818
  def _apply_potassium_fertilizers(self):
 
834
  added_s = s_deficit
835
 
836
  self._apply_fertilizer("Калий сернокислый", k2so4_grams, {
837
+ 'внесет K': round(added_k, 2),
838
+ 'внесет S': round(added_s, 2)
839
  })
840
  self.final_profile['K'] -= added_k
841
  self.final_profile['S'] -= added_s
 
845
  kno3_grams = (k_need * self.volume) / (fertilizers_db["Калий азотнокислый"]["K"] * 1000)
846
  added_n = kno3_grams * fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
847
 
848
+ self._apply_fertilizer(
849
+ "Калий азотнокислый",
850
+ kno3_grams,
851
+ {'внесет NO3': round(added_n, 2)}
852
+ )
853
  self.final_profile['K'] = 0
854
  self.final_profile['N (NO3-)'] -= added_n
855
 
 
862
  added_n = grams * fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
863
 
864
  self.final_profile['N (NO3-)'] -= added_n
865
+ self._apply_fertilizer(
866
+ "Аммоний азотнокислый",
867
+ grams,
868
+ {'внесет NO3': round(added_n, 2)}
869
+ )
870
  self.final_profile['N (NH4+)'] = 0
871
 
872
  def calculate_ec(self):
873
  """Расчёт электропроводимости"""
874
+ return round(self.total_ppm / 700, 3)
875
 
876
  def print_report(self):
877
  """Вывод результатов расчёта"""
 
879
  print("\n" + "="*60)
880
  print("РАСЧЁТНЫЙ ПРОФИЛЬ (после расчёта азота):")
881
  print("="*60)
882
+ print(f"Соотношение NO3:NH4 = {NO3_RATIO:.2f}:{NH4_RATIO:.2f}")
883
+
884
  profile_table = [
885
+ [element, f"{value:.2f}"]
886
  for element, value in self.calculated_profile.items()
887
  ]
888
  print(tabulate(profile_table, headers=["Элемент", "Концентрация ppm"]))
 
891
  print("\n" + "="*60)
892
  print(f"РЕЗУЛЬТАТЫ РАСЧЁТА ДЛЯ {self.volume} ЛИТРОВ")
893
  print("="*60)
894
+ print(f"Общая концентрация: {self.total_ppm:.2f} ppm")
895
  print(f"EC: {self.calculate_ec()} mS/cm")
896
 
897
  print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
898
  fert_table = []
899
  for fert, data in self.results.items():
900
  details = [
901
+ f"+{k}: {v:.2f} ppm"
902
  for k, v in data.items()
903
  if k.startswith('внесет')
904
  ]
905
  fert_table.append([
906
  fert,
907
+ f"{data['граммы']:.3f} г",
908
  f"{data['миллиграммы']} мг",
909
  "\n".join(details)
910
  ])
 
913
 
914
  print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
915
  deficit = {
916
+ k: round(v, 2)
917
  for k, v in self.final_profile.items()
918
+ if v > 0.01 # Более точный порог
919
  }
920
  if deficit:
921
  for el, val in deficit.items():
922
+ print(f" {el}: {val:.2f} ppm")
923
  else:
924
  print(" Все элементы покрыты полностью")
925
 
926
  # Пример использования
927
  if __name__ == "__main__":
928
+ # Можно легко менять соотношения:
929
+ # NO3_RATIO = 1.23
930
+ # NH4_RATIO = 0.77
931
+
932
  calc = NutrientCalculator(volume_liters=VOLUME_LITERS)
933
+ calc.calculate(TOTAL_NITROGEN, NO3_RATIO, NH4_RATIO)
934
  calc.print_report()
935
 
936