<jupyter_start><jupyter_text>Lista de Exercícios 3Métodos Numéricos para Engenharia - Turma C  Nome: <NAME>   Matrícula: 14/0165169 Observações:0. A lista de exercícios deve ser entregue no moodle da disciplina.0. A lista de exercícios deve ser respondida neste único arquivo (.ipynb). Responda a cada questão na célula imediatamente abaixo do seu enunciado.0. Não se esqueça de alterar o nome do arquivo e o cabeçalho acima, colocando seu nome e matrícula.0. A lista é uma atividade avaliativa e individual. Não será tolerado qualquer tipo de plágio.<jupyter_code># Deixe-me incluir o conjunto de módulos do Python científico para você.
%pylab inline<jupyter_output>Populating the interactive namespace from numpy and matplotlib<jupyter_text>--- Questão 01O Método da Interpolação Constante é o método mais simples de interpolação. Neste método, o valor estimado da função $f(x)$ para um valor de $x$ arbitrário é exatamente o valor de $f(x)$ no ponto conhecido mais próximo.Conseguimos a seguinte tabela de uma certa função $f$:|    $x_i$   | $0$ |  $2$ | $4$ | $6$ | $8$ ||:----------:|:---:|:----:|:---:|:---:|:---:|| $f$($x_i$) | $6$ | $2$ | $4$ | $8$ | $5$ |Encontre o valor da função $f$ para um valor de $x$ arbitrário utilizando o Método da Interpolação Constante. EntradaUm valor de ponto flutuante $0 \leq X \leq 8$. SaídaUm valor de ponto flutuante $y$ com seis casas decimais de precisão indicando o valor de $f(X)$ encontrado. Entrada de Teste1.6 Saída de Teste2.000000<jupyter_code>X = [0, 2, 4, 6, 8]
Y = [6, 2, 4, 8, 5]

x0 = float(input())

i = 0
while i < len(X)-1 and abs(x0 - X[i]) > abs(x0 - X[i+1]):
    i += 1

print('%.6f' % Y[i])<jupyter_output>1.6
2.000000<jupyter_text>--- Questão 02O Método da Interpolação Linear consiste em conectar pontos conhecidos consecutivos por um segmento de reta. Neste caso, o interpolante é dado por um conjunto de segmentos de reta.Dados os seguinte pontos conhecidos de uma função $y = f(x)$:| $x$ | $0$ | $2$ | $4$ | $6$ | $8$ | $10$ ||:---:|:---:|:---:|:---:|:---:|:---:|:---:|| $y$ | $2.6$ | $3.5$ | $1.1$ | $-0.8$ | $0.9$ | $3.3$ |Encontre o valor da função $f$ para um valor de $x$ arbitrário utilizando o Método da Interpolação Linear. EntradaUm valor de ponto flutuante $0 \leq X \leq 10$. SaídaUm valor de ponto flutuante $y$ com seis casas decimais de precisão indicando o valor de $f(X)$ encontrado. Entrada de Teste0.5 Saída de Teste2.825000<jupyter_code>X = [0, 2, 4, 6, 8, 10]
Y = [2.6, 3.5, 1.1, -0.08, 0.9, 3.3]

x0 = float(input())

i = 0
while i < len(X)-2 and x0 > X[i+1]:
    i += 1

y0 = Y[i] + (x0 - X[i]) * (Y[i+1] - Y[i]) / (X[i+1] - X[i])

print('%.6f' % y0)<jupyter_output>0.5
2.825000<jupyter_text>--- Questão 03O Método da Interpolação Polinomial consiste em encontrar um polinômio de ordem menor ou igual a $N$ que passe por todos os $N+1$ pontos conhecidos.Dados cinco pontos conhecidos de uma função $f(x)$, encontre os coeficientes do seu polinômio interpolante. EntradaUm número inteiro positivo $N$ ($1 \leq N \leq 100$), seguido de $N$ pares de valores de ponto flutuante $(x_i, y_i)$, onde $-10^4 \leq x_i, y_i \leq 10^4$. SaídaOs $N$ coeficientes do polinômio interpolante $p(x)$ dado abaixo, com seis casas de precisão.$$ p(x) = a_{N-1}x^{N-1} + a_{N-2}x^{N-2} + ... + a_1x + a_0 $$ Entrada de Teste10  -2.0 4.0  -1.0 1.0  0.0 0.0  1.0 1.0  2.0 4.0  3.0 9.0  4.0 16.0  5.0 22.0  6.0 18.0  7.0 1.0 Saída de Teste+0.000017  -0.000149  -0.000496  +0.006250  -0.007986  -0.028125  +0.048942  +1.022024  -0.040476  +0.000000<jupyter_code>N = int(input())

X, Y = np.zeros(N), np.zeros(N)
for i in range(N):
    X[i], Y[i] = [float(x) for x in input().split()]

A = np.zeros((N,N))
for i in range(N):
    for j in range(N):
        A[i,j] = X[i]**(N-1 - j)

coefs = np.linalg.solve(A, Y)

for coef in coefs:
    print('%.6f' % coef)<jupyter_output>10
-2.0 4.0
-1.0 1.0
0.0 0.0
1.0 1.0
2.0 4.0
3.0 9.0
4.0 16.0
5.0 22.0
6.0 18.0
7.0 1.0
0.000017
-0.000149
-0.000496
0.006250
-0.007986
-0.028125
0.048942
1.022024
-0.040476
0.000000<jupyter_text>--- Questão 04Dados $N$ pontos $(x_i,y_i)$ conhecidos de uma função $f(x)$, encontre os valores da função $f(x)$ para os valores de $x$ fornecidos. Utilize o Método da Interpolação Polinomial. EntradaA primeira linha da entrada consiste de um valor inteiro $2 \leq N \leq 100$, indicando o número de pontos conhecidos da função $f(x)$. As próximas $N$ linhas consistem de dois valores de ponto flutuante cada, indicando os valores $(x_i,y_i)$ do i-ésimo ponto. A próxima linha consiste de um valor inteiro $1 \leq M \leq 1000$, indicando a quantidade de valores de $x$ para os quais queremos saber o valor de $f(x)$. SaídaA saída deve conter $M$ linhas, cada uma com a seguinte mensagem: "$f(x_a) = y_a$". Onde $x_a$ é o valor de $x$ dado e $y_a$ é o valor encontrado para $f(x_a)$. Os valores de $x_a$ e $y_a$ devem ser impressos com 6 casas decimais de precisão. Entrada de Teste5  0.0 0.0  1.0 1.0  2.0 4.0  3.0 9.0  4.0 16.0  2  1.5  2.5 Saída de Teste$\texttt{f(1.500000) = 2.250000}$  $\texttt{f(2.500000) = 6.250000}$<jupyter_code>N = int(input())

X, Y = np.zeros(N), np.zeros(N)
for i in range(N):
    X[i], Y[i] = [float(x) for x in input().split()]

A = np.zeros((N,N))
for i in range(N):
    for j in range(N):
        A[i,j] = X[i]**(N-1 - j)

coefs = np.linalg.solve(A, Y)

M = int(input())

def poly(C, X):
    Y = 0
    for i in range(len(C)):
        Y += C[i] * X**(len(C)-1 - i)
    return Y

Xa, Ya = np.zeros(M), np.zeros(M)
for i in range(M):
    x = float(input())
    Xa[i], Ya[i] = x, poly(coefs, x)
    print('f(%.6f) = %.6f' % (Xa[i], Ya[i]))<jupyter_output>5
0.0 0.0
1.0 1.0
2.0 4.0
3.0 9.0
4.0 16.0
2
1.5
f(1.500000) = 2.250000
2.5
f(2.500000) = 6.250000<jupyter_text>--- Questão 05O Método dos Mínimos Quadrados (MMQ) consiste em ajustar uma curva a um conjunto de pontos de forma a minimizar o Erro Quadrático (EQ), ou seja, minimizar a soma dos quadrados das distâncias entre a curva e os pontos.Encontre os coeficientes $A$ e $B$ ao ajustar uma reta a um conjunto de $N$ pontos $(x,y)$, utilizando o MMQ. EntradaA primeira linha da entrada consiste de um valor inteiro $2 \leq N \leq 1000$, indicando o número de pontos conhecidos da função $f(x)$. As próximas $N$ linhas consistem de dois valores de ponto flutuante cada, indicando os valores $(x_i,y_i)$ do i-ésimo ponto. SaídaA saída deve conter a seguinte mensagem: "$Y = A*X +B$". Onde $A$ e $B$ são os coeficientes encontrados, impressos com seis casa decimais de precisão. Entrada de Teste5  0.0 -1.0  2.0 2.0  4.0 5.0  6.0 7.0  8.0 11.0 Saída de Teste$\texttt{Y = 1.450000*X -1.000000}$<jupyter_code>N = int(input())

X, Y = np.zeros(N), np.zeros(N)
for i in range(N):
    X[i], Y[i] = [float(x) for x in input().split()]

A = np.zeros((2,2))
A[0,0], A[0,1] = np.sum(X**2), np.sum(X)
A[1,0], A[1,1] = np.sum(X)   , N
b = [np.sum(X*Y), np.sum(Y)]

m, c = np.linalg.solve(A, b)

print('Y = %.6f * X + %.6f' % (m, c))<jupyter_output>5
0.0 -1.0
2.0 2.0
4.0 5.0
6.0 7.0
8.0 11.0
Y = 1.450000 * X + -1.000000<jupyter_text>--- Questão 06Utilizando o MMQ, encontre os coeficientes $A$, $B$ e $C$ ao ajustar uma parábola a um conjunto de $N$ pontos $(x,y)$. EntradaA primeira linha da entrada consiste de um valor inteiro $3 \leq N \leq 1000$, indicando o número de pontos conhecidos da função $f(x)$. As próximas $N$ linhas consistem de dois valores de ponto flutuante cada, indicando os valores $(x_i,y_i)$ do i-ésimo ponto. SaídaA saída deve conter a seguinte mensagem: "$Y = A * X$^$2 + B * X + C$". Onde $A$, $B$ e C são os coeficientes encontrados, impressos com seis casa decimais de precisão. Entrada de Teste5  0.0 0.0  1.0 3.0  2.0 2.0  3.0 5.0  4.0 4.0 Saída de Teste$\texttt{Y = -0.285714 * X^2 + 2.142857 * X + 0.228571}$<jupyter_code>def square(x):
    return x**2
def line(x):
    return x
def const(x):
    return 1
F = [square, line, const]

N = int(input())

X, Y = np.zeros(N), np.zeros(N)
for i in range(N):
    X[i], Y[i] = [float(x) for x in input().split()]

A = np.zeros((N, len(F)))
for i in range(N):
    for j in range(len(F)):
        A[i,j] = F[j](X[i])
left, right = A.T.dot(A), A.T.dot(Y)

a, b, c = np.linalg.solve(left, right)

print('Y = %.6f * X^2 + %.6f * X + %.6f' % (a, b, c))<jupyter_output>5
0.0 0.0
1.0 3.0
2.0 2.0
3.0 5.0
4.0 4.0
Y = -0.285714 * X^2 + 2.142857 * X + 0.228571<jupyter_text>--- Questão 07Encontre o EQ mínimo ao ajustar uma reta a um conjunto de $N$ pontos $(x,y)$, utilizando o MMQ. EntradaA primeira linha da entrada consiste de um valor inteiro $2 \leq N \leq 100$, indicando o número de pontos conhecidos da função $f(x)$. As próximas $N$ linhas consistem de dois valores de ponto flutuante cada, indicando os valores $(x_i,y_i)$ do i-ésimo ponto. SaídaUm único valor de ponto flutuante com seis casas decimais de precisão, indicando o EQ mínimo para a aproximação. Entrada de Teste5  0.0 0.0  1.0 4.0  2.0 1.0  3.0 6.0  4.0 3.0 Saída de Teste8.800000<jupyter_code>N = int(input())

X, Y = np.zeros(N), np.zeros(N)
for i in range(N):
    X[i], Y[i] = [float(x) for x in input().split()]

A = np.zeros((2,2))
A[0,0], A[0,1] = np.sum(X**2), np.sum(X)
A[1,0], A[1,1] = np.sum(X)   , N
b = [np.sum(X*Y), np.sum(Y)]

m, c = np.linalg.solve(A, b)

ssr = 0
for i in range(N):
    ssr += abs(Y[i] - (m*X[i] + c))

print('%.6f' % ssr)<jupyter_output>5
0.0 0.0
1.0 4.0
2.0 1.0
3.0 6.0 
4.0 3.0
8.800000<jupyter_text>--- Questão 08Utilize o MMQ para encontrar a função que melhor se ajusta a um conjunto de $N$ pontos $(x,y)$, ou seja, que possua o menor EQ. As opções de funções são:$$\begin{cases}f(x) = C_0 + C_1x \\g(x) = C_0sin(x) + C_1cos(x) \\h(x) = C_0ln(x+1) + C_1e^{2x}\end{cases}$$ EntradaA primeira linha da entrada consiste de um valor inteiro $3 \leq N \leq 1000$, indicando o número de pontos conhecidos da função $f(x)$. As próximas $N$ linhas consistem de dois valores de ponto flutuante cada, indicando os valores $(x_i,y_i)$ do i-ésimo ponto. SaídaA saída deve conter três linhas. A primeira linha deve conter a mensagem "$EQ(FUNCAO) = ERRO$", onde $FUNCAO$ deve ser $f$, $g$ ou $h$, indicando a função de menor EQ e $ERRO$ deve ser o valor do EQ mínimo encontrado. As segunda e terceira linhas devem conter os valores de $C_0$ e $C_1$, conforme mostrado na saída de teste. Todos os valores devem ter seis casas decimais de precisão. Entrada de Teste5  0.0 0.0  1.0 4.0  2.0 1.0  3.0 6.0  4.0 3.0 Saída de Teste$\texttt{EQ(h) = 12.549857}$  $\texttt{C0 = 3.442127}$  $\texttt{C1 = -0.000797}$<jupyter_code>def const(x):
    return 1
def f(x):
    return x
F = [const, f]
G = [np.sin, np.cos]
# H = []

def compute_function(F, C, X):
    Y = 0
    for i in range(len(F)):
        Y += C[i] * F[i](X)
    return Y

N = int(input())

X, Y = np.zeros(N), np.zeros(N)
for i in range(N):
    X[i], Y[i] = [float(x) for x in input().split()]

def mmq(F, X, Y):
    A = np.zeros((len(X), len(F)))
    for i in range(len(X)):
        for j in range(len(F)):
            A[i,j] = F[j](X[i])
    return np.linalg.solve(A.T.dot(A), A.T.dot(Y))

Cf = mmq(F, X, Y)
Cg = mmq(G, X, Y)
Ch = mmq(H, X, Y)

def ssr(F, C, X, Y):
    residuals = compute_function(F, C, X) - Y
    return np.sum(residuals**2)

ssrf = ssr(F, Cf, X, Y)
ssrg = ssr(G, Cg, X, Y)
ssrh = ssr(H, Ch, X, Y)

def results(function, ssr, C):
    print('EQ(%s) = %.6f' % (function, ssr))
    for i in range(len(C)):
        print('C%d = %.6f' % (i, C[i]))

if ssrf <= ssrg and ssrf <= ssrh:
    results('f', ssrf, Cf)
elif ssrg <= ssrf and ssrg <= ssrh:
    results('g', ssrg, Cg)
else:
    results('h', ssrh, Ch)<jupyter_output>5
0.0 0.0 
1.0 4.0 
2.0 1.0 
3.0 6.0 
4.0 3.0
{'fraction_non_alphanumeric': 0.16556120251528986, 'fraction_numerical': 0.07502799552071669, 'mean_word_length': 3.306379821958457, 'pattern_counts': {'":': 0, '<': 35, '<?xml version=': 0, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '280894', 'license': 'MIT', 'n_tokens_mistral': 5698, 'n_tokens_neox': 5310, 'n_words': 1690, 'path': 'Listas/MNE_L03_VINICIUS_CANTUARIA_14_0165169.ipynb', 'repo_name': 'cantuariavc/metodos-numericos-para-engenharia', 'size': '11631'}