Pular para conteúdo

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.

Abrir no Colab

Baixar o caderno

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.

precos_lanche(123.0)    # -> [40. 10. 13.]
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.

mistura_cafe(60.0, 2500.0, 0.9)    # -> [30. 20. 10.]
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.

trafego(100.0, 30.0, 1.5)    # -> [60. 40. 30.]

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.

  ┌──── 2 Ω ────┬──── 3 Ω ────┐
  │             │             │
(v1)    i1     4 Ω     i2    (v2)
  │             │             │
  └─────────────┴─────────────┘

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\).

parabola([0.0, 1.0, 2.0], [1.0, 2.0, 5.0])    # -> [1. 0. 1.]  (t² + 1)

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!")