
Boa tarde colegas, Estou tentando reproduzir o algoritmo de GAUSS-NEWTOM em linguagem r, entretanto não estou conseguindo automatizar os comandos. Na parte da automatização eu estou seguindo o script que o Walmes postou no site <http://ridiculas.wordpress.com/?s=newton> sobre o metodo de NEWTON-RAPHSON. A titilo de exemplo estou utilizando um ajuste para o modelo y=a*exp(b*x) conforme segue a baixo: CMR: x<-c(2,5,7,10,14,19,26,31,34,38,45,52,53,60,65) y<-c(54,50,45,37,35,25,20,16,18,13,8,11,8,4,6) a<-56.6646 #parâmetro obtido obtido pela linearização da função y=a*exp(b*x) b<-(-0.03797) #parâmetro obtido obtido pela linearização da função y=a*exp(b*x) # a função fx fornece as estimativas de (y~x) dados os coeficientes a e b. fx<-function(xi,yi,a,b,i,n){resp<-numeric(0)for(i in i:n){t<-(a*exp(b*xi[i]))resp<-c(resp,t) }resp} # a função dfa fornece as estimativas da primeira derivada (dfx/da ~ x) dado o coeficientes b. dfa<-function(xi,yi,b,i,n){resp<-numeric(0)for(i in i:n){ t<-exp(b*xi[i]) resp<-c(resp,t) } resp } # a função dfb fornece as estimativas da primeira derivada (dfx/db~x) dados os coeficientes a e b. dfb<-function(xi,yi,a,b,i,n){resp1<-numeric(0)for(i in i:n){ t1<-a*xi[i]*exp(b*xi[i]) resp1<-c(resp1,t1) } resp1 } # A matrix betas contem os chutes para a e b betas<-matrix(c(a,b),nc=1) # bcor fornece os parâmetros a e b corrigidos para a primeira interação. Estes parâmetros serão substituídos no lugar dos valores de a e b iniciais e o processo sera repetido. bcor<-(betas)+((solve((t(matrix(c((dfa(dia,diag,b,1,15)),(dfb(dia,diag,a,b,1,15))),nc=2))%*%(matrix(c((dfa(dia,diag,b,1,15)),(dfb(dia,diag,a,b,1,15))),nc=2)))))%*%((t(matrix(c((dfa(dia,diag,b,1,15)),(dfb(dia,diag,a,b,1,15))),nc=2))%*%(matrix(c(diag-(fx(dia,diag,a,b,1,15))),nc=1))))) # a função Sqerro fornece a soma de quadrados dos desvios Sqerro<-sum((diag-fx(dia,diag,a,b,1,15))^2) O problema é que eu não estou conseguindo usar os parâmetros corrigidos para fazer a nova interação: Ex: bcor[i+1]<-bcor[i]+betas[i] # este comando aproximaria mais vezes os parâmetros. dif(Sqerro[i+1]-Sqerro[i]) #Este seria o critério de parada quando a variação no Sqerro fosse insignificante (10^(-6) por exemplo) Agradeço desde já pela ajuda e peço desculpas se não fui muito claro. Att. Tiago.