DmitrMakeev commited on
Commit
61f79d7
·
verified ·
1 Parent(s): 9c8cb3e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -106
app.py CHANGED
@@ -757,116 +757,92 @@ class HydroCalculator:
757
 
758
 
759
 
 
 
 
 
760
 
761
- # Создаём раствор на 10 литров
762
- calc = HydroCalculator(volume_liters=10)
763
-
764
- # Добавляем удобрения (название из базы + граммы)
765
- calc.add_fertilizer("Кальциевая селитра", 100) # 100 г
766
- calc.add_fertilizer("Сульфат магния", 50) # 50 г
767
-
768
- # Выводим отчёт
769
- calc.print_report()
770
-
771
-
772
-
773
-
774
- def optimize_manual(calculator, target_ppm, max_iter=100):
775
- """Грубый подбор масс удобрений под целевой состав."""
776
- current_ppm = calculator.calculate_ppm()
777
- fertilizers = calculator.fertilizers.copy()
778
-
779
- for _ in range(max_iter):
780
- adjusted = False
781
- for i, (name, grams) in enumerate(fertilizers):
782
- for element, target in target_ppm.items():
783
- current = current_ppm.get(element, 0)
784
- if current < target:
785
- # Увеличиваем массу удобрения, содержащего этот элемент
786
- if element in fertilizers_db[name]:
787
- fertilizers[i] = (name, grams * 1.05) # +5%
788
- adjusted = True
789
- if not adjusted:
790
- break
791
- calculator.fertilizers = fertilizers
792
- current_ppm = calculator.calculate_ppm()
793
-
794
- return calculator
795
-
796
-
797
-
798
-
799
-
800
- target = {"N (NO3-)": 150, "Ca": 200, "Mg": 50}
801
- calc = HydroCalculator(10)
802
- calc.add_fertilizer("Кальциевая селитра", 1) # Начальное приближение: 1 г
803
- calc.add_fertilizer("Сульфат магния", 1)
804
- optimize_manual(calc, target)
805
- calc.print_report()
806
-
807
-
808
-
809
-
810
-
811
-
812
-
813
-
814
- # Молярные массы (г/моль)
815
- MOLAR_MASSES = {
816
- 'N (NO3-)': 62.0, # NO3⁻
817
- 'N (NH4+)': 18.0, # NH4⁺
818
- 'K': 39.1,
819
- 'Ca': 40.1,
820
- 'Mg': 24.3,
821
- 'S': 96.1, # SO4²⁻
822
- 'P': 95.0, # H2PO4⁻
823
- }
824
-
825
- # Молярная проводимость (λ₀) в мкСм·см²/моль
826
- ION_CONDUCTIVITY = {
827
- 'N (NO3-)': 71.4,
828
- 'N (NH4+)': 73.5,
829
- 'K': 73.5,
830
- 'Ca': 119.0,
831
- 'Mg': 106.0,
832
- 'S': 160.0, # Вклад SO4²⁻
833
- 'P': 33.0, # Вклад H2PO4⁻
834
- }
835
-
836
-
837
-
838
- def _ppm_to_molarity(self, ppm, element):
839
- """Конвертирует ppm в моль/л."""
840
- if element not in MOLAR_MASSES:
841
- return 0.0
842
- return ppm / (MOLAR_MASSES[element] * 1000) # ppm = мг/л → моль/л
843
-
844
-
845
-
846
-
847
- def calculate_ec_exact(self):
848
- ppm = self.calculate_ppm()
849
- ec = 0.0 # мкСм/см
850
-
851
- for element, value in ppm.items():
852
- molarity = self._ppm_to_molarity(value, element)
853
- if element in ION_CONDUCTIVITY:
854
- ec += molarity * ION_CONDUCTIVITY[element]
855
-
856
- return ec / 1000 # Переводим в mS/cm
857
-
858
-
859
-
860
-
861
 
862
- calc = HydroCalculator(10)
863
- calc.add_fertilizer("Кальциевая селитра", 100) # Ca(NO3)2
864
- calc.add_fertilizer("Сульфат магния", 50) # MgSO4
 
 
 
865
 
866
- ppm = calc.calculate_ppm()
867
- ec = calc.calculate_ec_exact()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
868
 
869
- print(f"Точный EC: {ec:.2f} mS/cm")
 
 
 
 
 
 
 
 
 
 
 
 
870
 
871
 
872
 
 
757
 
758
 
759
 
760
+ class HydroCalculator:
761
+ def __init__(self, volume_liters=1.0):
762
+ self.volume = volume_liters
763
+ self.fertilizers = []
764
 
765
+ def add_fertilizer(self, name, grams):
766
+ if name not in fertilizers_db:
767
+ raise ValueError(f"Удобрение '{name}' не найдено в базе!")
768
+ self.fertilizers.append((name, grams))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
769
 
770
+ def calculate_ppm(self):
771
+ ppm = {}
772
+ for name, grams in self.fertilizers:
773
+ for element, ratio in fertilizers_db[name].items():
774
+ ppm[element] = ppm.get(element, 0) + (grams * ratio * 1000) / self.volume
775
+ return ppm
776
 
777
+ def calculate_ec(self):
778
+ """Расчёт EC по упрощённым коэффициентам"""
779
+ ppm = self.calculate_ppm()
780
+ ec = 0.0
781
+
782
+ EC_COEFFICIENTS = {
783
+ 'N (NO3-)': 0.6,
784
+ 'N (NH4+)': 0.4,
785
+ 'K': 0.7,
786
+ 'Ca': 0.75,
787
+ 'Mg': 0.6,
788
+ 'S': 0.3,
789
+ 'P': 0.1,
790
+ }
791
+
792
+ for element, value in ppm.items():
793
+ if element in EC_COEFFICIENTS:
794
+ ec += value * EC_COEFFICIENTS[element]
795
+
796
+ return ec / 1000 # Переводим в mS/cm
797
+
798
+ def calculate_ec_exact(self):
799
+ """Точный расчёт EC по молярной проводимости"""
800
+ # Молярные массы (г/моль)
801
+ MOLAR_MASSES = {
802
+ 'N (NO3-)': 62.0,
803
+ 'N (NH4+)': 18.0,
804
+ 'K': 39.1,
805
+ 'Ca': 40.1,
806
+ 'Mg': 24.3,
807
+ 'S': 96.1,
808
+ 'P': 95.0,
809
+ }
810
+
811
+ # Молярная проводимость (λ₀) в мкСм·см²/моль
812
+ ION_CONDUCTIVITY = {
813
+ 'N (NO3-)': 71.4,
814
+ 'N (NH4+)': 73.5,
815
+ 'K': 73.5,
816
+ 'Ca': 119.0,
817
+ 'Mg': 106.0,
818
+ 'S': 160.0,
819
+ 'P': 33.0,
820
+ }
821
+
822
+ ppm = self.calculate_ppm()
823
+ ec = 0.0 # мкСм/см
824
+
825
+ for element, value in ppm.items():
826
+ if element in MOLAR_MASSES:
827
+ molarity = value / (MOLAR_MASSES[element] * 1000) # ppm → моль/л
828
+ if element in ION_CONDUCTIVITY:
829
+ ec += molarity * ION_CONDUCTIVITY[element]
830
+
831
+ return ec / 1000 # Переводим в mS/cm
832
 
833
+ def print_report(self):
834
+ ppm = self.calculate_ppm()
835
+ ec_simple = self.calculate_ec()
836
+ ec_exact = self.calculate_ec_exact()
837
+
838
+ print("\nРезультаты расчёта:")
839
+ print("-" * 40)
840
+ for element, value in ppm.items():
841
+ print(f"{element}: {value:.2f} ppm")
842
+ print("-" * 40)
843
+ print(f"EC (упрощённый): {ec_simple:.2f} mS/cm")
844
+ print(f"EC (точный): {ec_exact:.2f} mS/cm")
845
+ print("-" * 40)
846
 
847
 
848