コード例 #1
0
def check_exact():

    y0 = 3.2
    yT = 10.5
    T = 10
    a = -2

    problem = create_simple_CN_problem(y0, yT, T, a, c=20)
    problem.c = 20
    #problem = non_lin_problem(y0,yT,T,a,2,func=lambda x : 0*x)

    N = 100 * T

    ue, t, _ = problem.simple_problem_exact_solution(N)

    res = problem.solve(N, Lbfgs_options={'jtol': 1e-10})
    res2 = problem.PPCLBFGSsolve(N,
                                 80, [10000, 200000],
                                 tol_list=[1e-5, 1e-8, 1e-8],
                                 options={'jtol': 1e-5})[-1]
    val1 = problem.Functional(ue, N)
    val2 = problem.Functional(res.x, N)
    print val1, val2, val1 - val2
    print res.counter(), res2.counter()
    u0 = res.x[-1]
    y = problem.ODE_solver(res.x, N)
    u_test = lambda x: u0 * np.exp(a * (T - t))
    print max(abs(res.x[1:-1] - ue[1:-1])), np.sqrt(
        trapz((res.x[1:-1] - ue[1:-1])**2,
              t[1:-1])), max(abs(res2.x[1:N] - ue[1:-1]))
    plt.plot(t, ue + 20, '--')
    plt.plot(t, res.x)
    plt.plot(t, res2.x[:N + 1])
    #plt.plot(t,u_test(t),'.')
    plt.show()
コード例 #2
0
def main():

    y0 = 3.2
    yT=11.5
    a = -0.097
    T=100
    problem = create_simple_CN_problem(y0,yT,T,a)

    N = 1000
    ue,t,_ = problem.simple_problem_exact_solution(N)
    seq_res = problem.solve(N,Lbfgs_options={'jtol':1e-7})
    MU = [0.01*N,0.1*N,N,10*N,100*N,100000*N,10000000*N]

    Ls = seq_res.counter()[0]+seq_res.counter()[1]
    
    m = 16
    table = {'err':[],'L':[],'S':[],'err2':[],'L2':[],'S2':[]}

    for i in range(len(MU)):

        res1 = problem.PPCLBFGSsolve(N,m,[MU[i]],tol_list=[1e-5,1e-5],options = {'jtol':1e-5})
        #res2 = problem.penalty_solve(N,m,[MU[i]],Lbfgs_options={'jtol':1e-5})
        res2=res1
        err1=np.sqrt(trapz((res1.x[1:N]-ue[1:-1])**2,t[1:-1]))/np.sqrt(trapz(ue**2,t))
        err2=np.sqrt(trapz((res2.x[1:N]-ue[1:-1])**2,t[1:-1]))/np.sqrt(trapz(ue**2,t))

        L1 = res1.counter()[1]+res1.counter()[0]
        L2 = res2.counter()[1]+res2.counter()[0]

        table['err'].append(err1)
        table['err2'].append(err2)
        table['L'].append(L1)
        table['L2'].append(L2)
        table['S'].append(m*Ls/float(L1))
        table['S2'].append(m*Ls/float(L2))

    print Ls, np.sqrt(trapz((seq_res.x[1:-1]-ue[1:-1])**2,t[1:-1]))/np.sqrt(trapz(ue**2,t))
    data = pd.DataFrame(table,index=MU)
    res3 = problem.PPCLBFGSsolve(N,m,[100*N,1000000*N,10000000*N],tol_list=[1e-5,1e-5])
    print res3[-1].counter(),res3[0].counter(),np.sqrt(trapz((res3[-1].x[1:N]-ue[1:-1])**2,t[1:-1]))/np.sqrt(trapz(ue**2,t))


    #data.to_latex('report/draft/parareal/mu_test2.tex')
    print data


    m = 16 

    res2mu = problem.PPCLBFGSsolve(N,m,[100*N,100000*N],tol_list=[1e-5,1e-5],options = {'jtol':1e-5})

    mu2err1 = table['err'][4]
    mu2err2 = np.sqrt(trapz((res2mu[-1].x[1:N]-ue[1:-1])**2,t[1:-1]))/np.sqrt(trapz(ue**2,t))

    Lmu2 = res2mu[-1].counter()[0]+res2mu[-1].counter()[1]

    print mu2err1,mu2err2,Lmu2,table['L'][4],m*Ls/float(Lmu2)
コード例 #3
0
def main():

    y0 = 3.2
    yT = 11.5
    T = 1
    a = -3.9

    problem = create_simple_CN_problem(y0, yT, T, a, c=0)

    general_taylor_test(problem)
    euler_con(y0, yT, T, a)
    crank_con(y0, yT, T, a)
    jump_difference(problem)
    return 0
コード例 #4
0
def test_con():

    problem = create_simple_CN_problem(1, 1, 1, 1)

    N = [100, 1000, 10000, 100000, 1000000]

    u = lambda x: x

    for n in N:
        t = np.linspace(0, 1, n + 1)
        grad = problem.solve(n, Lbfgs_options={'jtol': 1e-7})

        print grad.counter()
        plt.plot(t, grad.x)
    plt.show()

    return 0
def test():

    y0 = 3.2
    yT = 10.5
    T = 5
    a = -2

    problem = create_simple_CN_problem(y0, yT, T, a, c=0)

    N = 1000
    m = 10
    res3 = problem.solve(N, algorithm='my_steepest_decent')
    print res3.counter()
    """
    res2 = problem.penalty_solve(N,m,[1,10],algorithm='my_steepest_decent')[-1]

    print res2.counter()
    plt.plot(res2.x[:N+1])
    plt.plot(res3.x)
    plt.show()
    """
    pc = None
    pc = problem.PC_maker4(N, m)
    res = problem.alternate_direction_penalty_solve(N, m, [1, 10, 100], ppc=pc)

    x = res[2]

    print res[0].counter(), res[1].counter()

    plt.plot(x[:N + 1])
    plt.plot(res3.x, '--r')
    plt.show()

    plt.plot(x[N + 1:])
    plt.show()

    return
コード例 #6
0
def crank_con(y0, yT, T, a):

    problem = create_simple_CN_problem(y0, yT, T, a, c=0)
    gen_con(problem, name='CN_exact_convergence')
コード例 #7
0
def jump_difference(problem=None):
    import sys
    y0 = 3.2
    yT = 11.5
    T  = 1
    a  = -3.9
    p = 2
    if problem==None:
        problem = create_simple_CN_problem(y0,yT,T,a)#non_lin_problem(y0,yT,T,a,p,func=lambda x : 0*x)#10*np.sin(np.pi*2*x))
    
    
    try:
        N = int(sys.argv[1])
        m = int(sys.argv[2])
    except:
        N = 100
        m = 2
    part_start,_,_,_ = v_comm_numbers(N+1,m)
    
    dt = float(T)/N
    ls = {"ftol": 1e-3, "gtol": 1-1e-1, "xtol": 0.1, "start_stp": 1}
    seq_opt = {'jtol':0,'maxiter':50,'mem_lim':50,"line_search_options":ls}
    
    opt = {'jtol':0,'scale_factor':1,'mem_lim':50,'scale_hessian':False,'maxiter':90,
           "line_search_options":ls}
    res = problem.solve(N,Lbfgs_options=seq_opt)
    u_exact,t,_ = problem.simple_problem_exact_solution(N)
    u_exact2,t2,_ = problem.simple_problem_exact_solution(10*N)
    
    
    table  = {'J(vmu)-J(v)/J(v)':[],'||v_mu-v||':[],'jumps':[],'Jmu(v_mu)-Jmu(v)/Jmu(v)':[],'A rate':['--'],
              'C rate':['--'],'B rate':['--'] }
    table2 = {'J(vmu)-J(v)/J(v)':[],'||v_mu-v||':[],'jumps':[],'Jmu(v_mu)-Jmu(v)/Jmu(v)':[] }
    table3 = {'J(vmu)-J(v)/J(v)':[],'||v_mu-v||':[],'jumps':[],'Jmu(v_mu)-Jmu(v)/Jmu(v)':[] }
    table4 = {'J(vmu)-J(v)/J(v)':[],'||v_mu-v||':[],'jumps':[],'Jmu(v_mu)-Jmu(v)/Jmu(v)':[] }
    t = np.linspace(0,T,N+1)
    y_seq = problem.ODE_solver(res['control'].array(),N)
    #plt.figure()
    #plt.plot(t,y_seq,'r--')
    
    end_crit = lambda mu0,dt,m : mu0<(1./dt)**2
    #mu_updater1=lambda mu,dt,m,last_iter : mu + 10000
    """
    res2 = problem.PPCLBFGSadaptive_solve(N,m,options=opt,
                                          scale=True,mu_stop_codition=end_crit,
                                          mu_updater=mu_updater1,mu0=N)
    """
    mu_list = [N,2*N,5*N,10*N,50*N,70*N,200*N,2000*N,3000*N,4000*N,5000*N,6000*N,10000*N,100000*N,200000*N,1000000*N,1e11,1e12,1e13,1e14,1e16]
    mu_list = [1e1,1e2,1e3,1e4,2e4,5e4,7e4,1e5,2e5,3e5,4e5,5e5,6e5,7e5,8e5,9e5,1e6,1.5e6,2e6,3e6,5e6,7e6,9e6,1e7,1.5e7,2e7,5e7,8e7,1e8,5e8,7e8,1e9,2e9,3e9,7e9,1e10,2e10,3e10,5e10,7e10,1e11,2e11,3e11,4e11,6e11,9e11,1e12,2e12,5e12,8e12,1e13,2e13,5e13,1e14,1e15,1e16]
    #mu_list = [1e5,5e5,1e6,1e7]
    res2 =  problem.PPCLBFGSsolve(N,m,mu_list,options=opt)
    #res2 = problem.penalty_solve(N,m,mu_list,Lbfgs_options=opt)
    MORE = True
    seq_norm = l2_norm(res['control'].array(),t)
    exact_error = l2_diff_norm(u_exact[1:-1],res.x[1:-1],t[1:-1])/seq_norm
    
    y_end=problem.ODE_solver(res['control'].array(),N)
    val1=problem.J(res['control'].array(),y_end[-1],yT,T)
    if MORE:
        res22 = problem.PPCLBFGSsolve(N,10,mu_list,options=opt)
        res23 = problem.PPCLBFGSsolve(10*N,2,mu_list,options=opt)
        res24 = problem.PPCLBFGSsolve(10*N,7,mu_list,options=opt)

        res21 = problem.solve(10*N,Lbfgs_options=seq_opt)
        t2 = np.linspace(0,T,10*N+1)
        seq_norm2 = l2_norm(res21['control'].array(),t2)
        y_seq2 = problem.ODE_solver(res21['control'].array(),10*N)

        
        val21=problem.J(res21['control'].array(),y_seq2[-1],yT,T)

        exact_error2 = l2_diff_norm(u_exact2[1:-1],res21.x[1:-1],t2[1:-1])/seq_norm2

        Y_SEQ = [y_seq,y_seq2,y_seq2]
        SEQN = [seq_norm,seq_norm2,seq_norm2]
        SEQ_RES = [res,res21,res21]
        VAL = [val1,val21,val21]
        RES = [res22,res23,res24]
        TAB = [table2,table3,table4]
        TIME = [t,t2,t2]
        N2 = [N,10*N,10*N]
        jump_diff2 = [[],[],[]]
        state_diff2 = [[],[],[]]

        all_jump_diff21 = [[],[],[]]
        all_jump_diff22 = [[],[],[]]

        all_state_diff21 = [[],[],[]]
        all_state_diff22 = [[],[],[]]

    #res2 = problem.penalty_solve(N,m,mu_list,Lbfgs_options=opt)
    #res3 = problem.penalty_solve(N,m,[1,100,1000,10000])
    all_jump_diff = []
    all_jump_diff2 = []

    all_state_diff = []
    all_state_diff2 = []
    s = 0
    
    
    y2_end,Y = problem.ODE_penalty_solver(res2[-1].x,N,m)
    val2=  problem.J(res2[-1].x[:N+1],y2_end[-1][-1],yT,T)
    
    
    print val1,val2
    print val1-val2


    val3 = problem.Functional(res['control'].array(),N)
    val4 = problem.Functional(res2[-1].x[:N+1],N)
    print val3,val4
    print val3-val4
    
    
    for i in range(len(res2)):
        y,Y = problem.ODE_penalty_solver(res2[i].x,N,m)
        
        jump_diff = []
        state_diff = []
        for j in range(len(y)-1):
            state_diff.append(abs(y[j+1][0]-y_seq[part_start[j+1]]))
            #state_diff.append(max(abs(Y-y_seq)))
            jump_diff.append(abs(y[j][-1]-y[j+1][0]))
        all_jump_diff.append((max(jump_diff),min((jump_diff))))
        all_jump_diff2.append(jump_diff)

        all_state_diff.append((max(state_diff),min(state_diff)))
        all_state_diff2.append(state_diff)
        #plt.plot(t,Y)
        

        err = l2_diff_norm(res['control'].array(),res2[i].x[:N+1],t)/seq_norm
        #res2[i].J_func(res2[i].x)
        
        f_val1 = problem.Penalty_Functional(res2[i].x,N,m,mu_list[i])#res2[i].J_func(res2[i].x)
        f_val2 = problem.Functional(res2[i].x[:N+1],N)
        print res2[i].niter,(f_val2-val1)/val1,all_jump_diff[i][0],err

        table['J(vmu)-J(v)/J(v)'].append((f_val2-val1)/val1)
        table['||v_mu-v||'].append(err)
        table['jumps'].append(all_jump_diff[i][0])
        table['Jmu(v_mu)-Jmu(v)/Jmu(v)'].append((f_val1-val1)/val1)
        if i>0:
            table['A rate'].append(np.log(table['J(vmu)-J(v)/J(v)'][i]/table['J(vmu)-J(v)/J(v)'][i-1])/np.log(mu_list[i]/mu_list[i-1]))
            table['B rate'].append(np.log(table['Jmu(v_mu)-Jmu(v)/Jmu(v)'][i]/table['Jmu(v_mu)-Jmu(v)/Jmu(v)'][i-1])/np.log(mu_list[i]/mu_list[i-1]))
            table['C rate'].append(np.log(table['||v_mu-v||'][i]/table['||v_mu-v||'][i-1])/np.log(mu_list[i]/mu_list[i-1]))

        s+=res2[i].niter
        if MORE:
            for l in range(len(RES)):
                y,Y = problem.ODE_penalty_solver(RES[l][i].x,N2[l],m)
                
               
                for j in range(len(y)-1):
                    state_diff2[l].append(abs(y[j+1][0]-Y_SEQ[l][part_start[j+1]]))
                    #state_diff.append(max(abs(Y-y_seq)))
                    jump_diff2[l].append(abs(y[j][-1]-y[j+1][0]))
                all_jump_diff21[l].append((max(jump_diff),min((jump_diff))))
                all_jump_diff22[l].append(jump_diff)

                all_state_diff21[l].append((max(state_diff),min(state_diff)))
                all_state_diff22[l].append(state_diff)
                #plt.plot(t,Y)
        

                err = l2_diff_norm(SEQ_RES[l]['control'].array(),RES[l][i].x[:N2[l]+1],TIME[l])/SEQN[l]
                #RES[l][i].J_func(RES[l][i].x)
        
                f_val1 = RES[l][i].J_func(RES[l][i].x)
                f_val2 = problem.Functional(RES[l][i].x[:N2[l]+1],N2[l])
                print RES[l][i].niter,(f_val2-val1)/val1,all_jump_diff21[l][i][0],err

                TAB[l]['J(vmu)-J(v)/J(v)'].append((f_val2-VAL[l])/VAL[l])
                TAB[l]['||v_mu-v||'].append(err)
                TAB[l]['jumps'].append(all_jump_diff21[l][i][0])
                TAB[l]['Jmu(v_mu)-Jmu(v)/Jmu(v)'].append((f_val1-VAL[l])/VAL[l])
        
    print all_jump_diff
    print
    #print all_state_diff2
    print float(T)/N
    print val1
    pd.set_option('display.float_format', '{:.6e}'.format)
    data = pd.DataFrame(table,index = mu_list)
    
    data2 = data.ix[:,['J(vmu)-J(v)/J(v)','||v_mu-v||','A rate','C rate']].head(12)
    
    #data.to_latex('report/whyNotEqual/jump_func_Neql'+str(N)+'meql'+str(m)+'_2.tex')
    print data
    #data2.to_latex('report/whyNotEqual/consistency_rate.tex')
    """
    plt.show()
    plt.plot(t,res['control'].array(),'r--')
    for i in range(len(res2)):
        plt.plot(t,res2[i].x[:N+1])
    plt.show()
    """
    """
    for i in range(len(res3)):
        err=l2_diff_norm(res['control'].array(),res3[i]['control'].array()[:N+1],t)
        print err
    print s,res['iteration']
    """
    """
    for i in range(len(all_jump_diff2)):
        plt.figure()
        plt.plot(np.array(all_jump_diff2[i]))
    """
    #plt.show()
    Legg = ['A','B','C','D']
    if MORE:
        #plt.locator_params(axis='x', nticks=8)
        Legg = [r'$\Delta \hat J$',r'$\Delta \hat J_{\mu}$',r'$\Delta v$',r'$\Delta y$',r'$||v-v_e||$']
        plt.figure(figsize=(12,6))
        ax1 = plt.subplot(121)
        ax1.loglog(np.array(mu_list),np.array(table['J(vmu)-J(v)/J(v)']),'--')
        ax1.loglog(np.array(mu_list),-np.array(table['Jmu(v_mu)-Jmu(v)/Jmu(v)']),'rx-')
        ax1.loglog(np.array(mu_list),np.array(table['||v_mu-v||']),'c-')
        ax1.loglog(np.array(mu_list),np.array(table['jumps']),'g.')
        help_var11 = np.zeros(len(mu_list)) + exact_error
        ax1.loglog(np.array(mu_list),help_var11)
        ax1.set_xlabel(r"$\mu$",fontsize=15)
        
        ax1.xaxis.set_ticks(10**np.arange(2,17,2))
        ax1.set_title(r'$N=2$')
        table = TAB[0]
        ax2 = plt.subplot(122)
        ax2.loglog(np.array(mu_list),np.array(table['J(vmu)-J(v)/J(v)']),'--')
        ax2.loglog(np.array(mu_list),-np.array(table['Jmu(v_mu)-Jmu(v)/Jmu(v)']),'rx-')
        ax2.loglog(np.array(mu_list),np.array(table['||v_mu-v||']),'c-')
        ax2.loglog(np.array(mu_list),np.array(table['jumps']),'g.')
        ax2.set_xlabel(r"$\mu$",fontsize=15)
        ax2.loglog(np.array(mu_list),help_var11)
        ax2.xaxis.set_ticks(10**np.arange(2,17,2))
        ax2.legend(Legg)
        ax2.set_title(r'$N=10$')
        table = TAB[1]
        #plt.savefig('report/draft/draft2/consistency1.png')

        plt.figure(figsize=(6,6))
        plt.loglog(np.array(mu_list),np.array(table['J(vmu)-J(v)/J(v)']),'--')
        plt.loglog(np.array(mu_list),-np.array(table['Jmu(v_mu)-Jmu(v)/Jmu(v)']),'rx-')
        plt.loglog(np.array(mu_list),np.array(table['||v_mu-v||']),'c-')
        plt.loglog(np.array(mu_list),np.array(table['jumps']),'g.')
        help_var11 = np.zeros(len(mu_list)) + exact_error2
        plt.loglog(np.array(mu_list),help_var11)
        plt.xlabel(r"$\mu$",fontsize=20)
        
        plt.xticks(10**np.arange(2,17,2))
        plt.title(r'$N=2$')
        plt.legend(Legg)
        plt.savefig('presentation/con2.png')
        #plt.show()

        plt.figure(figsize=(12,6))
        ax3 = plt.subplot(121)
        ax3.loglog(np.array(mu_list),np.array(table['J(vmu)-J(v)/J(v)']),'--')
        ax3.loglog(np.array(mu_list),-np.array(table['Jmu(v_mu)-Jmu(v)/Jmu(v)']),'rx-')
        ax3.loglog(np.array(mu_list),np.array(table['||v_mu-v||']),'c-')
        ax3.loglog(np.array(mu_list),np.array(table['jumps']),'g.')
        ax3.set_xlabel(r"$\mu$",fontsize=15)

        help_var21 = np.zeros(len(mu_list)) + exact_error2
        ax3.loglog(np.array(mu_list),help_var21)

        ax3.set_title(r'$N=2$')
        ax3.xaxis.set_ticks(10**np.arange(2,17,2))
        table = TAB[2]
        ax4 = plt.subplot(122)
        ax4.loglog(np.array(mu_list),np.array(table['J(vmu)-J(v)/J(v)']),'--')
        ax4.loglog(np.array(mu_list),-np.array(table['Jmu(v_mu)-Jmu(v)/Jmu(v)']),'rx-')
        ax4.loglog(np.array(mu_list),np.array(table['||v_mu-v||']),'c-')
        ax4.loglog(np.array(mu_list),np.array(table['jumps']),'g.')
        ax4.set_xlabel(r"$\mu$",fontsize=15)
        ax4.loglog(np.array(mu_list),help_var21)
        ax4.xaxis.set_ticks(10**np.arange(2,17,2))
        ax4.legend(Legg)
        ax4.set_title(r'$N=7$')
        #plt.savefig('report/draft/draft2/consistency2.png')
        plt.show()
    else:
        plt.figure(figsize=(6,8))
        #plt = plt.subplot(211)
        plt.loglog(np.array(mu_list),np.array(table['J(vmu)-J(v)/J(v)']),'--')
        plt.loglog(np.array(mu_list),np.array(table['jumps']),'.')
        plt.loglog(np.array(mu_list),-np.array(table['Jmu(v_mu)-Jmu(v)/Jmu(v)']),'x-')
        plt.loglog(np.array(mu_list),np.array(table['||v_mu-v||']))
        plt.loglog()
        plt.legend(Legg)
        plt.plot(np.array(mu_list),4e-5/(np.array(mu_list)**2))
        plt.plot(np.array(mu_list),1./(np.array(mu_list)))
        plt.show()