Lista 09 · Do problema ao sistema¶
Acompanha o capítulo 9.
Em cada exercício, a parte difícil é montar o sistema: nomear as incógnitas,
escrever uma equação por informação, arrumar e só então resolver com
np.linalg.solve. Antes de programar, escreva as equações no papel.
Como esta lista funciona
Abra o caderno no Colab, escreva a sua solução no lugar do # TODO e rode a
célula de teste logo abaixo. Ela mesma diz o que passou e o que falhou — você
não precisa esperar correção de ninguém.
O código de cada exercício também está aqui embaixo, caso você prefira colar num editor local. Os testes comparam números com tolerância.
Exercícios marcados com ✏️ são à mão, no papel, com 4 casas decimais — como na parte em papel das avaliações.
Exercício 01¶
✏️ À mão. Uma escola vendeu ingressos para um festival em três pontos de venda:
| ponto | VIP | regular | estudante | arrecadado |
|---|---|---|---|---|
| 1 | 20 | 35 | 40 | R$ 6.300 |
| 2 | 15 | 50 | 60 | R$ 7.050 |
| 3 | 30 | 40 | 50 | R$ 8.400 |
a) Nomeie as incógnitas (com a unidade) e escreva o sistema. Qual é a matriz \(A\) e o vetor \(b\)?
b) Alguém disse que os preços são R$ 150 (VIP), R$ 60 (regular) e R$ 30 (estudante). Confira, calculando \(A\,x\) à mão.
c) Se o ponto 3 tivesse vendido 35 VIP, 85 regulares e 100 estudantes, por R$ 13.350, dava para descobrir os preços com os pontos 1 e 3? Por quê? (Compare o ponto 3 novo com os pontos 1 e 2.)
Exercício 02¶
Cotidiano — a conta da pizzaria. Um grupo pediu 2 pizzas, 3 refrigerantes e 1
sobremesa. A pizza custa 4 vezes o refrigerante, e a sobremesa custa R$ 3 a mais que
o refrigerante. Escreva precos_lanche(total), que devolve o array
[pizza, refrigerante, sobremesa] a partir do total da conta.
Dica: "a sobremesa custa R$ 3 a mais que o refrigerante" vira uma equação com 3 do lado direito.
import numpy as np
def precos_lanche(total):
"""Preços (pizza, refrigerante, sobremesa) a partir do total da conta."""
# TODO: uma linha para a conta, uma para "pizza = 4 refri", uma para a sobremesa
A = np.array([[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]])
b = np.array([0.0, 0.0, 0.0])
return np.linalg.solve(A, b)
# --- testes (não altere) ---
p = precos_lanche(123.0)
for i in range(3):
assert abs(p[i] - [40, 10, 13][i]) < 1e-9, f"veio {p}"
p = precos_lanche(150.0)
esperado = [49.0, 12.25, 15.250000000000002]
for i in range(3):
assert abs(p[i] - esperado[i]) < 1e-9, f"com total 150, veio {p}"
print("Exercício 02: todos os testes passaram!")
Exercício 03¶
Indústria — o blend de café. Uma torrefação mistura três grãos:
| grão | preço (R$/kg) | cafeína |
|---|---|---|
| arábica | 40 | 1,2 % |
| robusta | 25 | 2,2 % |
| especial | 80 | 1,0 % |
Escreva mistura_cafe(total_kg, custo, cafeina_kg), que devolve os kg de cada grão
num lote com a massa total, o custo total e a massa de cafeína pedidos. Cuidado:
1,2 % é 0,012.
import numpy as np
def mistura_cafe(total_kg, custo, cafeina_kg):
"""kg de arábica, robusta e especial num lote com o total, o custo e a cafeína dados."""
# TODO: uma linha por informação (massa, custo, cafeína), uma coluna por grão
pass
# --- testes (não altere) ---
m = mistura_cafe(60.0, 2500.0, 0.9)
assert m is not None, "a função não devolveu nada"
for i in range(3):
assert abs(m[i] - [30, 20, 10][i]) < 1e-9, f"veio {m} (confira 1,2 % = 0.012)"
m = mistura_cafe(100.0, 4000.0, 1.4)
esperado = [70.2702702702703, 21.621621621621596, 8.108108108108098]
for i in range(3):
assert abs(m[i] - esperado[i]) < 1e-6, f"veio {m}"
print("Exercício 03: todos os testes passaram!")
Exercício 04¶
Telecom — o tráfego numa rede. Três roteadores: entram na rede 100 Mb/s pelo roteador R1. De R1 saem dois enlaces, um para R2 (\(x_1\)) e um para R3 (\(x_2\)). De R2 sai um enlace para R3 (\(x_3\)), e 30 Mb/s saem da rede por R2. O resto sai da rede por R3. O balanceador de carga de R1 manda para R2 1,5 vez o que manda para R3.
Em cada roteador, o que entra é o que sai. Escreva trafego(entrada, saida_r2, razao),
que devolve [x1, x2, x3] usando três informações: a conservação em R1, a
conservação em R2 e o balanceador.
Por que não usar também a conservação em R3? Escreva essa equação e mostre que ela é consequência das outras duas de conservação (some as três). Ela serve para conferir a resposta.
import numpy as np
def trafego(entrada, saida_r2, razao):
"""Tráfego (Mb/s) nos enlaces R1->R2, R1->R3 e R2->R3."""
# TODO: conservação em R1, conservação em R2 e o balanceador (x1 = razao * x2)
pass
# --- testes (não altere) ---
x = trafego(100.0, 30.0, 1.5)
assert x is not None, "a função não devolveu nada"
for i in range(3):
assert abs(x[i] - [60, 40, 30][i]) < 1e-9, f"veio {x}"
x = trafego(200.0, 50.0, 3.0)
esperado = [150.0, 50.0, 100.0]
for i in range(3):
assert abs(x[i] - esperado[i]) < 1e-9, f"veio {x}"
print("Exercício 04: todos os testes passaram!")
Exercício 05¶
Engenharia química — dois tanques. Vazões em L/min, em regime:
- no tanque 1 entram 4 L/min de uma solução com concentração
c_entrada(g/L) e 1 L/min que volta do tanque 2; saem 5 L/min para o tanque 2; - no tanque 2 entram os 5 L/min do tanque 1 e 3 L/min de água pura; saem 1 L/min de volta para o tanque 1 e 7 L/min para fora.
Em cada tanque, a massa que entra por minuto (vazão × concentração) é igual à que
sai. Escreva tanques(c_entrada), que devolve [c1, c2].
Confira as vazões antes: em cada tanque, os litros que entram somam o mesmo que os
que saem? Por que as duas concentrações têm de ser menores que c_entrada?
import numpy as np
def tanques(c_entrada):
"""Concentração (g/L) nos tanques 1 e 2, em regime."""
# TODO: massa que entra = massa que sai, em cada tanque; tudo com c1 e c2 à esquerda
pass
# --- testes (não altere) ---
c = tanques(25.0)
assert c is not None, "a função não devolveu nada"
esperado = [22.857142857142858, 14.285714285714286]
for i in range(2):
assert abs(c[i] - esperado[i]) < 1e-9, f"veio {c}"
assert c[0] < 25 and c[1] < c[0], "a água pura dilui: c2 < c1 < c_entrada"
c = tanques(7.0)
esperado = [6.4, 4.0]
for i in range(2):
assert abs(c[i] - esperado[i]) < 1e-9, f"veio {c}"
print("Exercício 05: todos os testes passaram!")
Exercício 06¶
Eletricidade — um circuito de duas malhas.
As correntes de malha \(i_1\) e \(i_2\) circulam no sentido horário. O resistor de 4 Ω é dividido pelas duas malhas: a corrente nele é \(i_1 - i_2\). A fonte \(v_1\) empurra a corrente no sentido horário da malha 1; a fonte \(v_2\) empurra contra o sentido horário da malha 2, e por isso entra com sinal negativo.
Escreva correntes(v1, v2), que devolve [i1, i2]. Confira o padrão do capítulo:
na diagonal, a soma dos resistores de cada malha; fora dela, menos o resistor
dividido.
import numpy as np
def correntes(v1, v2):
"""Correntes de malha [i1, i2] (A) do circuito de duas malhas."""
# TODO: lei das malhas em cada malha; abra os parênteses e arrume
pass
# --- testes (não altere) ---
i = correntes(12.0, 4.0)
assert i is not None, "a função não devolveu nada"
esperado = [2.6153846153846154, 0.9230769230769229]
for k in range(2):
assert abs(i[k] - esperado[k]) < 1e-9, f"veio {i}"
i = correntes(9.0, 0.0)
esperado = [2.423076923076923, 1.3846153846153844]
for k in range(2):
assert abs(i[k] - esperado[k]) < 1e-9, f"com v2 = 0, veio {i}"
print("Exercício 06: todos os testes passaram!")
Exercício 07¶
Física — a parábola por três medidas. Escreva parabola(t, v), que recebe três
instantes e três medidas e devolve [a, b, c] da parábola \(a\,t^2 + b\,t + c\) que
passa pelos três pontos. Cada ponto é uma linha: \(t_i^2\), \(t_i\) e 1 multiplicam \(a\),
\(b\) e \(c\).
Use-a com as medidas do foguete do capítulo (5, 8 e 12 s; 106,8, 177,2 e 279,2 m/s) e estime a velocidade em 10 s.
import numpy as np
def parabola(t, v):
"""Coeficientes [a, b, c] da parábola a t^2 + b t + c que passa por 3 pontos."""
# TODO: uma linha por ponto, com t^2, t e 1
pass
# --- testes (não altere) ---
c = parabola([0.0, 1.0, 2.0], [1.0, 2.0, 5.0])
assert c is not None, "a função não devolveu nada"
for i in range(3):
assert abs(c[i] - [1, 0, 1][i]) < 1e-9, f"veio {c}"
c = parabola([5.0, 8.0, 12.0], [106.8, 177.2, 279.2])
esperado = [0.29047619047619005, 19.690476190476193, 1.0857142857142679]
for i in range(3):
assert abs(c[i] - esperado[i]) < 1e-6, f"veio {c}"
print("Exercício 07: todos os testes passaram!")