Теперь подсветка факторов эксперимента подсвечиваются соответственно значениям: + зелёным - красным, 0 (факторы с шагом в 0) - светлосерым. Убран лишний столбец в матрице факторного эксперимента

This commit is contained in:
2026-05-29 08:55:43 +05:00
parent 6400f04f1c
commit 2392735641
3 changed files with 113 additions and 208 deletions
+18 -103
View File
@@ -84,76 +84,30 @@ def generate_factorial_design(
randomize: bool = True
) -> List[Dict]:
"""
ГЕНЕРИРУЕТ ПОЛНОФАКТОРНЫЙ ПЛАН ЭКСПЕРИМЕНТА
Создаёт матрицу планирования для 2^k полнофакторного эксперимента
с добавлением центральных точек.
ПАРАМЕТРЫ:
----------
factors : List[Dict]
Список факторов. Каждый фактор - словарь с ключами:
- name (str): название фактора
- low (float): нижний уровень (-1)
- high (float): верхний уровень (+1)
- center (float): нулевой уровень (0)
- unit (str): единица измерения
- step (float, опционально): шаг варьирования
- step_type (str, опционально): тип шага ("ед." или "%")
Минимально необходимые ключи: name, low, high, center, unit
center_points : int
Количество центральных точек (повторений в центре плана)
По умолчанию 3
randomize : bool
Перемешивать ли порядок опытов случайным образом
По умолчанию True
ВОЗВРАЩАЕТ:
-----------
List[Dict]
Список экспериментов. Каждый эксперимент - словарь:
- для каждого фактора: "Фактор_N" с полями:
- coded: кодированное значение (-1, 0, +1)
- natural: натуральное значение
- name: название фактора
- unit: единица измерения
- is_center (bool): является ли точка центральной
- center_num (int): номер центральной точки (если is_center)
ПРИМЕР ИСПОЛЬЗОВАНИЯ:
---------------------
>>> factors = [
... {'name': 'Температура', 'low': 25, 'high': 37, 'center': 31, 'unit': '°C'},
... {'name': 'pH', 'low': 6.5, 'high': 7.5, 'center': 7.0, 'unit': ''}
... ]
>>> design = generate_factorial_design(factors, center_points=2)
>>> print(len(design)) # 2^2 + 2 = 6
6
>>> design[0]['Фактор_1']['coded'] # первый фактор в первом опыте
-1
Генерирует полнофакторный план 2^k с правильным порядком изменения факторов:
- фактор 1 меняется через 1 эксперимент (2^0)
- фактор 2 меняется через 2 эксперимента (2^1)
- фактор 3 меняется через 4 эксперимента (2^2)
- и т.д.
"""
k = len(factors)
if k == 0:
return []
n_factorial = 2 ** k
design = []
# Генерация факторных точек (все комбинации уровней)
# Генерация факторных точек в правильном порядке (двоичный счётчик)
for i in range(n_factorial):
experiment = {}
for j in range(k):
# Кодированный уровень: -1 для 0, +1 для 1 в бите
# (k-1-j) для правильного порядка факторов
coded_level = -1 if (i >> (k - 1 - j)) & 1 == 0 else 1
# Натуральное значение
# Правильный порядок битов: младший бит - первый фактор
# (j) - для прямого порядка: фактор 1 меняется чаще всего
coded_level = -1 if (i >> j) & 1 == 0 else 1
natural_value = factors[j]['low'] if coded_level == -1 else factors[j]['high']
experiment[f"Фактор_{j+1}"] = {
'coded': coded_level,
'natural': natural_value,
@@ -161,11 +115,10 @@ def generate_factorial_design(
'unit': factors[j].get('unit', '')
}
design.append(experiment)
# Добавление центральных точек
for i in range(center_points):
center_experiment = {}
for j in range(k):
center_experiment[f"Фактор_{j+1}"] = {
'coded': 0,
@@ -176,11 +129,11 @@ def generate_factorial_design(
center_experiment['is_center'] = True
center_experiment['center_num'] = i + 1
design.append(center_experiment)
# Перемешивание порядка
# Перемешивание порядка (опционально)
if randomize:
random.shuffle(design)
return design
@@ -294,44 +247,6 @@ def analyze_experiment(
return analysis
def create_factor_from_reagent(
reagent: Dict,
total_volume: float,
volume_unit: str,
step_percent: float = 10.0
) -> Dict:
"""
СОЗДАЁТ ФАКТОР ИЗ РЕАГЕНТА (для интеграции калькулятора и DoE)
Преобразует рассчитанный реагент в фактор для планирования эксперимента.
Параметры:
reagent: рассчитанный реагент (из calculate_medium_composition)
total_volume: общий объём среды
volume_unit: единица объёма
step_percent: шаг варьирования в процентах от нулевого уровня
Возвращает:
Dict: фактор для использования в generate_factorial_design()
"""
center_value = reagent.get('undiluted_amount', reagent.get('calculated_amount', 0))
step_value = center_value * step_percent / 100
high_level, low_level = calculate_factor_levels(
center_value, step_value, "ед."
)
return {
'name': reagent['name'],
'center': center_value,
'low': low_level,
'high': high_level,
'step': step_value,
'step_type': 'ед.',
'unit': reagent.get('unit', volume_unit),
'percentage': reagent.get('percentage', 0),
'dilution_factor': reagent.get('dilution_factor', 1.0)
}
def create_factor_from_reagent(
reagent: Dict,