11import string
22from abc import ABC , abstractmethod
3- from collections .abc import Callable , Iterator
3+ from collections .abc import Callable , Iterator , Iterable
44from numbers import Real
55from typing import Any
66
@@ -33,8 +33,8 @@ def _aplicar_funcao_sem_passar_pelo_sistema_de_unidades(
3333 medidas_novas .append (Medida (nominal ,unidade ,incerteza ))
3434 return np .array (medidas_novas )
3535
36- def _forcar_troca_de_unidade (array_medidas : np . ndarray ,unidade :str )-> np .ndarray :
37- return np .array ([Medida (med ._nominal .magnitude ,unidade ,med ._incerteza .magnitude ,) for med in array_medidas ])
36+ def _forcar_troca_de_unidade (medidas : Iterable [ Medida ] ,unidade :str )-> np .ndarray :
37+ return np .array ([Medida (med ._nominal .magnitude ,unidade ,med ._incerteza .magnitude ,) for med in medidas ])
3838
3939class Regressao (ABC ):
4040
@@ -70,17 +70,16 @@ def __iter__(self)->Iterator[object]:
7070
7171class MPolinomio (Regressao ):
7272
73- def __init__ (self ,coeficientes :np . ndarray ):
73+ def __init__ (self ,coeficientes :Iterable [ Medida ] ):
7474 super ().__init__ ()
75- if not (isinstance (coeficientes [0 ],Medida )):
76- raise TypeError ('Os valores do array não são Medidas' )
77-
78- self ._coeficientes :list [Medida ]= []
79- for index ,coef in enumerate (coeficientes ):
80- self ._coeficientes .append (coef )
81- setattr (self ,string .ascii_lowercase [index ],coef )
82- self .grau = len (coeficientes )- 1
83-
75+ self ._coeficientes :list [Medida ]= [coef for coef in coeficientes ]
76+ self .grau = len (self ._coeficientes )- 1
77+ def __getattr__ (self ,name :str )-> Medida :
78+ if name in string .ascii_lowercase :
79+ index = string .ascii_lowercase .index (name )
80+ if index <= self .grau :
81+ return self ._coeficientes [index ]
82+ raise AttributeError (f"'MPolinomio' object has no attribute '{ name } '" )
8483
8584 def amostrar (self :'MPolinomio' , x :np .ndarray ,unidade_y :str ) -> np .ndarray :
8685 """
@@ -259,10 +258,10 @@ def regressao_exponencial(x_medidas:np.ndarray,y_medidas:np.ndarray,
259258 pegar_log = lambda x : log (x )/ log (float (base ))
260259 log_y_medidas = _aplicar_funcao_sem_passar_pelo_sistema_de_unidades (y_medidas ,pegar_log )
261260 polinomio = regressao_linear (x_medidas ,log_y_medidas )
262- k = polinomio .a
261+ k_coef = polinomio .a
263262 a = _aplicar_funcao_sem_passar_pelo_sistema_de_unidades (np .array ([polinomio .b ]),exp )[0 ]
264- k = _forcar_troca_de_unidade (np . array ([ k ]) ,str ((1 / x_medidas [0 ]._nominal ).units ))
265- a = _forcar_troca_de_unidade (np . array ( [a ]) ,str (y_medidas [0 ]._nominal .units ))
263+ k = _forcar_troca_de_unidade ([ k_coef ] ,str ((1 / x_medidas [0 ]._nominal ).units ))
264+ a = _forcar_troca_de_unidade ([a ],str (y_medidas [0 ]._nominal .units ))
266265 return MExponencial (a [0 ],k [0 ],base )
267266
268267
@@ -291,7 +290,7 @@ def regressao_potencia(x_medidas:np.ndarray, y_medidas:np.ndarray) -> MLeiDePote
291290 log_x_medidas = _aplicar_funcao_sem_passar_pelo_sistema_de_unidades (x_medidas ,log )
292291 polinomio = regressao_linear (log_x_medidas ,log_y_medidas )
293292 a = _aplicar_funcao_sem_passar_pelo_sistema_de_unidades (np .array ([polinomio .b ]),exp )[0 ]
294- n = polinomio .a
295- a = _forcar_troca_de_unidade (np .array ([a ]),str ((y_medidas [0 ]._nominal / x_medidas [0 ]._nominal ** n ._nominal .magnitude ).units ))
296- n = _forcar_troca_de_unidade (np . array ([ n ]) ,"dimensionless" )
293+ n_coef = polinomio .a
294+ a = _forcar_troca_de_unidade (np .array ([a ]),str ((y_medidas [0 ]._nominal / x_medidas [0 ]._nominal ** n_coef ._nominal .magnitude ).units ))
295+ n = _forcar_troca_de_unidade ([ n_coef ] ,"dimensionless" )
297296 return MLeiDePotencia (a [0 ],n [0 ],y_medidas [0 ]._nominal )
0 commit comments