Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -704,6 +704,10 @@ def nutri_call():
|
|
| 704 |
|
| 705 |
|
| 706 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 707 |
|
| 708 |
|
| 709 |
|
|
@@ -711,8 +715,7 @@ def nutri_call():
|
|
| 711 |
|
| 712 |
from tabulate import tabulate
|
| 713 |
import numpy as np
|
| 714 |
-
|
| 715 |
-
|
| 716 |
|
| 717 |
# Глобальные параметры
|
| 718 |
TOTAL_NITROGEN = 120.0 # Общее количество азота
|
|
@@ -775,26 +778,14 @@ class NutrientCalculator:
|
|
| 775 |
# Формирование вектора B (целевые значения в ppm)
|
| 776 |
B = self.target_vector * self.volume / 1000 # Перевод ppm в граммы
|
| 777 |
|
| 778 |
-
#
|
| 779 |
-
|
| 780 |
-
|
| 781 |
-
# Добавляем допустимый перебор (до 10%)
|
| 782 |
-
tolerance = 0.10
|
| 783 |
-
B_max = B * (1 + tolerance) # Максимальные значения с учетом допуска
|
| 784 |
-
B_min = B * (1 - tolerance) # Минимальные значения с учетом допуска
|
| 785 |
-
|
| 786 |
-
# Решение системы уравнений с ограничениями
|
| 787 |
-
c = np.ones(len(fertilizer_names)) # Минимизируем сумму отклонений
|
| 788 |
-
result = linprog(c, A_ub=A, b_ub=B_max, A_eq=A, b_eq=B, bounds=bounds, method='highs')
|
| 789 |
-
|
| 790 |
-
if not result.success:
|
| 791 |
-
raise ValueError("Не удалось найти решение с текущими ограничениями.")
|
| 792 |
|
| 793 |
# Формирование результата
|
| 794 |
results = {}
|
| 795 |
for i, fert_name in enumerate(fertilizer_names):
|
| 796 |
-
if
|
| 797 |
-
results[fert_name] =
|
| 798 |
|
| 799 |
return results
|
| 800 |
|
|
@@ -815,20 +806,6 @@ class NutrientCalculator:
|
|
| 815 |
raise
|
| 816 |
|
| 817 |
|
| 818 |
-
if __name__ == "__main__":
|
| 819 |
-
try:
|
| 820 |
-
calculator = NutrientCalculator()
|
| 821 |
-
results = calculator.calculate()
|
| 822 |
-
if results:
|
| 823 |
-
print(calculator.generate_report(results))
|
| 824 |
-
else:
|
| 825 |
-
print("Решение не найдено.")
|
| 826 |
-
except Exception as e:
|
| 827 |
-
print(f"Критическая ошибка: {str(e)}")
|
| 828 |
-
|
| 829 |
-
|
| 830 |
-
|
| 831 |
-
|
| 832 |
|
| 833 |
@app.route('/calculation', methods=['POST'])
|
| 834 |
def handle_calculation():
|
|
|
|
| 704 |
|
| 705 |
|
| 706 |
|
| 707 |
+
|
| 708 |
+
|
| 709 |
+
|
| 710 |
+
|
| 711 |
|
| 712 |
|
| 713 |
|
|
|
|
| 715 |
|
| 716 |
from tabulate import tabulate
|
| 717 |
import numpy as np
|
| 718 |
+
import numpy as np
|
|
|
|
| 719 |
|
| 720 |
# Глобальные параметры
|
| 721 |
TOTAL_NITROGEN = 120.0 # Общее количество азота
|
|
|
|
| 778 |
# Формирование вектора B (целевые значения в ppm)
|
| 779 |
B = self.target_vector * self.volume / 1000 # Перевод ppm в граммы
|
| 780 |
|
| 781 |
+
# Решение системы уравнений A @ X = B
|
| 782 |
+
X, residuals, rank, s = np.linalg.lstsq(A, B, rcond=None)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 783 |
|
| 784 |
# Формирование результата
|
| 785 |
results = {}
|
| 786 |
for i, fert_name in enumerate(fertilizer_names):
|
| 787 |
+
if X[i] > 0:
|
| 788 |
+
results[fert_name] = X[i]
|
| 789 |
|
| 790 |
return results
|
| 791 |
|
|
|
|
| 806 |
raise
|
| 807 |
|
| 808 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 809 |
|
| 810 |
@app.route('/calculation', methods=['POST'])
|
| 811 |
def handle_calculation():
|