DmitrMakeev commited on
Commit
054f0f4
·
verified ·
1 Parent(s): d623950

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +60 -99
app.py CHANGED
@@ -681,14 +681,15 @@ def view_image():
681
 
682
 
683
 
684
- from tabulate import tabulate
685
 
686
- # Заданные значения
 
687
  TOTAL_NITROGEN = 220 # ppm
688
- N_RATIO = (10, 5) # Пример: NO3:NH4 = 10:5
689
- VOLUME_LITERS = 10 # Объём раствора
690
 
691
- TOMATO_PROFILE = {
 
692
  'P': 50,
693
  'K': 350,
694
  'Mg': 50,
@@ -696,6 +697,7 @@ TOMATO_PROFILE = {
696
  'S': 100
697
  }
698
 
 
699
  fertilizers_db = {
700
  "Кальциевая селитра": {
701
  "N (NO3-)": 0.118,
@@ -723,29 +725,33 @@ fertilizers_db = {
723
  }
724
  }
725
 
726
-
727
  class NutrientCalculator:
728
  def __init__(self, volume_liters=1.0):
729
  self.volume = volume_liters
730
  self.results = {}
731
  self.final_profile = {}
732
  self.total_ppm = 0
733
- self.initial_n_profile = {}
734
 
735
- def calculate(self, base_profile, total_n, n_ratio):
 
736
  total_parts = n_ratio[0] + n_ratio[1]
737
  no3 = total_n * (n_ratio[0] / total_parts)
738
  nh4 = total_n * (n_ratio[1] / total_parts)
739
-
740
- self.initial_n_profile = {
741
  'N (NO3-)': round(no3, 1),
742
- 'N (NH4+)': round(nh4, 1)
 
743
  }
 
744
 
745
- self.final_profile = base_profile.copy()
746
- self.final_profile['N (NO3-)'] = no3
747
- self.final_profile['N (NH4+)'] = nh4
748
- self.total_ppm = total_n + sum(base_profile.values())
 
 
749
 
750
  # Расчёт удобрений
751
  self._apply_magnesium_sulfate()
@@ -756,104 +762,51 @@ class NutrientCalculator:
756
  return self.results
757
 
758
  def _apply_fertilizer(self, fert_name, grams, additions):
 
759
  self.results[fert_name] = {
760
  'граммы': round(grams, 3),
761
  'миллиграммы': int(grams * 1000),
 
762
  }
763
- self.results[fert_name].update(additions)
764
 
765
  def _apply_magnesium_sulfate(self):
 
766
  mg_need = self.final_profile['Mg']
767
  mg_content = fertilizers_db["Сульфат магния"]["Mg"]
768
  grams = (mg_need * self.volume) / (mg_content * 1000)
769
  added_s = grams * fertilizers_db["Сульфат магния"]["S"] * 1000 / self.volume
770
 
771
  self.final_profile['S'] -= added_s
772
- self._apply_fertilizer("Сульфат магния", grams, {'внесет S': round(added_s, 1)})
 
 
 
 
773
  self.final_profile['Mg'] = 0
774
 
775
- def _apply_calcium_nitrate(self):
776
- ca_need = self.final_profile['Ca']
777
- ca_content = fertilizers_db["Кальциевая селитра"]["Ca"]
778
- grams = (ca_need * self.volume) / (ca_content * 1000)
779
- added_n = grams * fertilizers_db["Кальциевая селитра"]["N (NO3-)"] * 1000 / self.volume
780
-
781
- self.final_profile['N (NO3-)'] -= added_n
782
- self._apply_fertilizer("Кальциевая селитра", grams, {'внесет NO3': round(added_n, 1)})
783
- self.final_profile['Ca'] = 0
784
-
785
- def _apply_mkp(self):
786
- p_need = self.final_profile['P']
787
- p_content = fertilizers_db["Монофосфат калия"]["P"]
788
- grams = (p_need * self.volume) / (p_content * 1000)
789
- added_k = grams * fertilizers_db["Монофосфат калия"]["K"] * 1000 / self.volume
790
-
791
- self.final_profile['K'] -= added_k
792
- self._apply_fertilizer("Монофосфат калия", grams, {'внесет K': round(added_k, 1)})
793
- self.final_profile['P'] = 0
794
-
795
- def _apply_potassium_fertilizers(self):
796
- k_need = self.final_profile['K']
797
- if k_need <= 0:
798
- return
799
-
800
- s_deficit = max(0, self.final_profile['S'])
801
- if s_deficit > 0:
802
- s_content = fertilizers_db["Калий сернокислый"]["S"]
803
- k2so4_grams = (s_deficit * self.volume) / (s_content * 1000)
804
- added_k = k2so4_grams * fertilizers_db["Калий сернокислый"]["K"] * 1000 / self.volume
805
-
806
- if added_k > k_need:
807
- k2so4_grams = (k_need * self.volume) / (fertilizers_db["Калий сернокислый"]["K"] * 1000)
808
- added_k = k_need
809
- added_s = k2so4_grams * fertilizers_db["Калий сернокислый"]["S"] * 1000 / self.volume
810
- else:
811
- added_s = s_deficit
812
-
813
- self._apply_fertilizer("Калий сернокислый", k2so4_grams, {
814
- 'внесет K': round(added_k, 1),
815
- 'внесет S': round(added_s, 1)
816
- })
817
- self.final_profile['K'] -= added_k
818
- self.final_profile['S'] -= added_s
819
- k_need = self.final_profile['K']
820
-
821
- if k_need > 0:
822
- kno3_grams = (k_need * self.volume) / (fertilizers_db["Калий азотнокислый"]["K"] * 1000)
823
- added_n = kno3_grams * fertilizers_db["Калий азотнокислый"]["N (NO3-)"] * 1000 / self.volume
824
-
825
- self._apply_fertilizer("Калий азотнокислый", kno3_grams, {'внесет NO3': round(added_n, 1)})
826
- self.final_profile['K'] = 0
827
- self.final_profile['N (NO3-)'] -= added_n
828
-
829
- def _apply_ammonium_nitrate(self):
830
- nh4_need = self.final_profile['N (NH4+)']
831
- if nh4_need <= 0:
832
- return
833
- nh4_content = fertilizers_db["Аммоний азотнокислый"]["N (NH4+)"]
834
- grams = (nh4_need * self.volume) / (nh4_content * 1000)
835
- added_n = grams * fertilizers_db["Аммоний азотнокислый"]["N (NO3-)"] * 1000 / self.volume
836
-
837
- self.final_profile['N (NO3-)'] -= added_n
838
- self._apply_fertilizer("Аммоний азотнокислый", grams, {'внесет NO3': round(added_n, 1)})
839
- self.final_profile['N (NH4+)'] = 0
840
 
841
  def calculate_ec(self):
 
842
  return round(self.total_ppm / 700, 2)
843
 
844
  def print_report(self):
 
 
845
  print("\n" + "="*60)
846
- print("ПРОФИЛЬ ПИТАТЕЛЬНОГО РАСТВОРА (ИТОГО):")
847
  print("="*60)
848
- table = [[el, round(val, 1)] for el, val in self.final_profile.items()]
849
- print(tabulate(table, headers=["Элемент", "Остаток ppm"]))
850
-
851
- print("\nИсходный расчёт азота:")
852
- for form, value in self.initial_n_profile.items():
853
- print(f" {form}: {value} ppm")
854
-
855
  print("\n" + "="*60)
856
- print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
857
  print("="*60)
858
  print(f"Общая концентрация: {self.total_ppm} ppm")
859
  print(f"EC: {self.calculate_ec()} mS/cm")
@@ -861,28 +814,36 @@ class NutrientCalculator:
861
  print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
862
  fert_table = []
863
  for fert, data in self.results.items():
864
- details = [f"+{k}: {v} ppm" for k, v in data.items() if k.startswith('внесет')]
 
 
 
 
865
  fert_table.append([
866
  fert,
867
  f"{data['граммы']} г",
868
  f"{data['миллиграммы']} мг",
869
  "\n".join(details)
870
  ])
871
- print(tabulate(fert_table, headers=["Удобрение", "Граммы", "Миллиграммы", "Добавит"]))
872
-
 
873
  print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
874
- deficit = {k: v for k, v in self.final_profile.items() if v > 0.1}
 
 
 
 
875
  if deficit:
876
  for el, val in deficit.items():
877
- print(f" {el}: {round(val, 1)} ppm")
878
  else:
879
  print(" Все элементы покрыты полностью")
880
 
881
-
882
- # Зап��ск
883
  if __name__ == "__main__":
884
  calc = NutrientCalculator(volume_liters=VOLUME_LITERS)
885
- calc.calculate(TOMATO_PROFILE.copy(), TOTAL_NITROGEN, N_RATIO)
886
  calc.print_report()
887
 
888
 
 
681
 
682
 
683
 
 
684
 
685
+
686
+ # Константы для расчёта
687
  TOTAL_NITROGEN = 220 # ppm
688
+ N_RATIO = (10, 5) # Соотношение NO3:NH4
689
+ VOLUME_LITERS = 10 # Объём раствора
690
 
691
+ # Базовый профиль (без азота)
692
+ BASE_PROFILE = {
693
  'P': 50,
694
  'K': 350,
695
  'Mg': 50,
 
697
  'S': 100
698
  }
699
 
700
+ # База данных удобрений
701
  fertilizers_db = {
702
  "Кальциевая селитра": {
703
  "N (NO3-)": 0.118,
 
725
  }
726
  }
727
 
 
728
  class NutrientCalculator:
729
  def __init__(self, volume_liters=1.0):
730
  self.volume = volume_liters
731
  self.results = {}
732
  self.final_profile = {}
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
 
756
  # Расчёт удобрений
757
  self._apply_magnesium_sulfate()
 
762
  return self.results
763
 
764
  def _apply_fertilizer(self, fert_name, grams, additions):
765
+ """Добавление удобрения в результаты"""
766
  self.results[fert_name] = {
767
  'граммы': round(grams, 3),
768
  'миллиграммы': int(grams * 1000),
769
+ **additions
770
  }
 
771
 
772
  def _apply_magnesium_sulfate(self):
773
+ """Расчёт сульфата магния"""
774
  mg_need = self.final_profile['Mg']
775
  mg_content = fertilizers_db["Сульфат магния"]["Mg"]
776
  grams = (mg_need * self.volume) / (mg_content * 1000)
777
  added_s = grams * fertilizers_db["Сульфат магния"]["S"] * 1000 / self.volume
778
 
779
  self.final_profile['S'] -= added_s
780
+ self._apply_fertilizer(
781
+ "Сульфат магния",
782
+ grams,
783
+ {'внесет S': round(added_s, 1)}
784
+ )
785
  self.final_profile['Mg'] = 0
786
 
787
+ # Остальные методы _apply_* остаются без изменений
788
+ # (_apply_calcium_nitrate, _apply_mkp, _apply_potassium_fertilizers, _apply_ammonium_nitrate)
789
+ # ...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
790
 
791
  def calculate_ec(self):
792
+ """Расчёт электропроводимости"""
793
  return round(self.total_ppm / 700, 2)
794
 
795
  def print_report(self):
796
+ """Вывод результатов расчёта"""
797
+ # Выводим расчётный профиль после вычисления азота
798
  print("\n" + "="*60)
799
+ print("РАСЧЁТНЫЙ ПРОФИЛЬ (после расчёта азота):")
800
  print("="*60)
801
+ profile_table = [
802
+ [element, value]
803
+ for element, value in self.calculated_profile.items()
804
+ ]
805
+ print(tabulate(profile_table, headers=["Элемент", "Концентрация ppm"]))
806
+
807
+ # Выводим результаты расчёта удобрений
808
  print("\n" + "="*60)
809
+ print(f"РЕЗУЛЬТАТЫ РАСЧЁТА ДЛЯ {self.volume} ЛИТРОВ")
810
  print("="*60)
811
  print(f"Общая концентрация: {self.total_ppm} ppm")
812
  print(f"EC: {self.calculate_ec()} mS/cm")
 
814
  print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
815
  fert_table = []
816
  for fert, data in self.results.items():
817
+ details = [
818
+ f"+{k}: {v} ppm"
819
+ for k, v in data.items()
820
+ if k.startswith('внесет')
821
+ ]
822
  fert_table.append([
823
  fert,
824
  f"{data['граммы']} г",
825
  f"{data['миллиграммы']} мг",
826
  "\n".join(details)
827
  ])
828
+ print(tabulate(fert_table,
829
+ headers=["Удобрение", "Граммы", "Миллиграммы", "Добавит"]))
830
+
831
  print("\nОСТАТОЧНЫЙ ДЕФИЦИТ:")
832
+ deficit = {
833
+ k: round(v, 1)
834
+ for k, v in self.final_profile.items()
835
+ if v > 0.1
836
+ }
837
  if deficit:
838
  for el, val in deficit.items():
839
+ print(f" {el}: {val} ppm")
840
  else:
841
  print(" Все элементы покрыты полностью")
842
 
843
+ # Пример использования
 
844
  if __name__ == "__main__":
845
  calc = NutrientCalculator(volume_liters=VOLUME_LITERS)
846
+ calc.calculate(TOTAL_NITROGEN, N_RATIO)
847
  calc.print_report()
848
 
849