def optimize(self, parametersReport = True): u''' Método para obtenção da estimativa dos parâmetros e sua matriz de covariância. ''' # --------------------------------------------------------------------- # FLUXO # --------------------------------------------------------------------- self._EstimacaoNaoLinear__controleFluxo.SET_ETAPA('otimizacao') # --------------------------------------------------------------------- # VALIDAÇÃO # --------------------------------------------------------------------- if not self._EstimacaoNaoLinear__flag.info['dadosestimacao']: raise TypeError(u'For execute optimize is necessary to input the estimation data.') if self._EstimacaoNaoLinear__controleFluxo.SETparametro: raise TypeError(u'The optimization method cannot be run with SETparameter.') # --------------------------------------------------------------------- # RESOLUÇÃO # --------------------------------------------------------------------- X = self.x.estimacao.matriz_estimativa Uyy = self.y.estimacao.matriz_covariancia y = self.y.estimacao.vetor_estimativa variancia = inv(X.transpose().dot(inv(Uyy)).dot(X)) parametros = variancia.dot(X.transpose().dot(inv(Uyy))).dot(y) # --------------------------------------------------------------------- # ATRIBUIÇÃO A GRANDEZA # --------------------------------------------------------------------- self.parametros._SETparametro(parametros.transpose()[0].tolist(),variancia,None) # --------------------------------------------------------------------- # FUNÇÃO OBJETIVO NO PONTO ÓTIMO # --------------------------------------------------------------------- # initialization of the method that create the symbolic's variables EstimacaoNaoLinear._constructionCasadiVariables(self) self.FOotimo = float(self._excObjectiveFunction(self.parametros.estimativa,self._values)) # parameters report creation if parametersReport: self._out.Parametros(self.parametros, self.FOotimo)
#%% Starting the MT_PEU main object # Model: Pass the model defined in def Model; # symbols_x: List of symbols for quantity x; # symbols_y: List of symbols for quantity y; # symbols_param: List of symbols for the parameters to be estimated; # label_latex_param: List of symbols for parameters written in LaTex; # label_latex_x: List of symbols for quantities x written in LaTex # units_y: List of units of measurement for independent quantities; # units_param: List of units of measurement of the parameters; # units_x: List of units of measurement of dependent quantities; # Folder: Defines the name of the folder where the results will be saved. Estime = EstimacaoNaoLinear(Model, symbols_x=[r't', 'Tau'], units_x=['s', 'K'], label_latex_x=[r'$t$', '$T$'], symbols_y=[r'y'], units_y=['adm'], symbols_param=['ko', 'E'], units_param=['adm', 'K'], label_latex_param=[r'$k_o$', r'$E$'], Folder='Exemple5') #%% Defining observed data # Input data # input 1 time = [ 120.0, 60.0, 120.0, 60.0, 30.0, 15.0, 45.1, 90.0, 150.0, 60.0, 60.0, 30.0, 150.0, 90.4, 120.0, 60.0, 60.0, 60.0, 30.0, 45.1, 30.0, 45.0, 15.0, 90.0, 25.0, 60.1, 60.0, 30.0, 60.0 ] # input 1 uncertainty uxtime = [0.001] * 29
#%% Starting the MT_PEU main object # Model: Pass the model defined in def Model; # symbols_x: List of symbols for quantity x; # symbols_y: List of symbols for quantity y; # symbols_param: List of symbols for the parameters to be estimated; # label_latex_param: List of symbols for parameters written in LaTex; # units_y: List of units of measurement for independent quantities; # units_x: List of units of measurement of dependent quantities; # units_param: List of units of measurement of the parameters; # Folder: Defines the name of the folder where the results will be saved. Estime = EstimacaoNaoLinear(Model, symbols_x=['t', 'Tao'], units_x=['s', 'K'], symbols_y=[r'y'], units_y=['adm'], symbols_param=['ko', 'E'], units_param=['adm', 'K'], Folder='Exemple2') #%% Defining observed data # Input data # input 1 time = [ 120.0, 60.0, 60.0, 120.0, 120.0, 60.0, 60.0, 30.0, 15.0, 60.0, 45.1, 90.0, 150.0, 60.0, 60.0, 60.0, 30.0, 90.0, 150.0, 90.4, 120.0, 60.0, 60.0, 60.0, 60.0, 60.0, 60.0, 30.0, 45.1, 30.0, 30.0, 45.0, 15.0, 30.0, 90.0, 25.0, 60.1, 60.0, 30.0, 30.0, 60.0 ] # input 1 uncertainty uxtime = [1] * 41
def Model(param, x, args): T = x[:, 0] A, B, C = param[0], param[1], param[2] return exp(A - (B / (T + C))) # Pvp calculation - vectorized #%% Starting the MT_PEU main object # Model: Pass the model defined in def Model; # symbols_x: List of ymbols for quantity x; # symbols_y: List of ymbols for quantity y; # symbols_param: List of Symbols for the parameters to be estimated; # Folder: Defines the name of the folder where the results will be saved. Estimation = EstimacaoNaoLinear(Model, symbols_x=[r'T'], symbols_y=[r'y'], symbols_param=['A', 'B', 'C'], Folder='Exemple3') #%% Defining observed data # Input data T = [ 297.1, 298.2, 299.3, 301.2, 304.2, 307.2, 310.2, 314.1, 316.2, 317.8, 318.2, 320.2, 323.1, 326.2, 329.1, 331.2, 334.2, 337.1, 340.2, 343.2, 346.2, 349.1, 352.2 ] # Input data uncertainty uxT = [0.1] * len(T) # Output data P = [
def Model(param,x,*args): a1, b1, a2, b2 = param[0], param[1], param[2], param[3] x1, x2 = x[:,0], x[:,1] return vertcat(a1*x1/(1+b1*x1), a2*(x2**b2)) #%% Starting the MT_PEU main object # Model: Pass the model defined in def Model; # symbols_x: Lis of symbols for quantity x; # symbols_y: List of symbols for quantity y; # symbols_param: List of symbols for the parameters to be estimated; # label_latex_param: List of ymbols for parameters written in LaTex; # units_y: List of units of measurement for independent quantities; # Folder: Defines the name of the folder where the results will be saved. Estime = EstimacaoNaoLinear(Model,symbols_x=['x1','x2'],symbols_y=['y1','y2'],symbols_param=['alpha1','alpha2', 'beta1', 'beta2'], label_latex_param=[r'$\alpha_1$',r'$\alpha_2$',r'$\beta_1$',r'$\beta_2$'],units_y=['kg','kg'],Folder='Exemple4') #%% Defining observed data # Input data # input 1 x1 = [1.,2.,3.,5.,10,15.,20.,30.,40.,50.] # input 1 uncertainty ux1 = [1]*10 # input 2 x2 = [1.,2.,3.,5.,10,15.,20.,30.,40.,50.] # input 2 ucertainty ux2 = [1]*10 # Output data # output 1 y1 = [1.66,6.07,7.55,9.72,15.24,18.79,19.33,22.38,24.27,25.51]
] temperatura = [ 600.0, 600.0, 612.0, 612.0, 612.0, 612.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 620.0, 631.0, 631.0, 631.0, 631.0, 631.0, 639.0, 639.0, 639.0, 639.0, 639.0, 639.0, 639.0, 639.0, 639.0 ] uy = [1] * 41 uxtempo = [1] * 41 uxtemperatura = [1] * 41 #Execução do MT_PEU Estime = EstimacaoNaoLinear(Modelo, simbolos_x=['t', 'T'], simbolos_y=['y'], simbolos_param=['ko', 'E'], Folder='Exemplo1') Estime.setDados(0, (tempo, uxtempo), (temperatura, uxtemperatura)) Estime.setDados(1, (y, uy)) Estime.setConjunto(tipo='estimacao') Estime.optimize(initial_estimative=[0.5, 25000], algoritmo='ipopt') Estime.incertezaParametros(metodoIncerteza='Geral' '') Estime.predicao() # Valores originais hessian = array([[5.46625676e+00, -7.50116238e-03], [-7.50116238e-03, 1.02960714e-05]]) sensibilidade = array([[-1.06335451e-01, 1.52826132e-04], [-5.59353653e-02, 8.03907392e-05], [-1.28132438e-01, 1.80542088e-04],
ux1 = ones((10, 1)) ux2 = ones((10, 1)) uy1 = ones((10, 1)) uy2 = ones((10, 1)) x = concatenate((x1, x2), axis=1) y = concatenate((y1, y2), axis=1) ux = concatenate((ux1, ux2), axis=1) uy = concatenate((uy1, uy2), axis=1) Estime = EstimacaoNaoLinear( WLS, Modelo, simbolos_x=['x1', 'x2'], simbolos_y=['y1', 'y2'], simbolos_param=[r'a%d' % i for i in xrange(4)], label_latex_param=[r'$\alpha_{%d}$' % i for i in xrange(4)], unidades_y=['kg', 'kg'], projeto='projeto') sup = [6., .3, 8., 0.7] inf = [1., 0, 1., 0.] tipo = None # ================================================================================= # PARTE II - GENÉRICO (INDEPENDE DO EXEMPLO) # ================================================================================= Estime.gerarEntradas(x, y, ux, uy, tipo='experimental') #print Estime._EstimacaoNaoLinear__etapas
A, B = param[0], param[1] return exp( A / 8.31446 + B / (8.31446 * T) - (68.2 / 8.31446) * log(T / 298.15)) # Pvp calculation - vectorized #%% Starting the MT_PEU main object # Model: Pass the model defined in def Model; # symbols_x: List of symbols for quantity x; # symbols_y: List of symbols for quantity y; # symbols_param: List of symbols for the parameters to be estimated; # Folder: Defines the name of the folder where the results will be saved. Estimation = EstimacaoNaoLinear(Model, symbols_x=[r'T'], symbols_y=[r'P'], symbols_param=['A', 'B'], Folder='Exemple8') #%% Defining observed data # Input data T = [ 297.1, 298.2, 299.3, 301.2, 304.2, 307.2, 310.2, 314.1, 316.2, 317.8, 318.2, 320.2, 323.1, 326.2, 329.1, 331.2, 334.2, 337.1, 340.2, 343.2, 346.2, 349.1, 352.2 ] # Input data uncertainty uT = [0.1] * len(T) # Output data P = [
def __init__(self,simbolos_y,simbolos_x,simbolos_param,PA=0.95,projeto='Projeto',**kwargs): u''' Classe para executar a estimação de parâmetros de modelos MISO lineares nos parâmetros ====================== Bibliotecas requeridas ====================== * Numpy * Scipy * Matplotlib * Math * PSO - **Obtida no link http://github.com/ddss/PSO. Os códigos devem estar dentro de uma pasta de nome PSO** ======================= Entradas (obrigatórias) ======================= * ``simbolos_y`` (list) : lista com os simbolos das variáveis y (Não podem haver caracteres especiais) * ``simbolos_x`` (list) : lista com os simbolos das variáveis x (Não podem haver caracteres especiais) * ``simbolos_param`` (list) : lista com o simbolos dos parâmetros (Não podem haver caracteres especiais) ==================== Entradas (opcionais) ==================== * ``PA`` (float): probabilidade de abrangência da análise. Deve estar entre 0 e 1. Default: 0.95 * ``projeto`` (string): nome do projeto (Náo podem haver caracteres especiais) **AVISO**: * Para cálculo do coeficiente linear, basta que o número de parâmetros seja igual ao número de grandezas independentes + 1. ============================== Keywords (Entradas opcionais): ============================== * ``nomes_x`` (list): lista com os nomes para x * ``unidades_x`` (list): lista com as unidades para x (inclusive em formato LATEX) * ``label_latex_x`` (list): lista com os símbolos das variáveis em formato LATEX * ``nomes_y`` (list): lista com os nomes para y * ``unidades_y`` (list): lista com as unidades para y (inclusive em formato LATEX) * ``label_latex_y`` (list): lista com os símbolos das variáveis em formato LATEX * ``nomes_param`` (list): lista com os nomes para os parâmetros (inclusive em formato LATEX) * ``unidades_param`` (list): lista com as unidades para os parâmetros (inclusive em formato LATEX) * ``label_latex_param`` (list): lista com os símbolos das variáveis em formato LATEX * ``base_path`` (string): String que define o diretório pai que serão criados/salvos os arquivos gerados pelo motor de cálculo ======= Métodos ======= Para a realização da estimação de parâmetros de um certo modelo faz-se necessário executar \ alguns métodos, na ordem indicada: **ESTIMAÇÂO DE PARÂMETROS** * ``gerarEntradas`` : método para incluir dados obtidos de experimentos. Neste há a opção de determinar \ se estes dados serão utilizados como dados para estimar os parâmetros ou para validação. (Vide documentação do método) * ``otimiza`` : método para realizar a otimização, com base nos dados fornecidos em gerarEntradas. * ``incertezaParametros`` : método que avalia a incerteza dos parâmetros (Vide documentação do método) * ``gerarEntradas`` : (é opcional para inclusão de dados de validação) * ``Predicao`` : método que avalia a predição do modelo e sua incerteza ou utilizando os pontos experimentais ou de \ validação, se disponível (Vide documentação do método) * ``analiseResiduos`` : método para executar a análise de resíduos (Vide documentação do método) * ``graficos`` : método para criação dos gráficos (Vide documentação do método) * ``_armazenarDicionario`` : método que returna as grandezas sob a forma de um dicionário (Vide documentação do método) ==================== Fluxo de trabalho ==================== Esta classe valida a correta ordem de execução dos métodos. É importante salientar que cada vez que o método ``gerarEntradas`` \ é utilizado, é criado um novo ``Fluxo de trabalho``, ou seja, o motor de cálculo valida de alguns métodos precisam ser reexecutados \ devido a entrada de novos dados. **Observação 1**: Se forem adicionados diferentes dados de validação (execuções do método gerarEntradas para incluir tais dados), \ são iniciado novos fluxos, mas é mantido o histórico de toda execução. **Observação 2**: Se forem adicionados novos dados experimentais, todo o histórico de fluxos é apagado e reniciado. ====== Saídas ====== As saídas deste motor de cálculo estão, principalmente, sob a forma de atributos e gráficos. Os principais atributos de uma variável Estimacao, são: * ``x`` : objeto Grandeza que contém todas as informações referentes às grandezas \ independentes sob a forma de atributos: * ``experimental`` : referente aos dados experimentais. Principais atributos: ``matriz_estimativa``, ``matriz_covariancia`` * ``calculado`` : referente aos dados calculados pelo modelo. Principais atributos: ``matriz_estimativa``, ``matriz_covariancia`` * ``validacao`` : referente aos dados de validação. Principais atributos: ``matriz_estimativa``, ``matriz_covariancia`` * ``residuos`` : referente aos resíduos de regressão. Principais atributos: ``matriz_estimativa``, ``estatisticas`` * ``y`` : objeto Grandeza que contém todas as informações referentes às grandezas \ dependentes sob a forma de atributos. Os atributos são os mesmos de x. * ``parametros`` : objeto Grandeza que contém todas as informações referentes aos parâmetros sob a forma de atributos. * ``estimativa`` : estimativa para os parâmetros * ``matriz_covariancia`` : matriz de covariância * ``regiao_abrangencia`` : pontos contidos na região de abrangência Obs.: Para informações mais detalhadas, consultar os Atributos da classe Grandeza. ''' # --------------------------------------------------------------------- # INICIANDO A CLASSE INIT # --------------------------------------------------------------------- EstimacaoNaoLinear.__init__(self,WLS,Modelo,simbolos_y,simbolos_x,simbolos_param,PA,projeto,**kwargs) self._EstimacaoNaoLinear__flag.setCaracteristica(['calc_termo_independente']) # --------------------------------------------------------------------- # VALIDAÇÃO # --------------------------------------------------------------------- if self.y.NV != 1: raise ValueError(u'Está apenas implementado estimação de parâmetros de modelos lineares MISO') if (self.parametros.NV != self.x.NV) and (self.parametros.NV != self.x.NV+1): raise ValueError(u'O número de parâmetros deve ser: igual ao de grandezas independentes (não é efetuado cálculo do coeficiente linear)'+\ 'OU igual ao número de grandezas independentes + 1 (é calculado o coeficiente linear).') # --------------------------------------------------------------------- # Definindo se o b será calculado # --------------------------------------------------------------------- if (self.parametros.NV == self.x.NV+1): self._EstimacaoNaoLinear__flag.ToggleActive('calc_termo_independente')
#%% Model definition # def Model: The subroutine that specifies the equations with their respective parameters. def Model(param, x, *args): ko, E = param[0], param[1] time, T = x[:,0], x[:,1] return exp(-(ko*10**17)*time*exp(-E/T)) #%% Starting the MT_PEU main object # Model: Pass the model defined in def Model; # symbols_x: list of symbols for quantity x; # symbols_y: list of symbols for quantity y; # symbols_param: list of symbols for the parameters to be estimated; # Folder: string with the name of the folder where reports and charts will be saved; Estime = EstimacaoNaoLinear(Model, symbols_x=['t','Tao'], symbols_y=['y'], symbols_param=['ko','E'], Folder='Example1') #%% Defining observed data # Observed data of dependent variable y = [0.9,0.949,0.886,0.785,0.791,0.890,0.787,0.877,0.938, 0.782,0.827,0.696,0.582,0.795,0.800,0.790,0.883,0.712,0.576,0.715,0.673, 0.802,0.802,0.804,0.794,0.804,0.799,0.764,0.688,0.717,0.802,0.695,0.808, 0.655,0.309,0.689,0.437,0.425,0.638,.659,0.449] # uncertainty of dependent variables uy = [1]*41 # Observed data of independent variable (input 1) time = [120.0,60.0,60.0,120.0,120.0,60.0,60.0,30.0,15.0,60.0, 45.1,90.0,150.0,60.0,60.0,60.0,30.0,90.0,150.0,90.4,120.0, 60.0,60.0,60.0,60.0,60.0,60.0,30.0,45.1,30.0,30.0,45.0,15.0,30.0,90.0,25.0, 60.1,60.0,30.0,30.0,60.0] # input 1 uncertainty
def __init__(self,symbols_y,symbols_x,symbols_param,PA=0.95,folder='Projeto',**kwargs): u''' Classe para executar a estimação de parâmetros de modelos MISO lineares nos parâmetros ====================== Bibliotecas requeridas ====================== * Numpy * Scipy * Matplotlib * Math * PSO - **Obtida no link http://github.com/ddss/PSO. Os códigos devem estar dentro de uma pasta de nome PSO** ======================= Entradas (obrigatórias) ======================= * ``symbols_y`` (list) : lista com os simbolos das variáveis y (Não podem haver caracteres especiais) * ``symbols_x`` (list) : lista com os simbolos das variáveis x (Não podem haver caracteres especiais) * ``symbols_param`` (list) : lista com o simbolos dos parâmetros (Não podem haver caracteres especiais) ==================== Entradas (opcionais) ==================== * ``PA`` (float): probabilidade de abrangência da análise. Deve estar entre 0 e 1. Default: 0.95 * ``folder`` (string): nome do projeto (Náo podem haver caracteres especiais) **AVISO**: * Para cálculo do coeficiente linear, basta que o número de parâmetros seja igual ao número de grandezas independentes + 1. ============================== Keywords (Entradas opcionais): ============================== * ``names_x`` (list): lista com os nomes para x * ``units_x`` (list): lista com as unidades para x (inclusive em formato LATEX) * ``label_latex_x`` (list): lista com os símbolos das variáveis em formato LATEX * ``names_y`` (list): lista com os nomes para y * ``units_y`` (list): lista com as unidades para y (inclusive em formato LATEX) * ``label_latex_y`` (list): lista com os símbolos das variáveis em formato LATEX * ``names_param`` (list): lista com os nomes para os parâmetros (inclusive em formato LATEX) * ``units_param`` (list): lista com as unidades para os parâmetros (inclusive em formato LATEX) * ``label_latex_param`` (list): lista com os símbolos das variáveis em formato LATEX * ``base_path`` (string): String que define o diretório pai que serão criados/salvos os arquivos gerados pelo motor de cálculo ======= Métodos ======= Para a realização da estimação de parâmetros de um certo modelo faz-se necessário executar \ alguns métodos, na ordem indicada: **ESTIMAÇÂO DE PARÂMETROS** * ``setConjunto`` : método para incluir dados obtidos de experimentos. Neste há a opção de determinar \ se estes dados serão utilizados como dados para estimar os parâmetros ou para validação. (Vide documentação do método) * ``optimize`` : método para realizar a otimização, com base nos dados fornecidos em setConjunto. * ``parametersUncertainty`` : método que avalia a incerteza dos parâmetros (Vide documentação do método) * ``setConjunto`` : (é opcional para inclusão de dados de validação) * ``Prediction`` : método que avalia a predição do modelo e sua incerteza ou utilizando os pontos experimentais ou de \ validação, se disponível (Vide documentação do método) * ``residualAnalysis`` : método para executar a análise de resíduos (Vide documentação do método) * ``plots`` : método para criação dos gráficos (Vide documentação do método) * ``_armazenarDicionario`` : método que retorna as grandezas sob a forma de um dicionário (Vide documentação do método) ==================== Fluxo de trabalho ==================== Esta classe valida a correta ordem de execução dos métodos. É importante salientar que cada vez que o método ``setConjunto`` \ é utilizado, é criado um novo ``Fluxo de trabalho``, ou seja, o motor de cálculo valida de alguns métodos precisam ser reexecutados \ devido a entrada de novos dados. **Observação 1**: Se forem adicionados diferentes dados de validação (execuções do método gerarEntradas para incluir tais dados), \ são iniciado novos fluxos, mas é mantido o histórico de toda execução. **Observação 2**: Se forem adicionados novos dados experimentais, todo o histórico de fluxos é apagado e reniciado. ====== Saídas ====== As saídas deste motor de cálculo estão, principalmente, sob a forma de atributos e gráficos. Os principais atributos de uma variável Estimacao, são: * ``x`` : objeto Grandeza que contém todas as informações referentes às grandezas \ independentes sob a forma de atributos: * ``estimação`` : referente aos dados experimentais. Principais atributos: ``matriz_estimativa``, ``matriz_covariancia`` * ``calculado`` : referente aos dados calculados pelo modelo. Principais atributos: ``matriz_estimativa``, ``matriz_covariancia`` * ``predição`` : referente aos dados de validação. Principais atributos: ``matriz_estimativa``, ``matriz_covariancia`` * ``residuos`` : referente aos resíduos de regressão. Principais atributos: ``matriz_estimativa``, ``estatisticas`` * ``y`` : objeto Grandeza que contém todas as informações referentes às grandezas \ dependentes sob a forma de atributos. Os atributos são os mesmos de x. * ``parametros`` : objeto Grandeza que contém todas as informações referentes aos parâmetros sob a forma de atributos. * ``estimativa`` : estimativa para os parâmetros * ``matriz_covariancia`` : matriz de covariância * ``regiao_abrangencia`` : pontos contidos na região de abrangência Obs.: Para informações mais detalhadas, consultar os Atributos da classe Grandeza. ''' # --------------------------------------------------------------------- # INICIANDO A CLASSE INIT # --------------------------------------------------------------------- # For to start the class it's necessary to check wich is the most suitable model if (len(symbols_param) == len(symbols_x) + 1): # The the independent term will be calculated and Model_2 should be used EstimacaoNaoLinear.__init__(self, Model_2, symbols_y, symbols_x, symbols_param, PA, folder, **kwargs) else: # The the independent term won't be calculated and Model_1 should be used EstimacaoNaoLinear.__init__(self, Model_1, symbols_y, symbols_x, symbols_param, PA, folder, **kwargs) self._EstimacaoNaoLinear__flag.ToggleActive('Linear') # Enable linear flag to correctly create 'self .__ values' when independent term calculation self._EstimacaoNaoLinear__flag.setCaracteristica(['calc_termo_independente']) # --------------------------------------------------------------------- # VALIDAÇÃO # --------------------------------------------------------------------- if self.y.NV != 1: raise ValueError(u'It is performing the parameter estimation of linear models only for the MISO case.') if (self.parametros.NV != self.x.NV) and (self.parametros.NV != self.x.NV+1): raise ValueError(u'The number of parameters must be equal to the number of independent quantities (the linear coefficient is not calculated).'+\ 'OR equal to the number of independent quantities + 1 (the linear coefficient is calculated).') self.__coluna_dumb = False # this variable indicates that a column of ones has been added to independent quantities # --------------------------------------------------------------------- # Definindo se o b será calculado # --------------------------------------------------------------------- if (self.parametros.NV == self.x.NV+1): self._EstimacaoNaoLinear__flag.ToggleActive('calc_termo_independente') self.__coluna_dumb = True