AULA 4 Estruturas e controlo: for, if, while, def. Somatórios. Funções python. Mais sobre regressão linear. 2018 Laboratório Numérico 1
Ciclo com contador vs operação vetorial np benchmark simples import numpy as np import time Atenção: o N=10**5 tempo gasto é x=np.ones((n),dtype=float) y=np.ones((n))*5 muito sensível t0=time.clock() ao valor de N Sxy=0 for k in range(len(x)): Sxy=Sxy+x[k]*y[k] Controlo t1=time.clock() do tempo SSxy=np.sum(x*y) t2=time.clock() print(t1-t0,t2-t1,'aceleração:',(t1-t0)/(t2-t1)) 2018 Laboratório Numérico 2
Outras estruturas de controlo #Código de execução condicional if x>0: y=1/x elif x==0: y=0 elif x>-5: y=1/x**2 else: y=1/x**4 2018 Laboratório Numérico 3
Ciclo sem contador (while) while condição: codigo 1 codigo N 2018 Laboratório Numérico 4
função (def) def fun(input1,input2,,inputn): codigo return(output1,,outputm) #chama-e a função com: (x1,x2,,xm)=fun(y1,y2,,yn) 2018 Laboratório Numérico 5
De volta ao problema y = ax + b Vamos escrever uma função genérica para resolver o problema do ajuste de uma reta a um conjunto de dados por mínimos quadrados. Em relação à Aula 3, vamos acrescentar dois detalhes: A função considera os dois ajustes lineares: y = ax + b ou y = ax A função calcula uma medida da qualidade do ajuste linear, o coeficiente de correlação de Pearson 2018 Laboratório Numérico 6
Novos cálculos No caso y = ax, pode mostrar-se (exercício!) que a = x ky k x k x k Em ambos os casos, o coeficiente de correlação de Pearson é: r = x k y k 1 N x k y k x 2 k 1 x 2 N k y 2 1 N y k 2 Precisamos de calcular todos os somatórios. 2018 Laboratório Numérico 7
Função linreg (sem ciclos for) import numpy as np #executar antes de chamar linreg def linreg(x,y,origin): n=len(x) sx=np.sum(x) sy=np.sum(y) sx2=np.sum(x*x) sy2=np.sum(y*y) sxy=np.sum(x*y) r=(sxy-sx*sy/n)/np.sqrt((sx2-sx*sx/n)*(sy2-sy*sy/n)) if origin: a=sxy/sx2 b=0. else: a=(sxy-sx*sy/n)/(sx2-sx*sx/n) b=(sy-a*sx)/n return(a,b,r) 2018 Laboratório Numérico 8
Utilização da função import matplotlib.pyplot as plt plt.close('all') nu=1e12*np.array([749,724,699,674,649,624,599,574,549,524,499],dtype=float) Vp=np.array([1,0.99,0.89,0.79,0.68,0.57,0.47,0.37,0.28,0.17,0.07]) e=1.609e-19; evp=e*vp (a,b,r)=linreg(nu,evp,false) h=a; W=-b plt.scatter(nu,vp,color='red ) #argumento por dicionário fit=(h*nu-w)/e; plt.plot(nu,fit,color='blue') plt.text(6.5e14,0.4,'h='+str(h)+'\n'+'r='+str(r)) plt.xlabel(r'$\nu$ );plt.ylabel(r'$v_p$') plt.title('determinação da constante de Planck') print('h=',h,'r=',r) 2018 Laboratório Numérico 9
2018 Laboratório Numérico 10
y = ax + b vs y = ax O coeficiente de correlação não depende do fit Em certos problemas a reta de regressão tem que passar na origem, por razões físicas (por exemplo os valores negativos são inaceitáveis) Para um dado conjunto de dados as duas opções dão declives diferentes. A opção y = ax + b tem erro médio quadrático (tem mais graus de liberdade). 2018 Laboratório Numérico 11
Ajuste polynomial: y = p n x n + p 1 x + p 0 #y=ax+b (polinómio de grau 1) n=1 p=np.polyfit(x,y,n) a=p[0] b=p[1] #O primeiro membro de p é o coeficiente #de potência mais alta 2018 Laboratório Numérico 12
Ajuste de curvas linearizáveis Algumas curvas podem ser transformadas em retas por uma mudança de variáveis: Fazendo V = V 0 e t/rc ln V = ln V 0 t RC y = ln(v), b = ln V 0, x = t, a = 1 RC Fica na forma: y = ax + b 2018 Laboratório Numérico 13
Exemplo: descarga de condensador V = V 0 e t/rc ln V = ln V 0 t RC Dados t(s) 1 2 3 4 5 6 7 8 9 10 V(V) 9.40 7.31 5.15 3.55 2.81 2.04 1.26 0.97 0.74 0.58 2018 Laboratório Numérico 14
Calculo da capacidade de um condensador import numpy as np import matplotlib.pyplot as plt R=2000 V=np.array([9.40,7.31,5.15,3.55,2.81,2.04,1.26,0.97,0.74,0.58]) t=np.arange(1.,11.,1.)#[1.,2.,,10.] logv=np.log(v) p=np.polyfit(t,logv,1) a=p[0];b=p[1] V0=np.exp(b) C=-1/(R*a) fit=v0*np.exp(-t/(r*c)) plt.close('all');plt.figure() plt.scatter(t,v,color='red') plt.plot(t,fit,color='green') plt.title('c='+str(c)+' F') 2018 Laboratório Numérico 15
Resultado 2018 Laboratório Numérico 16