import { useState, useEffect, useCallback } from 'react'; import { Button } from '../../ui/Button'; import { Input } from '../../ui/Input'; import { Card, CardHeader } from '../../ui/Card'; interface UtilidadTotalVsMarginalProps { ejercicioId: string; onComplete?: (puntuacion: number) => void; } interface FilaDatos { cantidad: number; utilidadTotal: number; utilidadMarginal: number | null; } const datosBase: Omit[] = [ { cantidad: 0, utilidadTotal: 0 }, { cantidad: 1, utilidadTotal: 10 }, { cantidad: 2, utilidadTotal: 18 }, { cantidad: 3, utilidadTotal: 24 }, { cantidad: 4, utilidadTotal: 28 }, { cantidad: 5, utilidadTotal: 30 }, { cantidad: 6, utilidadTotal: 30 }, { cantidad: 7, utilidadTotal: 28 }, ]; export function UtilidadTotalVsMarginal({ ejercicioId: _ejercicioId, onComplete }: UtilidadTotalVsMarginalProps) { const [respuestas, setRespuestas] = useState>({}); const [verificadas, setVerificadas] = useState>({}); const [mostrarGrafico, setMostrarGrafico] = useState(false); const [mostrarExplicacion, setMostrarExplicacion] = useState(false); const datosCompletos: FilaDatos[] = datosBase.map((fila, index) => ({ ...fila, utilidadMarginal: index === 0 ? null : fila.utilidadTotal - datosBase[index - 1].utilidadTotal })); const calcularUMg = useCallback((q: number) => { const fila = datosCompletos.find(d => d.cantidad === q); return fila?.utilidadMarginal ?? 0; }, [datosCompletos]); const handleRespuesta = (cantidad: number, valor: string) => { setRespuestas(prev => ({ ...prev, [cantidad]: valor })); setVerificadas(prev => ({ ...prev, [cantidad]: false })); }; const verificarRespuesta = (cantidad: number) => { const respuesta = parseFloat(respuestas[cantidad]); const correcta = calcularUMg(cantidad); const esCorrecta = Math.abs(respuesta - correcta) < 0.1; setVerificadas(prev => ({ ...prev, [cantidad]: esCorrecta })); const todasCorrectas = datosCompletos .filter(d => d.cantidad > 0) .every(d => { const r = parseFloat(respuestas[d.cantidad]); return Math.abs(r - calcularUMg(d.cantidad)) < 0.1; }); if (todasCorrectas && onComplete) { onComplete(100); } }; const puntaje = Object.values(verificadas).filter(Boolean).length; const total = datosCompletos.length - 1; const porcentaje = Math.round((puntaje / total) * 100); const maxUT = Math.max(...datosCompletos.map(d => d.utilidadTotal)); const maxQ = Math.max(...datosCompletos.map(d => d.cantidad)); return (

Conceptos Clave

  • Utilidad Total (UT): Satisfacción total obtenida de consumir Q unidades de un bien.
  • Utilidad Marginal (UMg): Utilidad adicional obtenida de consumir una unidad más.
  • Fórmula: UMg = ΔUT / ΔQ = UT(Q) - UT(Q-1)
{datosCompletos.map((fila) => ( ))}
Cantidad (Q) Utilidad Total (UT) Calcular UMg Estado
{fila.cantidad} {fila.utilidadTotal} {fila.cantidad === 0 ? ( N/A (punto de partida) ) : (
handleRespuesta(fila.cantidad, e.target.value)} className="w-24" placeholder="UMg" />
)}
{verificadas[fila.cantidad] === true && ( ✓ Correcto )} {verificadas[fila.cantidad] === false && ( ✗ Incorrecto )} {fila.cantidad > 0 && verificadas[fila.cantidad] === undefined && ( - )}

Progreso: {puntaje}/{total} correctas ({porcentaje}%)

{mostrarGrafico && (

Gráfico de Utilidad Total

Cantidad (Q) Utilidad Total {datosCompletos.map((d, i) => { const x = 60 + (d.cantidad / maxQ) * 300; const y = 210 - (d.utilidadTotal / maxUT) * 180; return ( {d.utilidadTotal} {d.cantidad} ); })} { const x = 60 + (d.cantidad / maxQ) * 300; const y = 210 - (d.utilidadTotal / maxUT) * 180; return `${x},${y}`; }).join(' ')} fill="none" stroke="#3b82f6" strokeWidth="2" />

Observa cómo la curva de utilidad total aumenta a tasas decrecientes hasta alcanzar su máximo en Q=5 y Q=6.

)} {mostrarExplicacion && (

Cálculo paso a paso:

{datosCompletos.filter(d => d.cantidad > 0).map((fila) => (

Q={fila.cantidad}: UMg = UT({fila.cantidad}) - UT({fila.cantidad - 1}) = {fila.utilidadTotal} - {datosCompletos[fila.cantidad - 1].utilidadTotal} = {fila.utilidadMarginal}

))}

Puntos importantes:

  • La UMg es positiva mientras la UT esté aumentando (Q=1 a 5)
  • La UMg es cero cuando la UT es máxima (Q=6)
  • La UMg es negativa cuando la UT disminuye (Q=7)
)}
); } export default UtilidadTotalVsMarginal;