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