public static void Main()
double z0 = ShootingMethod(x0, y0, xFinal, yTarget, h);
Console.WriteLine("El valor inicial necesario para g'(0) es:" + z0);
Console.WriteLine("No se encontró una solución dentro del límite de iteraciones.");
public static double ShootingMethod(double x0, double y0, double xFinal, double yTarget, double h)
double yLow = SolveWithRungeKutta(x0, y0, zLow, xFinal, h);
double yHigh = SolveWithRungeKutta(x0, y0, zHigh, xFinal, h);
while (Math.Abs(yHigh - yTarget) > tolerance && iteration < maxIterations)
double zMid = (zLow + zHigh) / 2.0;
double yMid = SolveWithRungeKutta(x0, y0, zMid, xFinal, h);
if ((yMid - yTarget) * (yLow - yTarget) < 0)
if (iteration == maxIterations)
return (zLow + zHigh) / 2.0;
public static double SolveWithRungeKutta(double x0, double y0, double z0, double xFinal, double h)
double k1_y = h * FunctionY(x, y, z);
double k1_z = h * FunctionZ(x, y, z);
double k2_y = h * FunctionY(x + h / 2, y + k1_y / 2, z + k1_z / 2);
double k2_z = h * FunctionZ(x + h / 2, y + k1_y / 2, z + k1_z / 2);
double k3_y = h * FunctionY(x + h / 2, y + k2_y / 2, z + k2_z / 2);
double k3_z = h * FunctionZ(x + h / 2, y + k2_y / 2, z + k2_z / 2);
double k4_y = h * FunctionY(x + h, y + k3_y, z + k3_z);
double k4_z = h * FunctionZ(x + h, y + k3_y, z + k3_z);
y += (k1_y + 2 * k2_y + 2 * k3_y + k4_y) / 6;
z += (k1_z + 2 * k2_z + 2 * k3_z + k4_z) / 6;
public static double FunctionY(double x, double y, double z)
public static double FunctionZ(double x, double y, double z)