Você está na página 1de 9

Gustavo Bertozzi - 11813456

MAP2220 - Fundamentos de Análise Numérica

Relatório EP

IME - USP

2022
Prof. Luis Carlos de Castro Santos
1. Introdução:
Como trabalho final da disciplina de Fundamentos de Análise Numérica, foi pedido
que encontrássemos a solução numérica do sistema não linear abaixo munidos de
ferramentas computacionais implementadas por nós, só sendo permitido usar funções e
métodos nativos para compararmos com os métodos implementados.
O EP pode ser dividido em três partes: a primeira consiste em implementar os
métodos de Newton e de Broyden para resolução do sistema e futuramente discorrer sobre
seus desempenhos, que será realizado numa seção futura deste mesmo relatório; a
segunda parte era pedido a mesma implementação citada, contudo era necessário calcular
as derivadas parciais de cada equação do sistema para montar a matriz Jacobiana usando
o método de diferenças finitas, usando como pretexto que nem sempre será fácil achar as
derivadas ou possível de calculá-las analiticamente de forma prática e rápida; na terceira
parte do EP era preciso encontrar o máximo de soluções possíveis para um segundo
sistema não linear, utilizando de quaisquer métodos para tal, desde que devidamente
justificados e implementados.
Para este trabalho foi usada a linguagem de programação Python e suas bibliotecas,
como numpy, time e scipy.optimize para fazer comparações, além de random e math.sqrt,
no IDE Spyder. O arquivo .py com o código será disponibilizado em conjunto com este
relatório.

1
2. Implementação:

2.1. Primeira parte:


Para a implementação da primeira parte, foi realizado uma sequência de passos
para medir e comparar a performance, tanto relativa ao tempo gasto quanto o número de
iterações, dos métodos de Newton e Broyden em comparação com a função nativa fsolve
da biblioteca scipy.optimize. Para ambos foi considerado como critério de convergência um
tol de 1e-10, ou seja quando a norma residual for menor que 1e-10 o método para e retorna
os valores do vetor x.
O método de Newton consiste em calcular a matriz Jacobiana em um ponto com
coordenadas dadas pelo vetor x e usar isso como um sistema linear onde as y são os
valores resultantes do sistema nesse mesmo ponto x. Assim o método de Newton define
que:

Tomando xk+1 = xk + sk , em que sk é a solução linear do sistema:

Como dito anteriormente, o critério de parada é ||sk|| > tol.


Já no método de Broyden define sk da mesma forma, contudo há uma pequena
mudança na equação que acha a aproximação Bk+1 :

onde uk é:

Portanto:

2
Isso faz com que seja muito menos custoso computacionalmente já que não é mais
preciso calcular a matriz Jacobiana a cada iteração e sim apenas uma aproximação dela.
O critério de parada é o mesmo que o método de Newton.
Para esses dois métodos foi implementada uma função que calcula a matriz
Jacobiana em cada ponto x. As derivadas parciais que geram a matriz Jacobiana do
primeiro sistema não linear foram calculadas analiticamente de forma manual para então
serem implementadas.

2.2. Segunda Parte:


Como explicitado na introdução, na segunda parte do EP era necessário realizar os
mesmos métodos aplicados no mesmo sistema não linear, contudo sem sabermos as
derivadas parciais do sistema. Desta forma era preciso calcular a derivada parcial numérica
para montar a matriz Jacobiana usando o método de diferenças finitas.
Foi pedido que fosse usado o método de diferenças finitas de primeira e de segunda
ordem para o método de Newton e apenas o de primeira ordem para o método de Broyden.
Como os métodos de aproximação numérica do sistema já haviam sido implementados,
apenas criou-se as funções de primeira e segunda ordem, respectivamente, de diferenças
finitas que já retornasse uma matriz Jacobiana na forma certa para a execução dos outros
dois métodos.
Para a aproximação de primeira ordem foi escolhida a fórmula progressiva, que para
calcular a derivada parcial em um dado ponto se varia em xi+h, onde xi é a variável em que
se está derivando, e mantém-se as outras coordenadas. Dessa forma temos:

Para a aproximação de segunda ordem foi escolhida a fórmula central, realizando o


mesmo processo de variar por um passo h na variável em que estamos derivando. Assim
temos:

Para ambas aproximações foi escolhido um passo h de 0.1, visto que a computação
para valores muito menores que isso se torna muito menos eficiente por estar muito
próxima do zero comparado ao ganho real de performance dos métodos de resolução
numérica do sistema. Contudo é possível mudar o valor de h facilmente.
Depois de calculadas as derivadas parciais e montada a matriz Jacobiana em cada
caso, o programa segue da mesma maneira que descrita no item anterior.

3
2.3. Terceira Parte:
Na terceira parte do EP foi implementado o segundo sistema da mesma maneira
que o primeiro, fornecendo um vetor x com as coordenadas de um ponto e retornando um
vetor fx com os resultados. Por uma escolha de performance, que será melhor explicada
mais a frente, foi decidido calcular manualmente as derivadas parciais do sistema para
montar a matriz Jacobiana da mesma forma que foi realizada na primeira parte, aplicando
posteriormente o método de Newton.
É importante destacar que este processo foi realizado para um intervalo específico
de valores para as coordenadas do vetor x, visto que antes foi realizado uma análise quanto
às possíveis soluções do sistema em questão que será melhor detalhada mais adiante.

3. Observações e Resultados:

3.1. Sistema 1:
No primeiro experimento, com a implementação descrita em 2.1, foi obtido os
seguintes resultados quanto a performance de cada método:

Como esperado, o Método de Newton convergiu com muito menos iterações com
um desempenho um pouco melhor em relação ao tempo, mas que ambos têm
aproximadamente o mesmo tempo médio por iteração. Isso provavelmente se dá pelo fato
do método de Broyden calcular apenas uma aproximação da matriz Jacobiana, o que
aumenta o número de iterações para ter uma aproximação com o mesmo erro. Embora
computacionalmente seja mais custoso calcular o Jacobiano em si do que uma
aproximação, neste caso infere-se que esse custo computacional maior compensa bastante
já que o método de Newton chega numa aproximação mais rápido e com menos iterações.
Todas as funções calcularam a mesma aproximação numérica do sistema com um
tol de 1e-10, o que demonstra que ambos são algoritmos bastante eficientes.
Quando se usa diferenças finitas para calcular o Jacobiano o comportamento é
bastante semelhante. Abaixo os resultados obtidos:

Novamente o método de Newton se saiu melhor que o método de Broyden, contudo


apenas realmente usando a aproximação de Diferenças Finitas de segunda ordem, que

4
convergiu bastante rapidamente. No de primeira ordem teve um desempenho bastante ruim
no tempo comparado ao mesmo processo usando a matriz Jacobiana normalmente.
O método de Broyden foi particularmente problemático, visto que além de levar mais
tempo e iterações para convergir, foi preciso mudar seu ponto inicial para ter um resultado
satisfatório.
Com exceção do método de Broyden usando diferenças finitas, que iniciou no ponto
(10, 30, 10, 10, 10), todos os outros métodos começaram com no ponto (10, 10, 10, 10, 10).
É importante destacar que houve uma piora quanto aos tempos de execução em relação ao
experimento anterior, mesmo quando houve uma melhora bastante significativa no número
de iterações.

3.2. Sistema 2:
Dado que o segundo sistema de equações é:

Podemos inferir alguns pontos quanto às possíveis soluções do mesmo. As duas


primeira equações descrevem uma circunferência unitária centrada na origem, logo o
intervalo de possíveis soluções é:

Como será utilizado o método de Newton ou Broyden, é preciso analisar os casos


em que a matriz não é inversível::

● Caso 1: se x1 = 0.

5
Então temos as seguintes soluções:
- Se x2 = 0 então x = (0, 0, ±1, ±1, ±x6 , x6).
- Se x4 = 0 então x = (0, ±1, ±1, 0, 0 , 0).
2
- Se x6 = 0 então x = (0, x2 , ±1, ± 1 − 𝑥2 , 0, 0).

● Caso 2: se x2 = 0.

Então temos as seguintes soluções:


- Se x1 = 0 então x = (0, 0, ±1, ±1, ±x5 , x5).
- Se x3 = 0 então x = (±1, 0, 0, ±1, 0 , 0).
2
- Se x5 = 0 então x = (x1 , 0 , ± 1 − 𝑥1 , ±1, 0, 0).

● Caso 3: se x5 = 0.

Os casos em que x3 e x4 são iguais a zero já foram cobertos, restando apenas:


2 2
- Se x6 = 0 então x = (x1 , x2 , ± 1 − 𝑥1 , ± 1 − 𝑥2 , 0, 0).

Com isso falta encontrar as soluções para xi ≠ 0 e que estejam no interior das
circunferências descritas nas duas primeiras equações, já sendo possível utilizar dos
métodos computacionais aqui implementados.
Multiplicando por 3 as duas últimas equações e depois somando com a terceira e
quarta equação obtemos:

A partir dessa equação podemos obter que:

6
sendo que:

Validando computacionalmente é possível ver que esse resultado é verdadeiro para


os pontos iniciais de coordenadas:
- x = (0.6, 0.6, 0.6, 0.6, 0.6, 0.6)
- x = (0.7, 0.7, 0.7, 0.7, 0.7, 0.7)
- x = (0.81, 0.81, 0.81, 0.81, 0.81, 0.81)
- x = (0.9, 0.9, 0.9, 0.9, 0.9, 0.9)
Além disso, foi implementado um quinto teste com um valor gerado aleatoriamente
quando se inicia o programa.
Para alguns valores iniciais, como x = (0.5, 0.5, 0.5, 0.5, 0.5, 0.5), o programa
chegava em uma matriz singular, não conseguindo chegar em uma solução numérica.
Abaixo algumas informações sobre estas aproximações:

7
4. Considerações Finais:

Os dois métodos se mostraram extremamente eficientes em calcular uma


aproximação numérica para o primeiro sistema, contudo é possível argumentar que para
sistemas muito grandes e mais complexos, com centenas ou talvez milhares de variáveis,
fique muito lento inverter matrizes como no método de Newton, levando a crer que o para
escalas muito grandes o método de Broyden seja um pouco melhor mesmo levando mais
iterações para convergir.
Para sistemas menores, como neste EP, o método de Newton segue tendo um
desempenho mais satisfatório, tanto que foi escolhido para aproximar soluções para o
segundo sistema, que precisava ser realizado diversas vezes.
É bastante interessante de se observar como cada método se comporta dado às
mesmas condições iniciais e o porquê de cada método funcionar, suas ideias e limitações.
Embora trabalhoso, foi um ótimo exercício para programar em Python e colocar em prática
conhecimentos adquiridos ao longo do semestre.

5. Referências:

[1] BURDEN, R. L.; FAIRES, J. D. Numerical Analysis. 9th ed. Boston: Brooks/Cole. 2010.

[2] RYAN, Nick. Broyden’s Method in Python. 2017. Disponível em:


https://nickcdryan.com/2017/09/16/broydens-method-in-python/. Acesso em: 3 Jan 2023

[3] Solving a non-linear system of equations in Python using Newton’s Method. Stack
Overflow. 2018. Disponível em:
https://stackoverflow.com/questions/52020775/solving-a-non-linear-system-of-equations-in-p
ython-using-newtons-method. Acesso em: 3 jan 2023.

[4] VALLE, Marcos Eduardo. Aula 10 sistemas Não Lineares e o Método de Newton.
UNICAMP. Disponível em:
https://www.ime.unicamp.br/~valle/Teaching/2015/MS211/Aula10.pdf. Acesso em: 3 Jan
2023.

[5] VALLE, Marcos Eduardo. Aula 11 Variações do Método de Newton para Sistemas
Não Lineares. UNICAMP. Disponível em:
https://www.ime.unicamp.br/~valle/Teaching/2015/MS211/Aula11.pdf. Acesso em: 3 Jan
2023.

Você também pode gostar