99from numpy import exp , log , power
1010from numpy .polynomial import Polynomial
1111
12- from ._arrays import arrayM , incertezas , nominais
1312from ._medida import Medida , ureg
1413from ._tipagem_forte import obrigar_tipos
1514
@@ -38,24 +37,22 @@ def _aplicar_funcao_sem_passar_pelo_sistema_de_unidades(
3837def _forcar_troca_de_unidade (array_medidas :np .ndarray ,unidade :str )-> np .ndarray :
3938 return np .array ([Medida (med ._nominal .magnitude ,unidade ,med ._incerteza .magnitude ,) for med in array_medidas ])
4039
41- class ABCRegressao (ABC ):
40+ class Regressao (ABC ):
4241
4342 def __init__ (self )-> None :
44- self ._amostragem_pre_calculada_nominal : np .ndarray = np .array ([])
45- self ._amostragem_pre_calculada_incerteza : np .ndarray = np .array ([])
43+ self ._amostragem_pre_calculada : np .ndarray = np .array ([])
4644 self ._valores : Iterator = iter ([])
47- self ._sigmas :float = 2
4845
49- def _retornar (self ,y :np .ndarray | Medida ,unidade_y :str )-> np .ndarray | Medida :
50- if isinstance (y ,Medida ): y = np .array ([y ])
51- self ._amostragem_pre_calculada_nominal = nominais (y ,unidade_y )
52- self ._amostragem_pre_calculada_incerteza = incertezas (y ,unidade_y )
53- if y .size == 1 : y = y [0 ]
54- return self ._amostragem_pre_calculada_nominal
46+ def _retornar (self ,y :np .ndarray ,unidade_y :str )-> np .ndarray :
47+ for y_medida in y :
48+ y_medida ._histograma = None
49+ self ._amostragem_pre_calculada = y
50+
51+ resultado :np .ndarray = np .array ([x .nominal (unidade_y ) for x in self ._amostragem_pre_calculada ],dtype = float )
52+ return resultado
5553
56- def _verificar_tipo_de_x (self ,x :np .ndarray | Medida )-> None :
57- if isinstance (x ,np .ndarray ):
58- if not isinstance (x [0 ],Medida ):
54+ def _verificar_tipo_de_x (self ,x :np .ndarray )-> None :
55+ if not isinstance (x [0 ],Medida ):
5956 raise TypeError ("x precisa ser um array de medidas ou uma medida \
6057 mesmo que com incerteza 0, pois precisamos das unidades" )
6158 return None
@@ -64,7 +61,7 @@ def _verificar_tipo_de_x(self,x:np.ndarray|Medida)->None:
6461 def __repr__ (self )-> str :...
6562
6663 @abstractmethod
67- def amostrar (self , x :np .ndarray | Medida ,unidade_y :str ) -> np .ndarray | Medida :...
64+ def amostrar (self , x :np .ndarray ,unidade_y :str ) -> np .ndarray :...
6865
6966 def __iter__ (self )-> Iterator [object ]:
7067 return self ._valores
@@ -84,43 +81,9 @@ def mudar_intervalo_de_confianca(self,sigmas:Real)->None:
8481
8582 self ._sigmas = float (sigmas )
8683
87- @property
88- def curva_min (self )-> np .ndarray :
89- """
90- Calcula a curva mínima da regressão.
91- A curva mínima é calculada subtraindo-se o produto dos sigmas pela incerteza da amostragem pré-calculada nominal.
92-
93- Returns:
94- np.ndarray: A curva mínima calculada.
95-
96- Raises:
97- ValueError: Se a amostragem pré-calculada nominal não estiver disponível.
98- """
9984
100- if not self ._amostragem_pre_calculada_nominal .size :
101- raise ValueError ('É necessário amostrar a regressão antes de calcular a curva min' )
102- y :np .ndarray = self ._amostragem_pre_calculada_nominal - self ._sigmas * self ._amostragem_pre_calculada_incerteza
103- return y
104-
105- @property
106- def curva_max (self )-> np .ndarray :
107- """
108- Calcula a curva máxima da regressão.
109- A curva máxima é calculada somando o produto dos sigmas pela incerteza da amostragem pré-calculada nominal.
110-
111- Returns:
112- np.ndarray: A curva máxima calculada.
113-
114- Raises:
115- ValueError: Se a amostragem pré-calculada nominal não estiver disponível.
116- """
117- if not self ._amostragem_pre_calculada_incerteza .size :
118- raise ValueError ('É necessaŕio amostrar a regressão antes de calcular a curva min' )
119- y :np .ndarray = self ._amostragem_pre_calculada_nominal + self ._sigmas * self ._amostragem_pre_calculada_incerteza
120- return y
12185
122-
123- class MPolinomio (ABCRegressao ):
86+ class MPolinomio (Regressao ):
12487 @obrigar_tipos
12588 def __init__ (self ,coeficientes :np .ndarray ):
12689 if not (isinstance (coeficientes [0 ],Medida )):
@@ -133,22 +96,24 @@ def __init__(self,coeficientes:np.ndarray):
13396 self .grau = len (coeficientes )- 1
13497
13598 @obrigar_tipos
136- def amostrar (self :'MPolinomio' , x :np .ndarray | Medida ,unidade_y :str ) -> np .ndarray | Medida :
99+ def amostrar (self :'MPolinomio' , x :np .ndarray ,unidade_y :str ) -> np .ndarray :
137100 """
138- Gera uma amostra de valores y a partir de um conjunto de valores x utilizando os coeficientes do polinômio.
139-
101+ Calcula os valores de um polinômio para um conjunto de entradas x.
140102 Args:
141- x (np.ndarray | Medida): Conjunto de valores de entrada.
142- unidade_y (str): Unidade de medida para os valores de saída.
143-
103+ x (np.ndarray): Um array de valores nos quais o polinômio será avaliado.
104+ unidade_y (str): A unidade de medida para os valores calculados do polinômio.
144105 Returns:
145- np.ndarray | Medida: Valores de saída calculados a partir do polinômio.
106+ np.ndarray: Um array contendo os valores calculados do polinômio nas unidades especificadas.
107+ Raises:
108+ TypeError: Se o tipo de `x` não for np.ndarray.
146109 """
147110
111+
148112 self ._verificar_tipo_de_x (x )
149- y = Medida (0 ,unidade_y ,0 )
150- for index ,coef in enumerate (self ._coeficientes ):y += coef * x ** (self .grau - index )
151- return self ._retornar (y ,unidade_y )
113+ y :Any = Medida (0 ,unidade_y ,0 )
114+ for index ,coef in enumerate (self ._coeficientes ):y += power (x ,self .grau - index )* coef
115+ polinomio_calculado :np .ndarray = y
116+ return self ._retornar (polinomio_calculado ,unidade_y )
152117
153118 def __iter__ (self ) -> Iterator [Medida ]:
154119 return iter (self ._coeficientes )
@@ -158,7 +123,7 @@ def __repr__(self) -> str:
158123
159124
160125
161- class MExponencial (ABCRegressao ):
126+ class MExponencial (Regressao ):
162127 '''Classe para modelar uma função exponencial
163128 y = a * base^(kx)
164129 '''
@@ -171,26 +136,26 @@ def __init__(self,a:Medida,k:Medida,base:Real):
171136 self ._valores = iter ((a ,k ,base ))
172137
173138 @obrigar_tipos
174- def amostrar (self :'MExponencial' , x :np .ndarray | Medida ,unidade_y :str )-> np .ndarray | Medida :
139+ def amostrar (self :'MExponencial' , x :np .ndarray ,unidade_y :str )-> np .ndarray :
175140 """
176- Gera uma amostra exponencial baseada nos parâmetros fornecidos.
177-
141+ Gera uma amostra de valores exponenciais com base nos parâmetros fornecidos.
178142 Args:
179- x (np.ndarray | Medida ): O valor ou array de valores para os quais a amostra será gerada .
180-
143+ x (np.ndarray): Um array de valores de entrada .
144+ unidade_y (str): A unidade dos valores de saída.
181145 Returns:
182- np.ndarray | Medida: A amostra gerada, no mesmo formato do parâmetro de entrada `x`.
183-
146+ np.ndarray: Um array de valores calculados com base na função exponencial.
147+ Raises:
148+ TypeError: Se o tipo de `x` não for np.ndarray.
184149 """
185150
186151 self ._verificar_tipo_de_x (x )
187- y :np .ndarray | Medida = np .power (float (self .base ),(self .expoente * x ))* self .cte_multiplicativa
152+ y :np .ndarray = np .power (float (self .base ),(self .expoente * x ))* self .cte_multiplicativa
188153 return self ._retornar (y ,unidade_y )
189154
190155 def __repr__ (self )-> str :
191156 return f'MExponencial(cte_multiplicativa={ self .cte_multiplicativa } ,expoente={ self .expoente } ,base={ self .base } )'
192157
193- class MLeiDePotencia (ABCRegressao ):
158+ class MLeiDePotencia (Regressao ):
194159 @obrigar_tipos
195160 def __init__ (self , a : Medida , n : Medida ,y_unidade :pint .Quantity ):
196161 super ().__init__ ()
@@ -200,20 +165,19 @@ def __init__(self, a: Medida, n: Medida,y_unidade:pint.Quantity):
200165 self ._y_unidade = y_unidade
201166
202167 @obrigar_tipos
203- def amostrar (self :'MLeiDePotencia' , x :np .ndarray | Medida ,unidade_y :str ) -> np .ndarray | Medida :
168+ def amostrar (self :'MLeiDePotencia' , x :np .ndarray ,unidade_y :str ) -> np .ndarray :
204169 """
205- Amostra valores com base na lei de potência.
206-
170+ Amostra valores baseados na lei de potência.
207171 Args:
208- x (np.ndarray | Medida): Valores de entrada para amostragem.
209- unidade_y (str): Unidade da medida de saída.
210-
172+ x (np.ndarray): Array de valores de entrada.
173+ unidade_y (str): Unidade da variável dependente y.
211174 Returns:
212- np.ndarray | Medida: Valores amostrados com a unidade especificada.
175+ np.ndarray: Array de valores amostrados com a unidade especificada.
176+ Raises:
177+ ValueError: Se a unidade de x não for compatível com a unidade esperada.
213178 """
214179
215180 self ._verificar_tipo_de_x (x )
216- if isinstance (x ,Medida ):x = np .array ([x ])
217181 unidade_expoente = str ((x [0 ]._nominal ** self .potencia ._nominal ).units )
218182 x = _forcar_troca_de_unidade (x ,'' )
219183 expoente = x ** self .potencia
0 commit comments