File size: 5,059 Bytes
6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 6e8da07 0496f09 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# bioprocess_model.py
import numpy as np
from scipy.optimize import curve_fit
from sklearn.metrics import mean_squared_error
class BioprocessModel:
def __init__(self):
self.params = {}
self.r2 = {}
self.rmse = {}
self.models = {} # Initialize the models dictionary
@staticmethod
def logistic(time, xo, xm, um):
return (xo * np.exp(um * time)) / (1 - (xo / xm) * (1 - np.exp(um * time)))
def set_model_biomass(self, equation, params_str):
"""
Configura el modelo de Biomasa.
:param equation: La ecuaci贸n de Biomasa como cadena de texto
:param params_str: Cadena de par谩metros separados por comas
"""
try:
# Define la funci贸n de Biomasa directamente
def biomass_func(t, xo, xm, um):
return (xo * np.exp(um * t)) / (1 - (xo / xm) * (1 - np.exp(um * t)))
self.models['biomass'] = {
'function': biomass_func,
'params': [param.strip() for param in params_str.split(',')]
}
except Exception as e:
raise ValueError(f"Error al configurar el modelo de biomasa: {e}")
def set_model_substrate(self, equation, params_str):
"""
Configura el modelo de Sustrato.
:param equation: La ecuaci贸n de Sustrato como cadena de texto (no usada en este enfoque)
:param params_str: Cadena de par谩metros separados por comas
"""
try:
# Define la funci贸n de Sustrato que depende de Biomasa
def substrate_func(t, so, p, q, xo, xm, um):
X_t = self.models['biomass']['function'](t, xo, xm, um)
return so - p * X_t - q * np.log(1 - (xo / xm) * (1 - np.exp(um * t)))
self.models['substrate'] = {
'function': substrate_func,
'params': [param.strip() for param in params_str.split(',')]
}
except Exception as e:
raise ValueError(f"Error al configurar el modelo de sustrato: {e}")
def set_model_product(self, equation, params_str):
"""
Configura el modelo de Producto.
:param equation: La ecuaci贸n de Producto como cadena de texto (no usada en este enfoque)
:param params_str: Cadena de par谩metros separados por comas
"""
try:
# Define la funci贸n de Producto que depende de Biomasa
def product_func(t, po, alpha, beta, xo, xm, um):
X_t = self.models['biomass']['function'](t, xo, xm, um)
return po + alpha * X_t + beta * np.log(1 - (xo / xm) * (1 - np.exp(um * t)))
self.models['product'] = {
'function': product_func,
'params': [param.strip() for param in params_str.split(',')]
}
except Exception as e:
raise ValueError(f"Error al configurar el modelo de producto: {e}")
def fit_model(self, model_type, time, data, bounds=([-np.inf], [np.inf])):
"""
Ajusta el modelo a los datos.
:param model_type: Tipo de modelo ('biomass', 'substrate', 'product')
:param time: Datos de tiempo
:param data: Datos observados para ajustar
:param bounds: L铆mites para los par谩metros
:return: Datos predichos por el modelo
"""
if model_type not in self.models:
raise ValueError(f"Tipo de modelo '{model_type}' no est谩 configurado. Usa set_model primero.")
func = self.models[model_type]['function']
params = self.models[model_type]['params']
# Definir la funci贸n de ajuste para curve_fit
def fit_func(t, *args):
try:
# Para Sustrato y Producto, se necesitan los par谩metros de Biomasa
if model_type in ['substrate', 'product']:
# Extraer los par谩metros de Biomasa
xo, xm, um = self.params['biomass']['xo'], self.params['biomass']['xm'], self.params['biomass']['um']
return func(t, *args, xo, xm, um)
else:
return func(t, *args)
except Exception as e:
raise RuntimeError(f"Error en fit_func: {e}")
# Estimaci贸n inicial de los par谩metros
p0 = [1.0] * len(params) # Puedes ajustar estos valores seg煤n sea necesario
try:
popt, _ = curve_fit(fit_func, time, data, p0=p0, bounds=bounds, maxfev=10000)
# Guardar los par谩metros ajustados
self.params[model_type] = {param: val for param, val in zip(params, popt)}
y_pred = fit_func(time, *popt)
self.r2[model_type] = 1 - (np.sum((data - y_pred) ** 2) / np.sum((data - np.mean(data)) ** 2))
self.rmse[model_type] = np.sqrt(mean_squared_error(data, y_pred))
return y_pred
except Exception as e:
raise RuntimeError(f"Error al ajustar el modelo '{model_type}': {e}")
|