Теперь подсветка факторов эксперимента подсвечиваются соответственно значениям: + зелёным - красным, 0 (факторы с шагом в 0) - светлосерым. Убран лишний столбец в матрице факторного эксперимента
This commit is contained in:
+18
-103
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user