We created a custom double pendulum writing the VEX code from scratch. The point at the top is fixed where mass 1 and mass 2 are updated using the Explicit Euler method.
// get gravity
f@get_gravity = point(0, "gravity", 1);
// get length and angle and mass and omega of first pendulum
f@get_length_1 = point(0, "len_1", 1);
f@get_angle_1 = point(0, "theta_1", 1);
f@get_mass_1 = point(0, "mass_1", 1);
f@get_omega_1 = point(0, "omega_1", 1);
// get length and angle and mass and omega of second pendulum
f@get_length_2 = point(0, "len_2", 2);
f@get_angle_2 = point(0, "theta_2", 2);
f@get_mass_2 = point(0, "mass_2", 2);
f@get_omega_2 = point(0, "omega_2", 2);
// First Pendulum
if (@ptnum == 1)
{
// Explicit Euler Theta 1 Update
f@theta_1 += f@omega_1 * f@TimeInc;
// Omega 1 denominator
f@denom_1 = f@get_length_1 * (2.0 * f@get_mass_1 + f@get_mass_2 - f@get_mass_2 * cos(2.0 * f@get_angle_1 - 2.0 * f@get_angle_2));
// Omega 1 numerator
f@num_1 = -f@get_gravity * (2.0 * f@get_mass_1 + f@get_mass_2) * sin(f@get_angle_1);
f@num_1 = f@num_1 - f@get_mass_2 * f@get_gravity * sin(f@get_angle_1 - 2.0 * f@get_angle_2);
f@num_1 = f@num_1 - 2.0 * sin(f@get_angle_1 - f@get_angle_2) * f@get_mass_2 * (f@get_omega_2 * f@get_omega_2 * f@get_length_2 + f@get_omega_1 * f@get_omega_1 * f@get_length_1 * cos(f@get_angle_1 - f@get_angle_2));
// Explicit Euler Omega 1 Update
f@omega_1 += (f@num_1/f@denom_1) * f@TimeInc;
// Convert to Cartesian Coordinates
@P.x = f@get_length_1 * sin(f@theta_1);
@P.y = -f@get_length_1 * cos(f@theta_1);
}
if (@ptnum == 2)
{
// Explicit Euler Theta 2 Update
f@theta_2 += f@omega_2 * f@TimeInc;
// Omega 2 denominator
f@denom_2 = f@get_length_2 * (2.0 * f@get_mass_1 + f@get_mass_2 - f@get_mass_2 * cos(2.0 * f@get_angle_1 - 2.0 * f@get_angle_2));
// Omega 2 numerator
f@num_2 = 2.0 * sin(f@get_angle_1 - f@get_angle_2);
f@num_2 = f@num_2 * (f@get_omega_1 * f@get_omega_1 * f@get_length_1 * (f@get_mass_1 + f@get_mass_2) + f@get_gravity * (f@get_mass_1 + f@get_mass_2) * cos(f@get_angle_1) + f@get_omega_2 * f@get_omega_2 * f@get_length_2 * f@get_mass_2 * cos(f@get_angle_1 - f@get_angle_2));
// Explicit Euler Omega 2 Update
f@omega_2 += (f@num_2/f@denom_2) * f@TimeInc;
// Convert to Cartesian Coordinates
@P.x = f@get_length_2 * sin(f@theta_2) + f@get_length_1 * sin(f@get_angle_1);
@P.y = -f@get_length_2 * cos(f@theta_2) - f@get_length_1 * cos(f@get_angle_1);
}