Ejemplo n.º 1
0
    def ODE_penalty_solver(self,u,N,m):
        """
        Solving the state equation with partitioning

        Arguments:
        * u: the control
        * N: Number of discritization points
        * m: Number of intervals we partition time in
        """
        T = self.T
        y0 = self.y0
        dt = float(T)/N
        y = partition_func(N+1,m)

        y[0][0]=y0
        for i in range(1,m):
            y[i][0] = u[N+i]

        start=0
        for i in range(m):        
            for j in range(len(y[i])-1):
                y[i][j+1] = self.ODE_update(y[i],u,j,start+j,dt)
            start = start + len(y[i]) - 1
            

        Y = np.zeros(N+1)
        start = 0
        for i in range(m):
            Y[start:start+len(y[i])-1] = y[i][:-1]
            start = start + len(y[i]) - 1
        Y[-1] = y[-1][-1]
            
        return y,Y
Ejemplo n.º 2
0
    def ODE_penalty_solver(self,u,N,m):
        """
        Solving the state equation with partitioning

        Arguments:
        * u: the control
        * N: Number of discritization points
        * m: Number of intervals we partition time in
        """
        T = self.T
        y0 = self.y0
        dt = float(T)/N
        y = partition_func(N+1,m)

        y[0][0]=y0
        for i in range(1,m):
            y[i][0] = u[-m+i]
        
        Nc = len(u)-m
        start=0
        u_send = u[:Nc+1]
        for i in range(m):        
            for j in range(len(y[i])-1):
                y[i][j+1] = self.ODE_update(y[i],u_send,j,start+j,dt)
            start = start + len(y[i]) - 1
            

        Y = np.zeros(N+1)
        """
        start = 0
        for i in range(m):
            Y[start:start+len(y[i])-1] = y[i][:-1]
            start = start + len(y[i]) - 1
        Y[-1] = y[-1][-1]
        """
        Y[0] = y[0][0]
        start = 1
        for i in range(m):
            Y[start:start+len(y[i])-1] = y[i][1:]
            start = start + len(y[i]) - 1
        #"""

        diff_vals = np.zeros(m-1)
        for i in range(m-1):
            diff_vals = (y[i+1][0]-y[i][-1])

        self.jump_diff = np.max(abs(diff_vals))
        return y,Y
Ejemplo n.º 3
0
    def adjoint_penalty_solver(self,u,N,m,my,init=initial_penalty):
        """
        Solving the adjoint equation using finite difference, and partitioning
        the time interval.

        Arguments:
        * u: the control
        * N: Number of discritization points
        * m: Number of intervals we partition time in
        """

        T = self.T
        y0 = self.y0
        dt = float(T)/N
        yT = self.yT
        
        
        l = partition_func(N+1,m)
        y,Y = self.ODE_penalty_solver(u,N,m)

            
        l[-1][-1] = self.initial_adjoint(y[-1][-1])
        for i in range(m-1):
            l[i][-1]=init(self,y,u,my,N,i,m) #my*(y[i][-1]-u[N+1+i])
            
        for i in range(m):
            self.t = self.T_z[i]
            for j in range(len(l[i])-1):
                l[i][-(j+2)] = self.adjoint_update(l[i],y[i],j,dt)
        self.t=np.linspace(0,T,N+1)
        L=self.serial_gather(l,N,m)#np.zeros(N+1)
        """
        start=0
        for i in range(m):
            L[start:start+len(l[i])-1] = l[i][:-1]
            start = start + len(l[i])-1
        L[-1]=l[-1][-1]
        ""
        L[0] = l[0][0]
        start = 1
        for i in range(m):
            L[start:start+len(l[i])-1] = l[i][1:]
            start += len(l[i])-1
        
        #"""
        return l,L
Ejemplo n.º 4
0
    def adjoint_penalty_solver(self,u,N,m,my,init=initial_penalty):
        """
        Solving the adjoint equation using finite difference, and partitioning
        the time interval.

        Arguments:
        * u: the control
        * N: Number of discritization points
        * m: Number of intervals we partition time in
        """

        T = self.T
        y0 = self.y0
        dt = float(T)/N
        yT = self.yT
        
        
        l = partition_func(N+1,m)
        y,Y = self.ODE_penalty_solver(u,N,m)

            
        l[-1][-1] = self.initial_adjoint(y[-1][-1])
        for i in range(m-1):
            l[i][-1]=init(self,y,u,my,N,i) #my*(y[i][-1]-u[N+1+i])
            
        for i in range(m):
            for j in range(len(l[i])-1):
                l[i][-(j+2)] = self.adjoint_update(l[i],y[i],j,dt)
            
        L=np.zeros(N+1)
            
        start=0
        for i in range(m):
            L[start:start+len(l[i])-1] = l[i][:-1]
            start = start + len(l[i])-1
        L[-1]=l[-1][-1]
        
        import matplotlib.pyplot as plt
        
        
        return l,L