Considere uma função quadrática da forma $$\newcommand{\vect}{\boldsymbol} f( \vect x ) = \vect x^T Q \vect x + \vect c^T\vect x $$ com $\vect x \in \mathbb R^n$, $Q \in \mathbb R^{n\times n}$ simétrica definida positiva e $\vect c\in\mathbb R^n$.
Sua tarefa será minimizar a função $f$ acima com uma matriz $Q$ e um vetor $\vect c$ gerados aleatoriamente usando o módulo numpy.random
(certifique-se que esta matriz seja simétrica definida positiva). Escolha $n > 1000$ e realize $100$ iterações do método de máxima descida com busca linear exata. Repita este teste com o método dos gradientes conjugados.
Lembre-se que é fácil encontrar o tamanho de passo $\lambda_k$ exato para uma quadrática resolvendo a equação $$ g_k'( \lambda_k ) = 0 $$ onde $$ g_k( \lambda ) = f( \vect x_k - \lambda \vect d_k ). $$
Ao executar os métodos, encontre uma forma de armazenar as iterações geradas pelos algoritmos e faça um gráfico com o valor da função objetivo em cada iteração para os dois métodos (plote os valores em duas curvas no mesmo gráfico).
Por fim, comente os resultados. Por exemplo, qual algoritmo foi mais rápido? Esse resultado era esperado? Por quê?