Desafio de Gestão Rural

Um produtor rural de Campo Mourão possui uma propriedade de 100 hectares e deseja definir quantos hectares serão destinados ao cultivo de soja (\(x\)) e milho (\(y\)), com o objetivo de maximizar o lucro (\(Z\)) obtido com a produção. Para tanto, ele deve levar em consideração que cada hectare cultivado com soja gera um lucro estimado de R$ 500, enquanto para o milho, o lucro é de R$ 400 por hectare. Além disso, para realizar o plantio, são necessários alguns recursos agrícolas, cuja disponibilidade é limitada:

Determine graficamente a solução ótima do problema.

Instrução: Utilize o controle deslizante para mover a curva de nível da função lucro até a maior posição possível sem que ela deixe a região viável (destacada em verde). O ponto de contato corresponde à solução ótima do problema.

Renderizando Gráfico...

Meta de LucroR$ 0,00
Situação da Meta---
Trator

\( 3x + 2y \le 240 \): Determina o limite de horas operacionais.

Insumos

\( 2x + 4y \le 320 \): Limita a quantidade de fertilizante em estoque.

Explicação Matemática

Este gráfico representa uma aplicação da Programação Linear, técnica matemática amplamente utilizada em problemas de otimização e tomada de decisão. Por meio dela, é possível analisar restrições de recursos e determinar a melhor solução para maximizar ou minimizar uma determinada medida de interesse, como lucro, custo, tempo ou produção.

Matematicamente, considerando as variáveis de decisão \(x\) e \(y\), que representam os hectares destinados aos plantios de soja e milho, respectivamente, o problema pode ser formulado como o seguinte Problema de Programação Linear (PPL):

Maximizar:
\( Z = 500x + 400y \)

Sujeito a:
\( 3x + 2y \le 240 \)     (Restrição de Trator)
\( 2x + 4y \le 320 \)     (Restrição de Fertilizante)
\( x + y \le 100 \)         (Restrição de Área)
\( x \ge 0, y \ge 0 \)       (Condição de não-negatividade)

Entendendo o Gráfico

O gráfico gerado representa visualmente o problema de otimização da produção rural acima. Nele, você pode explorar como diferentes combinações de plantio afetam o lucro total, respeitando as limitações de recursos. Abaixo, explicamos detalhadamente cada elemento presente:

1. Área Viável (Região Verde)

A área destacada em verde representa todas as combinações possíveis de hectares de Soja (\(x\)) e Milho (\(y\)) que respeitam todas as restrições simultaneamente. Qualquer ponto dentro desta região verde é uma solução viável para o produtor. Os pontos fora dela violam pelo menos uma das restrições e não são possíveis de serem implementados na prática.

2. Retas de Restrição (Linhas de Demarcação)

Cada linha colorida representa um limite de recurso. As combinações de produção devem ficar abaixo ou acima destas linhas, dependendo da restrição:

  • 🔶 Linha Laranja (\(3x + 2y = 240\)): Representa o limite de Horas de Trator. A região viável está abaixo desta linha, pois o total de horas não pode ultrapassar 240.
  • 🔷 Linha Azul (\(2x + 4y = 320\)): Representa o limite de Fertilizante. A região viável está abaixo desta linha, já que o consumo não pode exceder 320 kg.
  • ⛁ Linha Marrom (\(x + y = 100\)): Representa o limite de Área Total. A região viável está abaixo desta linha, pois não se pode plantar mais do que 100 hectares.

3. Pontos Vértices (Círculos Amarelos)

Os pontos amarelos indicam os vértices da região viável. Estes pontos são extremamente importantes porque a solução ótima (lucro máximo) sempre estará em um desses vértices. Os vértices identificados são:

  • (0, 0): Plantar nada (lucro zero).
  • (0, 80): Plantar apenas Milho (80 hectares).
  • (80, 0): Plantar apenas Soja (80 hectares).
  • (40, 60): Plantar 40 hectares de Soja e 60 de Milho.
    Como chegamos neste valor? Este vértice é exatamente o ponto de cruzamento entre a restrição do Trator (\(3x + 2y = 240\)) e a dos Insumos (\(2x + 4y = 320\)). Resolvendo o sistema matemático com essas duas equações (por exemplo, multiplicando a primeira por -2 e somando com a segunda), obtemos \(-4x = -160\), logo \(x = 40\). Substituindo o valor de \(x\), encontramos \(y = 60\).

4. Ponto Ótimo (Estrela Verde)

A ★ estrela verde marca o ponto de lucro máximo encontrado: (40, 60), correspondendo a 40 hectares de Soja e 60 hectares de Milho, gerando um lucro total de R$ 44.000,00. Este é o ponto que você deve buscar alcançar movendo o slider da meta de lucro.

5. Reta de Nível (Linha Vermelha)

A linha vermelha representa a Reta de Nível do Lucro (Z) para o valor selecionado no slider. Conforme você arrasta o slider, esta linha se move:

  • \(Z\) = R$ 44.000 (ótimo): A linha vermelha toca exatamente o vértice (40, 60) - o ponto da estrela verde.
  • \(Z\) < R$ 44.000: A linha vermelha está cruzando a região verde - significa que você ainda pode aumentar o lucro.
  • \(Z\) > R$ 44.000: A linha vermelha está totalmente fora da região verde - significa que esta meta de lucro é impossível de alcançar com os recursos atuais.
Dica Importante: Para encontrar a solução ótima na prática, mova o slider até que a linha vermelha esteja o mais distante possível da origem \((0, 0)\), mas ainda tocando a borda da região verde!

6. Interpretação dos Valores

Os números nos eixos representam hectares plantados:

  • Eixo X (horizontal): Quantidade de hectares plantados com Soja \((x)\).
  • Eixo Y (vertical): Quantidade de hectares plantados com Milho \((y)\).

O painel de status abaixo do slider mostra se a meta de lucro atual é atingível (SUB-ÓTIMO), ótima (META ÓTIMA!) ou impossível (RECURSO INSUFICIENTE), ajudando você a entender visualmente o comportamento da função objetivo.

packages = ["matplotlib", "numpy"] import matplotlib.pyplot as plt import numpy as np from pyscript import display from js import document def atualizar(event=None): plt.close('all') z_alvo = float(document.getElementById("lucro_slider").value) # Criando a figura com tamanho responsivo fig = plt.figure(figsize=(8, 6), facecolor='white', dpi=100) x_range = np.linspace(-10, 110, 100) X, Y = np.meshgrid(x_range, x_range) mask = (3*X + 2*Y <= 240) & (2*X + 4*Y <= 320) & (X + Y <= 100) & (X >= 0) & (Y >= 0) # --- GRÁFICO 2D --- ax = fig.add_subplot(1, 1, 1) # Plotando as restrições ax.plot(x_range, (240 - 3*x_range)/2, color='#fb8c00', lw=2) ax.text(78, 2, "3x+2y=240", color='#ef6c00', fontsize=8, fontweight='bold') ax.plot(x_range, (320 - 2*x_range)/4, color='#1e88e5', lw=2) ax.text(2, 78, "2x+4y=320", color='#1565c0', fontsize=8, fontweight='bold') # Plotando a restrição de área ax.plot(x_range, 100 - x_range, color='#795548', lw=2, linestyle='--') ax.text(80, 15, "x+y=100", color='#5d4037', fontsize=8, fontweight='bold') # Área viável ax.contourf(X, Y, mask, levels=[0.5, 1], colors=['#e8f5e9'], alpha=0.9) # Reta de nível do lucro y_lucro = (z_alvo - 500*x_range) / 400 ax.plot(x_range, y_lucro, color='#d32f2f', lw=3, label=f'Z = R$ {z_alvo:,.0f}') # Destacando a Origem e os eixos ax.axhline(0, color='black', linewidth=1.5, zorder=3) ax.axvline(0, color='black', linewidth=1.5, zorder=3) # Marcando os vértices vertices = [(0, 0), (0, 80), (40, 60), (80, 0)] for x, y in vertices: if x >= 0 and y >= 0 and x <= 100 and y <= 100: ax.scatter(x, y, color='#fbc02d', s=100, edgecolors='black', zorder=5) # Deslocando um pouco o texto da origem para não sobrepor as linhas offset = (5, 5) if (x,y) != (0,0) else (-25, -15) ax.annotate(f'({x},{y})', (x, y), xytext=offset, textcoords='offset points', fontsize=8) # Destacando o ponto ótimo ax.scatter(40, 60, color='green', s=150, edgecolors='black', zorder=5, marker='*') ax.annotate('ÓTIMO\n(40,60)', (40, 60), xytext=(10, 10), textcoords='offset points', fontsize=9, fontweight='bold', color='green') # Limites estendidos para mostrar quadrantes negativos ax.set_xlim(-10, 110) ax.set_ylim(-10, 110) ax.set_xlabel('Soja (hectares)', fontsize=10, fontweight='bold') ax.set_ylabel('Milho (hectares)', fontsize=10, fontweight='bold') ax.set_title(f'Análise Gráfica - Reta de Nível Z = R$ {z_alvo:,.0f}', fontsize=12, fontweight='bold', pad=15) ax.grid(True, alpha=0.3) ax.legend(loc='upper right', fontsize=9) # Ajustando layout para melhor visualização plt.tight_layout() # Lógica de Status Educativa status_el = document.getElementById("val-status") if abs(z_alvo - 44000) < 100: txt, cor = "🏆 META ÓTIMA!", "#1b5e20" elif z_alvo < 44000: txt, cor = "⚠️ SUB-ÓTIMO (Aumente o lucro)", "#f57f17" else: txt, cor = "❌ IMPOSSÍVEL (Recurso insuficiente)", "#b71c1c" document.getElementById("val-z").innerText = f"R$ {z_alvo:,.2f}" status_el.innerText = txt status_el.style.color = cor target = document.getElementById("output_grafico") target.innerHTML = "" display(fig, target="#output_grafico") atualizar()