En el artículo anterior te mostré cómo C# y el ecosistema .NET te puede ayudar a calcular derivadas mediante un caso realista, léelo antes que este para que lo entiendas 😉
En este artículo ampliaremos el programa de consola para generar una gráfica. Arrancamos!
Resaltaré el código que añadí al programa del artículo anterior.
Show me the code
Necesitarás las siguientes bibliotecas:
- MathNet.Symbolics
- MathNet.Numerics (si instalas Symbolics esta también será añadida automáticamente)
- ScottPlot
El código es el siguiente:
using MathNet.Symbolics;
using ScottPlot;
double gravedad = 9.8; // m/s² (hacia abajo)
double empujeNeto = 15.0; // m/s² (aceleración neta hacia arriba)
double aceleracionConstante = empujeNeto - gravedad; // 5.2 m/s² netos
// Grafica
double[] tiempos = Enumerable.Range(0, 100)
.Select(i => (double)i * 20 / 100)
.ToArray();
double[] posiciones = tiempos.Select(t => 0.5 * aceleracionConstante * t * t).ToArray();
double[] velocidades = tiempos.Select(t => aceleracionConstante * t).ToArray();
// Crear gráfico
var plot = new Plot();
plot.Title("Despegue de Cohete");
plot.XLabel("Tiempo (s)");
plot.YLabel("Posición (m) / Velocidad (m/s)");
// Añadir series
var scatterPos = plot.Add.Scatter(tiempos, posiciones);
scatterPos.LegendText = "Posición (m)";
scatterPos.Color = Colors.Blue;
var scatterVel = plot.Add.Scatter(tiempos, velocidades);
scatterVel.LegendText = "Velocidad (m/s)";
scatterVel.Color = Colors.Red;
plot.ShowLegend();
// Guardar imagen
plot.SavePng("despegue_cohete.png", 800, 600);
Console.WriteLine("Gráfica guardada como 'despegue_cohete.png'");
// 1. Análisis simbólico
var t = SymbolicExpression.Variable("t");
var posicion = 0.5 * aceleracionConstante * t * t; // s(t) = 1/2 * a * t² porque la velocidad inicial es 0
var velocidad = posicion.Differentiate(t); // v(t) = ds/dt (derivada de la posición respecto al tiempo te da velocidad)
var aceleracion = velocidad.Differentiate(t); // a(t) = dv/dt (derivada de la velocidad respecto al tiempo te da aceleracion)
Console.WriteLine("=== Análisis simbólico ===");
Console.WriteLine($"Posición: {posicion}");
Console.WriteLine($"Velocidad: {velocidad}");
Console.WriteLine($"Aceleración: {aceleracion}\n");
// 2. Análisis numérico
double tiempo = 10;
Func<double, double> funcionPosicion = t => 0.5 * aceleracionConstante * t * t;
double DerivarNumericamente(Func<double, double> f, double t, double h = 1e-5)
=> (f(t + h) - f(t - h)) / (2 * h); // Método de diferencias centradas para derivar numéricamente (basado en el Teorema de Taylor)
var velocidadNumerica = DerivarNumericamente(funcionPosicion, tiempo);
Func<double, double> funcionVelocidad = t => DerivarNumericamente(funcionPosicion, t);
var aceleracionNumerica = DerivarNumericamente(funcionVelocidad, tiempo);
Console.WriteLine("=== Análisis numérico ===");
Console.WriteLine($"En t = {tiempo} s:");
Console.WriteLine($"Posición: {funcionPosicion(tiempo):F2} m");
Console.WriteLine($"Velocidad: {velocidadNumerica:F2} m/s");
Console.WriteLine($"Aceleración: {aceleracionNumerica:F2} m/s²\n");
Lo cual te dará como resultado dos cosas:
En la consola:

En la carpeta de tu proyecto:

Así que allí lo tienes estimado dev, misión cumplida! 🔥🥳
Si esta entrada te ha gustado, compártela!
Créditos de imagen de portada: Basado en Foto de Iván Díaz en Unsplash
