static void Main(string[] args)
Console.WriteLine("Reto 15 Ulises Hernández Treviño");
Console.WriteLine("--------------------------------");
Console.WriteLine("Seleccione el problema a resolver:");
Console.WriteLine("1. Encontrar valor de la variable de la ecuacion cuando (y(2)=7, y'(2)=0)");
Console.WriteLine("2. Ecuacion diferencial cuando (y(-1)=-6, y(5)=10)");
Console.Write("Eliga el problema que desea resolver (1 o 2): ");
while (!int.TryParse(Console.ReadLine(), out opcion) || (opcion != 1 && opcion != 2))
Console.Write("Solamente esta disponible la opcion 1 o 2: ");
Console.WriteLine("\nPresione cualquier tecla para terminar el programa.");
static void ResolverProblema1()
double y, yy, k1, k2, k3, k4, ky1, ky2, ky3, ky4;
double x = 2, paso = 0.001;
Console.WriteLine("\nPrograma 1: d²y/dx² = -4y + sin(x)");
Console.WriteLine($"Condiciones iniciales: y({x}) = {y}, y'({x}) = {yy}");
Console.WriteLine($"Buscando y({xFinal})");
ky1 = paso * (-4 * y + Math.Sin(x));
ky2 = paso * (-4 * (y + k1/2) + Math.Sin(x + paso/2));
k2 = paso * (yy + ky1/2);
ky3 = paso * (-4 * (y + k2/2) + Math.Sin(x + paso/2));
k3 = paso * (yy + ky2/2);
ky4 = paso * (-4 * (y + k3) + Math.Sin(x + paso));
y = y + (k1 + 2*k2 + 2*k3 + k4)/6;
yy = yy + (ky1 + 2*ky2 + 2*ky3 + ky4)/6;
Console.WriteLine($"\nResultado obtenido:");
Console.WriteLine($"y({xFinal}) = {y:F6}");
Console.WriteLine($"y'({xFinal}) = {yy:F6}");
static void ResolverProblema2()
double y, yy, k1, k2, k3, k4, ky1, ky2, ky3, ky4;
double criterio, criterio1 = 0, criterio2;
double yy1, yy2, yyInicial;
double x = -1, paso = 0.001;
double xFinal = 5, yFinal = 10;
Console.WriteLine("\nPrograma 2: d²y/dx² = -4y + sin(x)");
Console.WriteLine($"Condiciones: y({x}) = -6, y({xFinal}) = {yFinal}");
ky1 = paso * (-4 * y + Math.Sin(x));
ky2 = paso * (-4 * (y + k1/2) + Math.Sin(x + paso/2));
k2 = paso * (yy + ky1/2);
ky3 = paso * (-4 * (y + k2/2) + Math.Sin(x + paso/2));
k3 = paso * (yy + ky2/2);
ky4 = paso * (-4 * (y + k3) + Math.Sin(x + paso));
y = y + (k1 + 2*k2 + 2*k3 + k4)/6;
yy = yy + (ky1 + 2*ky2 + 2*ky3 + ky4)/6;
while (criterio * criterio2 > 0)
ky1 = paso * (-4 * y + Math.Sin(x));
ky2 = paso * (-4 * (y + k1/2) + Math.Sin(x + paso/2));
k2 = paso * (yy + ky1/2);
ky3 = paso * (-4 * (y + k2/2) + Math.Sin(x + paso/2));
k3 = paso * (yy + ky2/2);
ky4 = paso * (-4 * (y + k3) + Math.Sin(x + paso));
y = y + (k1 + 2*k2 + 2*k3 + k4)/6;
yy = yy + (ky1 + 2*ky2 + 2*ky3 + ky4)/6;
while (Math.Abs(criterio) > 0.00001)
yyInicial = (yy1 + yy2)/2;
ky1 = paso * (-4 * y + Math.Sin(x));
ky2 = paso * (-4 * (y + k1/2) + Math.Sin(x + paso/2));
k2 = paso * (yy + ky1/2);
ky3 = paso * (-4 * (y + k2/2) + Math.Sin(x + paso/2));
k3 = paso * (yy + ky2/2);
ky4 = paso * (-4 * (y + k3) + Math.Sin(x + paso));
y = y + (k1 + 2*k2 + 2*k3 + k4)/6;
yy = yy + (ky1 + 2*ky2 + 2*ky3 + ky4)/6;
if (criterio * criterio2 < 0)
Console.WriteLine($"\nResultado obtenido:");
Console.WriteLine($"El valor de y'({x}) requerido es: {yyInicial:F6}");