Skip to content

Exponencial

Encontre a melhor exponencial da forma para os dados x,y

É possível mudar a base, por exemplo, base=2 ira encontrar a melhor função

Parameters:

Name Type Description Default
x iterable

Medidas ou floats

required
y iterable

Medidas ou floats

required
base float

Base da exponencial

exp(1)
func bool

retorna uma função ao invés do fitting

False

Returns:

Name Type Description
Array array

Medidas a , k se func=False

Função callable

retorna y(x) se func=True

Source code in LabIFSC2/fitting.py
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
def regressao_exponencial(x,y,base=np.exp(1),func=False):
    '''Encontre a melhor exponencial da forma
    \(y = a * e^{kx}\) para os dados x,y

    É possível mudar a base, por exemplo, 
    base=2 ira encontrar a melhor função

    \(y=a*2^{kx}\)

    Args:
        x (iterable): Medidas ou floats
        y (iterable): Medidas ou floats
        base (float): Base da exponencial
        func (bool): retorna uma função ao invés do fitting

    Returns:
        Array (nd.array):  Medidas a , k se func=False
        Função (callable): retorna y(x) se func=True

    '''
    x=get_nominais(x) ; y=get_nominais(y)
    assert np.all(y>0), 'Todos y precisam ser positivos para uma modelagem exponencial'
    assert base>1, 'Bases precisam ser maiores que 1'
    coefs=regressao_linear(x,np.log(y)/np.log(base))
    coefs[0]=exp(coefs[0])
    if not func: return coefs
    else:  return aceitamedida(lambda x:coefs[0]*np.power(coefs[1]*x,base))

Por incrível que pareça, é possível transformar uma exponencial em uma reta. Temos a relação , considerando somente números positivos, podemos aplicar a função em ambos os lados, obtendo , se fizermos um gráfico de por , será uma reta!

Como já sabemos calcular a melhor reta (Regressão Linear), podemos encontrar a melhor reta usando essa transformação e depois convertemos para as variáveis originais.

Exemplo Exponencial
    x=np.array([0,1,2,3,4,5])
    y=np.array([1,2,3.9,7.85,17,31]) #uma relação quase y=2^x
    a,k=regressao_exponencial(x,y) #(0.99+-0.01)e^(0.693+-0.008)
    a,k=regressao_exponencial(x,y,base=10)#(0.99+-0.01)10^(0.301+-0.003)
    a,k=regressao_exponencial(x,y,base=2)#(0.99+-0.01)2^(0.99+-0.04)