1 Receita básica

Propaganda
Receitas para solução de sistemas de equações usando o método de Newton-Raphson no Scilab
Prof. Fabio Azevedo - Cálculo Numérico - MAT01169
1 Receita básica
Nesta receira básica, mostraremos como calcular a solução aproximada de uma sistema não linear via método
de Newton-Raphson próxima a um ponto dado. Ou seja, não explicaremos como obter condições iniciais para
o método.
•
Primeiro passo
Partimos de um problema de n equações e n incógnitas e o escrevemos na forma F (x) = 0 onde F : Rn →
Rn .
⋆
Exemplo:
Partimos do sistema
x + cos(x) = y + y 3
x2 + y 2 = 1
E o escrevemos na forma
[
F (x, y) =
•
Segundo passo
x + cos(x) − y − y 3
x2 + y 2 − 1
Calculamos a matriz jacobina

∂F1
 ∂x1



 ∂F2

 ∂x1
JF = 

 .
 ..



 ∂Fn
∂x1
⋆
Exemplo:
···
∂F2
∂x2
···
···
...
∂Fn
···
∂x2

∂F1
∂xn 



∂F2 

∂xn 


.. 
. 



∂Fn 
∂xn
Partimos da função do exemplo anterior
[
F (x, y) =
 ∂F
1
 ∂x

JF = 
 ∂F
2
∂x
•
∂F1
∂x2
Segundo passo
]
x + cos(x) − y − y 3
x2 + y 2 − 1
]
∂F1 
]
[
∂y 
1 − sen(x) −1 − 3y 2

=
2x
2y
∂F2 
∂y
Construímos o processo iterativo:
{
(
)−1 ( (n) )
F x
x(n+1) = x(n) − JF x(n)
(0)
x = condição inicial
Procuremos a solução do problema apresentado em exemplo próxima a x = .5 e y = 1.
Iniciamos o método com x(0) = .5 e y (0) = 1
⋆
Exemplo:
1
[
F (x, y) =
 ∂F
1
 ∂x

JF = 
 ∂F
2
∂x
x + cos(x) − y − y 3
x2 + y 2 − 1
]
[
=
cos(.5) − 1.5
0.25
]
[
≈
−0.6224174
0.25
]
∂F1 
[
] [
] [
]
∂y 
1 − sen(x) −1 − 3y 2
1 − sen(.5) −4
0.5205745 −4

=
≈
=
2x
2y
1
2
1
2

∂F2
∂y
Logo
[
x(1)
y (1)
]
[
] [
]−1 [
]
x(0)
0.5205745 −4
−0.6224174
=
−
1
2
0.25
y (0)
[
] [
] [
]
.5
−0.0485673
0.5485673
=
−
=
1
0.1492836
0.8507164
Repetindo o processo, temos:
[
Da mesma forma
x(2)
y (2)
]
]−1 [
]
0.4785347 −3.171155
−0.0645556
−
=
1.0971346 1.7014327
0.0246444
]
] [
] [
[
0.5559474
−0.0073802
0.5485673
=
−
=
0.8314729
0.0192434
0.8507164
[
x(1)
y (1)
]
[
[
[
[
x(3)
y (3)
x(4)
y (4)
x(5)
y (5)
]
[
=
]
[
=
]
[
=
0.5560170
0.8311709
0.5560171
0.8311709
0.5560171
0.8311709
]
]
]
O critério de paragem foi a coincidência até a sétima casa decimal depois da vírgula para ambas incógnitas.
Este critério é heurístico, porém devido à rápida convergência é esperado que a solução esteja correta com
erro inferior a 10−7 .
2
Implementação no Scilab:
Usaremos x(1) para x e x(2) para y.
function y=F(x)
y(1)=x(1)+cos(x(1))-x(2)-x(2)^3
y(2)=x(1)^2+x(2)^2-1
endfunction
function y=J(x)
y(1,1)=1-sin(x(1))
y(1,2)=-1-3*x(2)^2
y(2,1)=2*x(1)
y(2,2)=2*x(2)
endfunction
x=[.5;1]
x=x-J(x)\F(x) (4 vezes)
2 Receita com derivada numérica
Nesta receira, mostraremos como calcular a solução aproximada de uma sistema não linear via método de
Newton-Raphson próxima a um ponto dado usando o Scilab para obter. Assim como na receita básica não
explicaremos como obter condições iniciais para o método.
• Primeiro passo Idêntico ao da receita básica, o qual repetimos para conveniência do leitor.
Partimos de um problema de n equações e n incógnitas e o escrevemos na forma F (x) = 0 onde F : Rn →
n
R .
⋆ Exemplo: Partimos do sistema
x + cos(x) = y + y 3
x2 + y 2 = 1
E o escrevemos na forma
[
F (x, y) =
x + cos(x) − y − y 3
x2 + y 2 − 1
]
Para calcular a matriz jacobiana numericamente com ajuda da função 'derivative()', é
necessário implementar a função F no Scilab como uma função que recebe como entrava um vetor e retorna
um vetor de saída. Para tal sugerimos o seguinte código:
•
Segundo passo
function y=F(x)
y(1)=x(1)+cos(x(1))-x(2)-x(2)^3
y(2)=x(1)^2+x(2)^2-1
endfunction
Observa que esta função tem um vetor de duas componentes como entrada (x) e uma vetor de duas componentes como saída (y).
Uma vez implementada a função, o comando 'derivative()' pode ser usado para aproximar a jacobiana em
em dado ponto. Exemplo:
x=[.5 ;1]
JF=derivative(F,x)
3
Observe que o vetor x deve obrigatóriamente ser um vetor coluna.
• Terceiro passo Execução do processo iterativo de Newton-Raphson. Cada passa pode ser executado em
uma única linha:
x=[.5 ;1]
x=x-derivative(F,x)\F(x) X 5 vezes
3 Receita de gráco implícito
Nesta receita, mostraremos como traçar o gráco de curvas descritas por equações do tipo f (x, y) = 0.
⋆ Exemplo: Traçaremos as curvas correspondentes às funções do exemplo, ou seja:
f (x, y) = x + cos(x) − y − y 3
g(x, y) = x2 + y 2 − 1
•
Primeiro passo
Denimos as funções R × R → R:
function w=f(x,y)
w=x+cos(x)-y-y^3
endfunction
function w=g(x,y)
w=x^2+y^2-1
endfunction
Denimos a região do gráco. Neste caso, como sabemos que a função g descreve um
círculo de raio 1 centrado na origem. Pelo que é conveniente escolher a região [−1, 1] × [−1, 1] para traçar o
gráco.
Usamos o comando 'contour':
•
Segundo passo
contour([-1:.1:1],[-1:.1:1],f,[0 0])
contour([-1:.1:1],[-1:.1:1],g,[0 0])
O termo '[0 0]' indica que apenas a curva de nível de valor 0 deve ser traçada.
4 Receita básica para problemas de otimização
Nesta receira básica, mostraremos como encontrar numericamente um ponto crítico de uma função via método
de Newton-Raphson próxima a um ponto dado. Ou seja, não explicaremos como obter condições iniciais para
o método.
•
Primeiro passo
Partimos de uma função f : Rn → R G(x) = ∇f (x) = 0 onde G : Rn → Rn .
⋆ Exemplo: Queremos encontrar o ponto de máximo da função
e−(x−1) −2(y−2)
1 + x2 + y 2
2
f (x, y) = 20
Calculamos o gradiente:

2
40(x − 1)e−(x−1) −2(y−2)
e−(x−1) −2(y−2)
−
−
40x

1 + x2 + y 2
(1 + x2 + y 2 )2


G(x, y) = 
2
2
 −80(y − 1)e−(x−1)2 −2(y−2)2
e−(x−1) −2(y−2)
− 40y
1 + x2 + y 2
(1 + x2 + y 2 )2
2
4
2
2
2






•
Segundo passo
Aplica-se a receita básica ou a receita com derivada numérica ao sistema G(x) = 0 e
obtém-se x ≈ 0.8333410,
y ≈ 1.8181909
5 Receita para problemas de otimização com cálculo numérico do
gradiente
Nesta receira básica, mostraremos como encontrar numericamente um ponto crítico de uma função via método
de Newton-Raphson próxima a um ponto dado. Ou seja, não explicaremos como obter condições iniciais para
o método. Em contraste com a receita anterior, o gradiente será aproximado numericamente.
Atenção:
O uso de aproximação numérica do gradiente pode deteriorar a qualidade da
solução.
•
Primeiro passo
Partimos de uma função f : Rn → R G(x) = ∇f (x) = 0 onde G : Rn → Rn .
⋆ Exemplo: Queremos encontrar o ponto de máximo da função
e−(x−1) −2(y−2)
f (x, y) = 20
1 + x2 + y 2
2
2
Observamos que a matriz jacobiana JG associada ao gradiente G(x) = ∇f (x) é a matriz hessiana de f e
usamos o comando 'derivative' para calcular simultaneamente a hessiana e o gradiente.
• Segundo passo Implementamos no Scilab a função f : Rn → R.
⋆
Exemplo:
function w=f(v)
x=v(1)
y=v(2)
w=20*(exp(-(x-1)^2-2*(y-2)^2))/(1+x^2+y^2)
endfunction
•
Terceiro passo
Implementamos no Scilab o processo iterativo de Newton-Raphson:
x(n+1) = x(n) − Hf−1 (xn )∇f (xn )
⋆
Exemplo:
v=[1;2]
[G,H]=derivative(f,v,H_form='blockmat');v=v-H\G' X 4
Observe que o Scilab produz o gradiente na forma de um vetor linha, pelo que é necessário transpô-lo para
(G') para resolver o sistema Hx = G′ com o comando H\G′ .
6 Receita de gráco de curvas de nível
Nesta receita, mostraremos como traçar o gráco de curvas de nível descritas por funções do tipo f (x, y).
Este tipo de gráco é útil em problemas de otimização.
⋆ Exemplo: Traçaremos as curvas de nível correspondentes à função do exemplo anterior, ou seja:
e−(x−1) −2(y−2)
f (x, y) = 20
1 + x2 + y 2
2
•
Primeiro passo
Denimos a função R × R → R:
5
2
function w=f(x,y)
w=20*(exp(-(x-1)^2-2*(y-2)^2))/(1+x^2+y^2)
endfunction
Denimos a região do gráco. Neste caso, como sabemos que o numerador da função f
tem um máximo em x = 1 e y = 2. Pelo que escolhemos a região [0, 2] × [1, 3] para traçar o gráco. Deve-se
escolher os níveis a serem traçados. Por inspeção da função, vemos que é conveniente traçar valores positivos
menores que 4.
Usamos o comando 'contour':
•
Segundo passo
contour([0:.025:2],[1:.025:3],f,[0:.25:4])
O termo '[0:.25:4]' indica que devem ser traçadas as curvas de nível de valores entre 0 e 4 com passo de
0.25.
6
Download