Cálculo Diferencial con C#: Graficando Derivadas con ScottPlot
Añade gráficos a tus derivadas y sé un ingeniero estupendo 🚀

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *