<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_variation(self,order=1,first_order=None, first_order_2=None, testparticle=-1):
 """ This function adds a set of variational particles to the simulation. If there are N real particles in the simulation, this functions adds N additional variational particles. To see how many particles (real and variational) are in a simulation, use ``'sim.N'``. To see how many variational particles are in a simulation use ``'sim.N_var'``. Currently Leapfrog, WHFast and IAS15 support first order variational equations. IAS15 also supports second order variational equations. Parameters order : integer, optional By default the function adds a set of first order variational particles to the simulation. Set this flag to 2 for second order. first_order : Variation, optional Second order variational equations depend on their corresponding first order variational equations. This parameter expects the Variation object corresponding to the first order variational equations. first_order_2 : Variation, optional Same as first_order. But allows to set two different indicies to calculate off-diagonal elements. If omitted, then first_order will be used for both first order equations. testparticle : int, optional If set to a value >= 0, then only one variational particle will be added and be treated as a test particle. Returns ------- Returns Variation object (a copy--you can only modify it through its particles property or vary method). """

        cur_var_config_N = self.var_config_N
        if order==1:
            index = clibrebound.reb_add_var_1st_order(byref(self),c_int(testparticle))
        elif order==2:
            if first_order is None:
                raise AttributeError("Please specify corresponding first order variational equations when initializing second order variational equations.")
            if first_order_2 is None:
                first_order_2 = first_order
            index = clibrebound.reb_add_var_2nd_order(byref(self),c_int(testparticle),c_int(first_order.index),c_int(first_order_2.index))
        else:
            raise AttributeError("Only variational equations of first and second order are supported.")

        # Need a copy because location of original might shift if more variations added
        s = Variation.from_buffer_copy(self.var_config[cur_var_config_N])

        return s