Escolar Documentos
Profissional Documentos
Cultura Documentos
ipynb - Colaboratory
Catodo
−1
ϕ = a1 sinh i + b1
Anodo
−1
ϕ = a2 sinh i + b2
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 1/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
m G(m) i − di
f (m) = ∑ ( )
i=1
σi
F i (m)
⎡ ⎤
⎢ . ⎥
⎢ ⎥
⎢ ⎥
⎢ . ⎥
⎢ ⎥
⎢ . ⎥
⎣ ⎦
F m (m)
O método implementado funciona de tal forma que a interpolação não-linear é feita até que se
atinja uma diferênça entre a curva modelo e os pontos discretizados. Tal diferença é chamada
de resíduo. Abaixo, podemos visualizar como funciona uma interpolação simples.
from re import A
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np
import random
t = np.linspace(0,2*np.pi)
x = np.sin(t)
a=[0.33069, 0.66139, 0.99208 , 1.9842 ,2.3149, 2.6456 , 3.3069, 3.6376, 3.9683
fig, ax = plt.subplots()
plt.style.use('ggplot')
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 2/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
ax.axis([0,2*np.pi,-1,1])
l, = ax.plot([],[],'--', linewidth=2, markersize=12)
j, = ax.plot(a,np.sin(a),'bo',color='red',)
def animate(i):
l.set_data(t[:i], x[:i])
from IPython.display import HTML
ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
HTML(ani.to_jshtml())
Once
Loop
Reflect
Condição de Armijo
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 3/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
O que será utilizado pra garantir o decrescimento da F (x) é a chamada Condição de Armijo,
que consiste em tomar um ponto arbitrário e sua derivada direcional na direção d da função F .
Lembrando que para, uma direção de descida d , a função decresça, a ∂ f /∂ d < 0 , então ao
querer chegar no mínimo da função, teremos ∂ f /∂ d = 0 . Portanto, basta que escolhamos um
αk ∈)0, 1(|∂ f /∂ d ⋅ αk → 0 O que garante o caminho de decrescimento de F .
!pip install ffmpeg-python
!pip install celluloid
import matplotlib.pyplot as plt
E=[-50,-45,-40,-35,-30,-25,-20,-15,-10]
iE=[-1.25252,-1.01743,-0.74747,-0.41947,0.00000,0.55940,1.32936,2.41308,3.96163]
fig=plt.figure()
plt.style.use('ggplot')
#plt.xlim(-40,-10)
#plt.ylim(-1.5,5)
plt.xlabel('E (mV)')
plt.ylabel('i (� A)')
plt.plot(E, iE , 'ro', label='Data')
plt.legend()
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 4/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
<matplotlib.legend.Legend at 0x7fe1a5ee3a10>
Objetivo Principal
Nosso objetivo é, a partir de uma função modelo, minimizar o ϵ entre a função modelo e os
pontos discretizados dos parâmetros E e iE. Isso será feito na curva i através dos parâmetros
βa , Ec , ic e βc que ao serem ajustados pelo Método de Gauss Newton, vão se adequar aos
pontos fornecidos. Através da função:
2.303(E−Ec ) 2.303(Ec −E)
βa βc
i = i c [e − e ]
import numpy
import numpy as np
import math
from datetime import datetime
import time
import matplotlib.pyplot as plt
from celluloid import Camera # importando a camera
from random import randint
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import pandas as pd
from IPython.display import HTML
Apresentações:
print(' O METODO DE GAUSS-NEWTON ')
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 5/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
print('Discente de IC: Gabriel Fernandes')
print('Orientador: Wilian Santos')
print('Contato: wilianj@ufrrj.br')
print(datetime.now())
O METODO DE GAUSS-NEWTON
Discente de IC: Gabriel Fernandes
Orientador: Wilian Santos
Contato: wilianj@ufrrj.br
2022-07-20 13:14:53.396166
Dados iniciais:
#initial data
E=[-50,-45,-40,-35,-30,-25,-20,-15,-10]
iE=[-1.25252,-1.01743,-0.74747,-0.41947,0.00000,0.55940,1.32936,2.41308,3.96163]
tol=0.0000001 #tolerance!!
nmax=500 #max number of iterations
#Step lenght - Armijo condition
alpha_k=1 #tivemos q diminuir o alpha inicial para 1, mudou tb o chute inicial
theta=0.1
c1=0.0001
#def auxiliar vectors and len max of initial data
auxba=[] #= 30; Tafel slope (mV)
auxbc=[] #= 120; Tafel slope (mV)
auxic=[] #ic = 1; % corrosion current(\mu A)
auxEc=[] #Ec=-30; %corrosion potential (mV)
auxa=[]
auxc=[]
iEest=[]
F=[]
res=[]
J = np.zeros((len(E), 4)) #len of Jacobian Matrix
nvar = len(E)
ini = time.time()
#Initial solution for the design variables (\beta_a,\beta_c)
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 6/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
auxba.append(10) #= 30; Tafel slope (mV)
auxbc.append(10) #= 120; Tafel slope (mV)
auxic.append(10) #ic = 1; % corrosion current(\mu A)
auxEc.append(10) #Ec=-30; %corrosion potential (mV)
βa βc
i = i c [e − e ]
#Objective function
for i in range(nvar):
auxa.append(math.exp((2.303 * (E[i]-auxEc[0])/auxba[0])))
auxc.append(math.exp((2.303 * (auxEc[0]-E[i])/auxbc[0])))
iEest.append( auxic[0] * (auxa[i] - auxc[i]))
F.append(0.0)
for k in range(nvar):
res.append(iEest[k] - iE[k]) #residue
F[0] = F[0] + 0.5*(res[k])**2
Matriz Jacobiana
Abaixo, será calculada a matriz jacobiana da Função:
#Jacobian matrix
for k in range(nvar):
J[k,0] = - auxic[0] * math.exp(2.303*(E[k]-auxEc[0])/auxba[0]) * 2.303 * (E[k]-auxEc[
J[k,1] = auxic[0] * 2.7183**(2.303*(auxEc[0]-E[k])/auxbc[0]) * 2.303 * (auxEc[0]-E[k]
J[k,2] = 2.7183**(2.303*(E[k]-auxEc[0])/auxba[0]) -2.7183**(2.303*(auxEc[0]-E[k])/aux
J[k,3] = auxic[0] * ( 2.7183**(2.303*(E[k]-auxEc[0])/auxba[0])* (-2.303/auxba[0])-2.71
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 7/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
Processo iterativo
Todo o processo realizado até então, consiste na primeira parte do processo de resolução de
problemas de programação não linear através do método de Gauss-Newton. A definição dos
chutes iniciais, a identificação de qual função se assemelha aos dados discretizados obtidos, e
também a construção da matriz jacobiana, são aspectos fundamentais para a resolução do
P.P.N.L.
while (F[contador] > tol) and (contador < nmax) :
transposta_J=np.transpose(J)
transposta_res=np.transpose(res)
Hess = numpy.dot( transposta_J , J) #Hessian (G-N) matrix
pseudo_inv_Hess=np.linalg.pinv(Hess)
GradF = numpy.dot( transposta_J , transposta_res) #Gradient
pk = numpy.dot(- pseudo_inv_Hess , GradF) #Descendent direction (G-N)
contador=contador+1
#Iteration
auxba.append(auxba[contador-1] + alpha_k * pk[0])
auxbc.append(auxbc[contador-1] + alpha_k * pk[1])
auxic.append(auxic[contador-1] + alpha_k * pk[2])
auxEc.append(auxEc[contador-1] + alpha_k * pk[3])
#Objective function
for k in range (nvar):
auxa[k]=math.exp((2.303 * (E[k]-auxEc[contador])/auxba[contador]))
auxc[k]=(math.exp((2.303 * (auxEc[contador]-E[k])/auxbc[contador])))
iEest[k] = auxic[contador] * (auxa[k] - auxc[k])
F.append(0)
for c in range(0,nvar):
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 8/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
res[c] = (iEest[c] - iE[c])
F[contador]=F[contador] + 0.5*(res[c])**2
if (any(F[contador] > (F[contador-1] + c1 * alpha_k * np.transpose(GradF) * pk))):
alpha_k=alpha_k * theta
auxba[contador]=auxba[contador-1] + alpha_k * pk[0]
auxbc[contador]=auxbc[contador-1] + alpha_k * pk[1]
auxic[contador]=auxic[contador-1] + alpha_k * pk[2]
auxEc[contador]=auxEc[contador-1] + alpha_k * pk[3]
#Objective function
for k in range (nvar):
auxa[k]=math.exp((2.303 * (E[k]-auxEc[contador])/auxba[contador]))
auxc[k]=(math.exp((2.303 * (auxEc[contador]-E[k])/auxbc[contador])))
iEest[k] = auxic[contador] * (auxa[k] - auxc[k])
F.append(0)
for c in range(0,nvar):
res[c] = (iEest[c] - iE[c])
F[contador]=F[contador] + 0.5*(res[c])**2
#Jacobian matrix
for k in range(0,nvar):
J[k,0] = - auxic[contador] * math.exp(2.303*(E[k]-auxEc[contador])/auxba[cont
J[k,1] = auxic[contador] * 2.7182**(2.303*(auxEc[contador]-E[k])/auxbc[contad
J[k,2] = 2.7182**(2.303*(E[k]-auxEc[contador])/auxba[contador]) -2.7182**(2.3
J[k,3] = auxic[contador] * ( 2.7182**(2.303*(E[k]-auxEc[contador])/auxba[conta
resto= contador%5
if resto == 0 :
auxE1= np.arange(-50,-9.9,0.1)
iEest1=[]
auxa=[]
auxc=[]
for k in range(len(auxE1)):
auxa.append(math.exp(2.303*(auxE1[k]-auxEc[contador])/auxba[contador]))
auxc.append(math.exp(2.303*(auxEc[contador]-auxE1[k])/auxbc[contador]))
iEest1.append(auxic[contador] * (auxa[k] - auxc[k]))
#Image Interpolation
#auxPlot= np.arange(0,contador+1,1)
#plt.style.use('ggplot')
#plt.figure()
#plt.xlim(-55,-5)
#plt.ylim(-3,6)
#plt.xlabel('E (mV)')
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 9/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
#plt.ylabel('i (� A)')
#plt.plot([-50,-45,-40,-35,-30,-25,-20,-15,-10], [-1.25252,-1.01743,-0.74747,-0
#plt.plot(auxE1, iEest1 , color='black',linewidth=2, markersize=1,label='Fit')
#plt.legend()
fim = time.time()
#End program
Resultados Obtidos
Após o processo iterativo, atingiremos uma tolerância já fornecida pelo usuário ou um número
máximo de iterações, e então os dados serão exibidos abaixo:
print('\n \n')
df = pd.DataFrame(data=[[format(fim-ini, '.3f')],[format(contador+1, '.0f')]],index=['Elap
print(df)
print('\n \n')
d = {'Pot. (mV)': E, 'Corrente': iE, '\mu A': iEest}
df = pd.DataFrame(data=d)
print(df)
print('\n \n')
d = {'GradF':GradF}
df = pd.DataFrame(data=d)
print(df)
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 10/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
print('\n \n')
df = pd.DataFrame(data=[ auxba[contador] ,
auxbc[contador] ,
auxic[contador],
auxEc[contador]], index=['auxba','auxbc','auxic','auxEc'], column
print(df)
print('\n \n')
print(' \t Fim de execução.')
print('\n \n')
Número de iterações 22
GradF
0 -0.000053
1 -0.000004
2 0.001700
3 -0.000041
auxba 29.999956
auxbc 119.998197
auxic 0.999996
auxEc -30.000014
Fim de execução.
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 11/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
#impress new points
auxxx = [-38.0,-27.0] #new potential
auxiEest=[]
auxiEexat=[]
#estimado
for k in range (len(auxxx)):
auxa.append(math.exp(2.303 * (auxxx[k]-auxEc[contador])/auxba[contador]))
auxc.append(math.exp(2.303 * (auxEc[contador]-auxxx[k])/auxbc[contador]))
auxiEest.append( auxic[contador] * (auxa[k] - auxc[k])) #Estimated with the new points
##exato
auxa.append(math.exp(2.303 * (auxxx[k]-auxEc[contador])/30.0))
auxc.append(math.exp(2.303 * (auxEc[contador]-auxxx[k])/120.0))
auxiEexat.append(auxic[contador] * (auxa[k] - auxc[k])) #Exact with the new points
Plotando os gráficos:
auxE1= np.arange(-50,-9.9,0.1)
iEest1=[]
auxa=[]
auxc=[]
for k in range(len(auxE1)):
auxa.append(math.exp(2.303*(auxE1[k]-auxEc[contador])/auxba[contador]))
auxc.append(math.exp(2.303*(auxEc[contador]-auxE1[k])/auxbc[contador]))
iEest1.append(auxic[contador] * (auxa[k] - auxc[k]))
plt.style.use('ggplot')
auxPlot= np.arange(0,contador+1,1)
#Image 1
plt.figure()
#plt.xlim(-40,-10)
#plt.ylim(-1.5,5)
plt.xlabel('E (mV)')
plt.ylabel('i (� A)')
plt.plot(E, iE , 'ro', label='Data')
plt.plot(auxE1, iEest1 , color='black',linewidth=2, markersize=1,label='Fit')
plt.legend()
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 12/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
<matplotlib.legend.Legend at 0x7fe1a5e9d490>
Imagem 2:
#Image 2
plt.figure()
plt.ylim(10,35)
plt.xlim(0,25)
plt.xlabel('Iteration')
plt.ylabel('Anodic Tafel slope')
plt.plot(auxPlot, auxba , 'ro')
plt.plot(auxE1, iEest1 , color='black',linewidth=2, markersize=1)
[<matplotlib.lines.Line2D at 0x7fe19f496650>]
Imagem 3:
#Image 3
plt.figure()
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 13/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
plt.ylim(0,120)
plt.xlim(0,25)
plt.xlabel('Iteration')
plt.ylabel('Cathodic Tafel slope')
plt.plot(auxPlot, auxbc , 'ro')
[<matplotlib.lines.Line2D at 0x7fe19f44de90>]
Imagem 4:
#Image 4
plt.style.use('ggplot')
plt.figure()
ax = plt.axes()
plt.xlim(0,30)
plt.ylim(-40,10)
plt.xlabel('Iteration')
plt.ylabel('Corrosion potential')
plt.plot( auxPlot , auxEc, 'ro')
[<matplotlib.lines.Line2D at 0x7fe19f3d4790>]
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 14/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
Imagem 5:
#Image 5
plt.style.use('ggplot')
plt.figure()
ax = plt.axes()
plt.xlim(0,25)
plt.ylim(0,25)
plt.xlabel('Iteration')
plt.ylabel('Corrosion current')
plt.plot( auxPlot , auxic, 'ro')
[<matplotlib.lines.Line2D at 0x7fe19f4380d0>]
i = i c [e βa
− e βc
]
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 15/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
O programa irá rodar 10 vezes, cada vez com seus ic , βa , Ec e βc diferentes em um intervalo
[10, 20] .
#The Gauss-Newton (G-N) method for minimizing a nonlinear objective function
import numpy
import numpy as np
import math
import time
import pandas as pd
import random
NVPRMCI=0
timing=[]
Numb_iter=[]
guarda_auxba=[]
guarda_auxbc=[]
guarda_auxic=[]
guarda_auxEc=[]
for k in range(10):
NVPRMCI=NVPRMCI+1
#print(' O METODO DE GAUSS-NEWTON ')
#print('Discente de IC: Gabriel Fernandes')
#print('Orientador: Wilian Santos')
##print('Contato: wilianj@ufrrj.br')
#print(datetime.now())
#Data (9)
E=[-50,-40,-35,-30,-25,-20,-10]
iE=[-1.25252,-0.74747,-0.41947,0.00000,0.55940,1.32936,3.96163]
tol=0.0000001 #tolerance!!
nmax=499
#Step lenght - Armijo condition
alpha_k=1 #tivemos q diminuir o alpha inicial para 1, mudou tb o chute inicial
theta=0.1
c1=0.0001
#def auxiliar vectors
auxba=[] #= 30; Tafel slope (mV)
auxbc=[] #= 120; Tafel slope (mV)
auxic=[] #ic = 1; % corrosion current(\mu A)
auxEc=[] #Ec=-30; %corrosion potential (mV)
auxa=[]
auxc=[]
iEest=[]
F=[]
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 16/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
res=[]
J = np.zeros((7, 4))
nvar = len(E)
ini = time.time()
#Initial solution for the design variables (\beta_a,\beta_c)
auxba.append(random.randint(10, 20)) #= 30; Tafel slope (mV)
auxbc.append(random.randint(10, 20)) #= 120; Tafel slope (mV)
auxic.append(random.randint(10, 20)) #ic = 1; % corrosion current(\mu A)
auxEc.append(random.randint(10, 20)) #Ec=-30; %corrosion potential (mV)
guarda_auxba.append(auxba[0])
guarda_auxbc.append(auxbc[0])
guarda_auxic.append(auxic[0])
guarda_auxEc.append(auxEc[0])
#Objective function
for i in range(nvar):
auxa.append(math.exp((2.303 * (E[i]-auxEc[0])/auxba[0])))
auxc.append(math.exp((2.303 * (auxEc[0]-E[i])/auxbc[0])))
iEest.append( auxic[0] * (auxa[i] - auxc[i]))
F.append(0.0)
for k in range(nvar):
res.append(iEest[k] - iE[k]) #residue
F[0] = F[0] + 0.5*(res[k])**2
#Jacobian matrix #descobrir como construir uma matriz jacobiana mais fácil no python
for k in range(nvar):
J[k,0] = - auxic[0] * math.exp(2.303*(E[k]-auxEc[0])/auxba[0]) * 2.303 * (E[k]-au
J[k,1] = auxic[0] * 2.7183**(2.303*(auxEc[0]-E[k])/auxbc[0]) * 2.303 * (auxEc[0]-
J[k,2] = 2.7183**(2.303*(E[k]-auxEc[0])/auxba[0]) -2.7183**(2.303*(auxEc[0]-E[k])
J[k,3] = auxic[0] * ( 2.7183**(2.303*(E[k]-auxEc[0])/auxba[0])* (-2.303/auxba[0])-
contador=0
while (F[contador] > tol) and (contador < nmax) :
transposta_J=np.transpose(J)
transposta_res=np.transpose(res)
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 17/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
Hess = numpy.dot( transposta_J , J) #Hessian (G-N) matrix
pseudo_inv_Hess=np.linalg.pinv(Hess)
GradF = numpy.dot( transposta_J , transposta_res) #Gradient
pk = numpy.dot(- pseudo_inv_Hess , GradF) #Descendent direction (G-N)
contador=contador+1
#Iteration
auxba.append(auxba[contador-1] + alpha_k * pk[0])
auxbc.append(auxbc[contador-1] + alpha_k * pk[1])
auxic.append(auxic[contador-1] + alpha_k * pk[2])
auxEc.append(auxEc[contador-1] + alpha_k * pk[3])
#Objective function
for k in range (nvar):
auxa[k]=math.exp((2.303 * (E[k]-auxEc[contador])/auxba[contador]))
auxc[k]=(math.exp((2.303 * (auxEc[contador]-E[k])/auxbc[contador])))
iEest[k] = auxic[contador] * (auxa[k] - auxc[k])
F.append(0)
for c in range(0,nvar):
res[c] = (iEest[c] - iE[c])
F[contador]=F[contador] + 0.5*(res[c])**2
if (any(F[contador] > (F[contador-1] + c1 * alpha_k * np.transpose(GradF) * pk
alpha_k=alpha_k * theta
auxba[contador]=auxba[contador-1] + alpha_k * pk[0]
auxbc[contador]=auxbc[contador-1] + alpha_k * pk[1]
auxic[contador]=auxic[contador-1] + alpha_k * pk[2]
auxEc[contador]=auxEc[contador-1] + alpha_k * pk[3]
#Objective function
for k in range (nvar):
auxa[k]=math.exp((2.303 * (E[k]-auxEc[contador])/auxba[contador]))
auxc[k]=(math.exp((2.303 * (auxEc[contador]-E[k])/auxbc[contador])))
iEest[k] = auxic[contador] * (auxa[k] - auxc[k])
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 18/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
F.append(0)
for c in range(0,nvar):
res[c] = (iEest[c] - iE[c])
F[contador]=F[contador] + 0.5*(res[c])**2
#Jacobian matrix
for k in range(0,nvar):
J[k,0] = - auxic[contador] * math.exp(2.303*(E[k]-auxEc[contador])/auxba[
J[k,1] = auxic[contador] * 2.7182**(2.303*(auxEc[contador]-E[k])/auxbc[co
J[k,2] = 2.7182**(2.303*(E[k]-auxEc[contador])/auxba[contador]) -2.7182**
J[k,3] = auxic[contador] * ( 2.7182**(2.303*(E[k]-auxEc[contador])/auxba[c
fim = time.time()
#End program
#print('\n \n')
Numb_iter.append(contador+1)
#df = pd.DataFrame(data=[[format(fim-ini, '.3f')],[format(contador+1, '.0f')]],index=[
#print(df)
#print('\n \n')
#d = {'Pot. (mV)': E, 'Corrente': iE, '\mu A': iEest}
#df = pd.DataFrame(data=d,index=['','','','','','',''])
#print(df)
#print('\n \n')
#d = {'GradF':GradF}
#df = pd.DataFrame(data=d,index=['','','',''])
#print(df)
#print('\n \n')
#df = pd.DataFrame(data=[ auxba[contador] ,
#auxbc[contador] ,
#auxic[contador],
#auxEc[contador]], index=['auxba','auxbc','auxic','auxEc'], c
#print(df)
#print('\n \n')
#print(' \t Fim de execução.')
#print('\n \n')
#para imprimir novos pontos
auxxx = [-38.0,-27.0] #potencial novo
auxiEest=[]
auxiEexat=[]
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 19/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
#estimado
for k in range (len(auxxx)):
auxa.append(math.exp(2.303 * (auxxx[k]-auxEc[contador])/auxba[contador]))
auxc.append(math.exp(2.303 * (auxEc[contador]-auxxx[k])/auxbc[contador]))
auxiEest.append( auxic[contador] * (auxa[k] - auxc[k])) #estimado com os novos pon
##exato
auxa.append(math.exp(2.303 * (auxxx[k]-auxEc[contador])/30.0))
auxc.append(math.exp(2.303 * (auxEc[contador]-auxxx[k])/120.0))
auxiEexat.append(auxic[contador] * (auxa[k] - auxc[k])) #exato com os novos pontos
timing.append(fim-ini)
print('\n \n')
print('\n \n')
d = {'auxba inicial': guarda_auxba, 'auxbc inicial': guarda_auxbc,'auxic inicial': guarda_
df = pd.DataFrame(data=d)
print(df)
print('\n \n')
auxba inicial auxbc inicial auxic inicial auxEc inicial Num Iter \
0 13 15 14 14 17
1 13 18 17 12 166
2 15 18 14 12 182
3 19 20 18 10 16
4 13 20 19 14 178
5 20 18 12 17 16
6 19 14 13 10 19
7 20 12 10 16 21
8 15 19 10 11 173
9 14 18 14 18 155
Tempo
0 0.003608
1 0.026692
2 0.030414
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 20/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
3 0.002765
4 0.030035
5 0.002953
6 0.003144
7 0.003432
8 0.033840
9 0.033992
Sendo:
E = [−50, −45, −40, −35, −30, −25, −20, −15, −10]
#The Gauss-Newton (G-N) method for minimizing a nonlinear objective function
import numpy
import numpy as np
import math
from datetime import datetime
import time
import matplotlib.pyplot as plt
import pandas as pd
print(' O METODO DE GAUSS-NEWTON ')
print('Discente de IC: Gabriel Fernandes')
print('Orientador: Wilian Santos')
print('Contato: wilianj@ufrrj.br')
print(datetime.now())
#Data (9)
E=[-50,-40,-35,-25,-20,-10]
iE=[-1.25252,-0.74747,-0.41947,0.55940,1.32936,3.96163]
tol=0.0000001 #tolerance!!
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 21/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
nmax=499
#Step lenght - Armijo condition
alpha_k=1 #tivemos q diminuir o alpha inicial para 1, mudou tb o chute inicial
theta=0.1
c1=0.0001
#def auxiliar vectors
auxba=[] #= 30; Tafel slope (mV)
auxbc=[] #= 120; Tafel slope (mV)
auxic=[] #ic = 1; % corrosion current(\mu A)
auxEc=[] #Ec=-30; %corrosion potential (mV)
auxa=[]
auxc=[]
iEest=[]
F=[]
res=[]
J = np.zeros((len(E), 4))
nvar = len(E)
ini = time.time()
#Initial solution for the design variables (\beta_a,\beta_c)
auxba.append(10) #= 30; Tafel slope (mV)
auxbc.append(10) #= 120; Tafel slope (mV)
auxic.append(10) #ic = 1; % corrosion current(\mu A)
auxEc.append(10) #Ec=-30; %corrosion potential (mV)
#Objective function
for i in range(nvar):
auxa.append(math.exp((2.303 * (E[i]-auxEc[0])/auxba[0])))
auxc.append(math.exp((2.303 * (auxEc[0]-E[i])/auxbc[0])))
iEest.append( auxic[0] * (auxa[i] - auxc[i]))
F.append(0.0)
for k in range(nvar):
res.append(iEest[k] - iE[k]) #residue
F[0] = F[0] + 0.5*(res[k])**2
#Jacobian matrix #descobrir como construir uma matriz jacobiana mais fácil no python
for k in range(nvar):
J[k,0] = - auxic[0] * math.exp(2.303*(E[k]-auxEc[0])/auxba[0]) * 2.303 * (E[k]-auxEc[
J[k,1] = auxic[0] * 2.7183**(2.303*(auxEc[0]-E[k])/auxbc[0]) * 2.303 * (auxEc[0]-E[k]
J[k,2] = 2.7183**(2.303*(E[k]-auxEc[0])/auxba[0]) -2.7183**(2.303*(auxEc[0]-E[k])/aux
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 22/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
J[k,3] = auxic[0] * ( 2.7183**(2.303*(E[k]-auxEc[0])/auxba[0])* (-2.303/auxba[0])-2.71
contador=0
while (F[contador] > tol) and (contador < nmax) :
transposta_J=np.transpose(J)
transposta_res=np.transpose(res)
Hess = numpy.dot( transposta_J , J) #Hessian (G-N) matrix
pseudo_inv_Hess=np.linalg.pinv(Hess)
GradF = numpy.dot( transposta_J , transposta_res) #Gradient
pk = numpy.dot(- pseudo_inv_Hess , GradF) #Descendent direction (G-N)
contador=contador+1
#Iteration
auxba.append(auxba[contador-1] + alpha_k * pk[0])
auxbc.append(auxbc[contador-1] + alpha_k * pk[1])
auxic.append(auxic[contador-1] + alpha_k * pk[2])
auxEc.append(auxEc[contador-1] + alpha_k * pk[3])
#Objective function
for k in range (nvar):
auxa[k]=math.exp((2.303 * (E[k]-auxEc[contador])/auxba[contador]))
auxc[k]=(math.exp((2.303 * (auxEc[contador]-E[k])/auxbc[contador])))
iEest[k] = auxic[contador] * (auxa[k] - auxc[k])
F.append(0)
for c in range(0,nvar):
res[c] = (iEest[c] - iE[c])
F[contador]=F[contador] + 0.5*(res[c])**2
if (any(F[contador] > (F[contador-1] + c1 * alpha_k * np.transpose(GradF) * pk))):
alpha_k=alpha_k * theta
auxba[contador]=auxba[contador-1] + alpha_k * pk[0]
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 23/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
auxbc[contador]=auxbc[contador-1] + alpha_k * pk[1]
auxic[contador]=auxic[contador-1] + alpha_k * pk[2]
auxEc[contador]=auxEc[contador-1] + alpha_k * pk[3]
#Objective function
for k in range (nvar):
auxa[k]=math.exp((2.303 * (E[k]-auxEc[contador])/auxba[contador]))
auxc[k]=(math.exp((2.303 * (auxEc[contador]-E[k])/auxbc[contador])))
iEest[k] = auxic[contador] * (auxa[k] - auxc[k])
F.append(0)
for c in range(0,nvar):
res[c] = (iEest[c] - iE[c])
F[contador]=F[contador] + 0.5*(res[c])**2
#Jacobian matrix
for k in range(0,nvar):
J[k,0] = - auxic[contador] * math.exp(2.303*(E[k]-auxEc[contador])/auxba[cont
J[k,1] = auxic[contador] * 2.7182**(2.303*(auxEc[contador]-E[k])/auxbc[contad
J[k,2] = 2.7182**(2.303*(E[k]-auxEc[contador])/auxba[contador]) -2.7182**(2.3
J[k,3] = auxic[contador] * ( 2.7182**(2.303*(E[k]-auxEc[contador])/auxba[conta
resto= contador%3
if resto == 0 :
auxE1= np.arange(-50,-9.9,0.1)
iEest1=[]
auxa=[]
auxc=[]
for k in range(len(auxE1)):
auxa.append(math.exp(2.303*(auxE1[k]-auxEc[contador])/auxba[contador]))
auxc.append(math.exp(2.303*(auxEc[contador]-auxE1[k])/auxbc[contador]))
iEest1.append(auxic[contador] * (auxa[k] - auxc[k]))
auxPlot= np.arange(0,contador+1,1)
#Image 1
plt.style.use('ggplot')
plt.figure()
plt.xlim(-40,-10)
plt.ylim(-1.5,5)
plt.xlabel('E (mV)')
plt.ylabel('i (� A)')
plt.plot([-50,-45,-40,-35,-30,-25,-20,-15,-10], [-1.25252,-1.01743,-0.74747,-0.
, 'ro', label='Data')
plt.plot(auxE1, iEest1 , color='black',linewidth=2, markersize=1,label='Fit')
plt.legend()
fim = time.time()
#End program
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 24/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
print('\n \n')
df = pd.DataFrame(data=[[format(fim-ini, '.3f')],[format(contador+1, '.0f')]],index=['Elap
print(df)
print('\n \n')
d = {'Pot. (mV)': E, 'Corrente': iE, '\mu A': iEest}
df = pd.DataFrame(data=d)
print(df)
print('\n \n')
d = {'GradF':GradF}
df = pd.DataFrame(data=d)
print(df)
print('\n \n')
df = pd.DataFrame(data=[ auxba[contador] ,
auxbc[contador] ,
auxic[contador],
auxEc[contador]], index=['auxba','auxbc','auxic','auxEc'], column
print(df)
print('\n \n')
print(' \t Fim de execução.')
print('\n \n')
#para imprimir novos pontos
auxxx = [-38.0,-27.0] #potencial novo
auxiEest=[]
auxiEexat=[]
#estimado
for k in range (len(auxxx)):
auxa.append(math.exp(2.303 * (auxxx[k]-auxEc[contador])/auxba[contador]))
auxc.append(math.exp(2.303 * (auxEc[contador]-auxxx[k])/auxbc[contador]))
auxiEest.append( auxic[contador] * (auxa[k] - auxc[k])) #estimado com os novos pontos
##exato
auxa.append(math.exp(2.303 * (auxxx[k]-auxEc[contador])/30.0))
auxc.append(math.exp(2.303 * (auxEc[contador]-auxxx[k])/120.0))
auxiEexat.append(auxic[contador] * (auxa[k] - auxc[k])) #exato com os novos pontos
#Plotting
auxE1= np.arange(-50,-9.9,0.1)
iEest1=[]
auxa=[]
auxc=[]
for k in range(len(auxE1)):
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 25/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
auxa.append(math.exp(2.303*(auxE1[k]-auxEc[contador])/auxba[contador]))
auxc.append(math.exp(2.303*(auxEc[contador]-auxE1[k])/auxbc[contador]))
iEest1.append(auxic[contador] * (auxa[k] - auxc[k]))
auxPlot= np.arange(0,contador+1,1)
EOriginal=[-50,-45,-40,-35,-30,-25,-20,-15,-10]
iEOriginal=[-1.25252,-1.01743,-0.74747,-0.41947,0.00000,0.55940,1.32936,2.41308,3.96163]
#Image 1
plt.style.use('ggplot')
plt.figure()
plt.xlabel('E (mV)')
plt.ylabel('i (� A)')
plt.plot(EOriginal, iEOriginal , 'ro', label='Data')
plt.plot(auxE1, iEest1 , color='black',linewidth=2, markersize=1,label='Fit')
plt.legend()
#Image 2
plt.style.use('ggplot')
plt.figure()
plt.xlabel('Iteration')
plt.ylabel('Anodic Tafel slope')
plt.plot(auxPlot, auxba , 'ro', label='Betha_a s Research convergence ')
plt.legend()
#Image 3
plt.style.use('ggplot')
plt.figure()
plt.xlabel('Iteration')
plt.ylabel('Cathodic Tafel slope')
plt.plot(auxPlot, auxbc , 'ro', label='Betha_c s Research convergence ')
plt.legend()
#Image 4
plt.style.use('ggplot')
plt.figure()
ax = plt.axes()
plt.xlabel('Iteration')
plt.ylabel('Corrosion potential')
plt.plot( auxPlot , auxEc, 'ro',label='E_c s Research convergence ')
plt.legend()
#Image 5
plt.style.use('ggplot')
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 26/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
plt.figure()
ax = plt.axes()
plt.xlabel('Iteration')
plt.ylabel('Corrosion current')
plt.plot( auxPlot , auxic, 'ro',label='E_ic s Research convergence ')
plt.legend()
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 27/28
22/07/22, 11:32 ResoluçãodeProblemasdeMínimosQuadradosNãoLinearesparaoCombateàCorrosão.ipynb - Colaboratory
O METODO DE GAUSS-NEWTON
Discente de IC: Gabriel Fernandes
Orientador: Wilian Santos
Contato: wilianj@ufrrj.br
2022-07-22 13:25:47.459126
Então,Elapsed
após rodar
timeo(sec)
programa, percebemos que não só os parâmetros ic , βa , Ec e βc
0.162
Número odemesmo
mantiveram iterações 22
GradF
0 -0.000075
1 -0.000005
2 0.002418
3 -0.000056
auxba 29.999932
auxbc 119.997234
auxic 0.999993
auxEc -30.000020
https://colab.research.google.com/drive/13662qHF2QwEJlxsb4ej9he1OO0clNAI3?authuser=1#scrollTo=8QWMqpKUpSKe&printMode=true 28/28