def set_model(self, model_type, equation, params_str): """ Configura el modelo basado en el tipo, ecuación y parámetros. :param model_type: Tipo de modelo ('biomass', 'substrate', 'product') :param equation: La ecuación como cadena de texto :param params_str: Cadena de texto con los nombres de los parámetros separados por comas """ t_symbol = symbols('t') # Definir 'X' como una función simbólica en sympy X = Function('X') try: expr = sympify(equation) except Exception as e: raise ValueError(f"Error al parsear la ecuación '{equation}': {e}") params = [param.strip() for param in params_str.split(',')] params_symbols = symbols(params) # Extraer símbolos utilizados en la expresión used_symbols = expr.free_symbols # Convertir símbolos a strings used_params = [str(s) for s in used_symbols if s != t_symbol] # Verificar que todos los parámetros en params_str estén usados en la ecuación for param in params: if param not in used_params: raise ValueError(f"El parámetro '{param}' no se usa en la ecuación '{equation}'.") if model_type == 'biomass': # Biomasa como función de tiempo y parámetros func_expr = expr func = lambdify((t_symbol, *params_symbols), func_expr, 'numpy') self.models['biomass'] = { 'function': func, 'params': params } elif model_type in ['substrate', 'product']: # Estos modelos dependen de biomasa, que ya debería estar establecida if 'biomass' not in self.models: raise ValueError("Biomasa debe estar configurada antes de Sustrato o Producto.") biomass_func = self.models['biomass']['function'] # Reemplazar 'X(t)' por la función de biomasa func_expr = expr.subs('X(t)', biomass_func) func = lambdify((t_symbol, *params_symbols), func_expr, 'numpy') self.models[model_type] = { 'function': func, 'params': params } else: raise ValueError(f"Tipo de modelo no soportado: {model_type}")