1st vs 2nd order Taylor methods

Intial Value Poblem

The general form of the population growth differential equation $\( y^{'}=t-y, \ \ (0 \leq t \leq 4) \)\( with the initial condition \)\(x(0)=1\)\( For N=4 with the analytic (exact) solution \)\( y= 2e^{-t}+t+1\)$

Taylor Solution

\[ f(t,y)=t-y \]
\[ f'(t,y)=1-y'=1-t+y \]
\[T^1(t_i,w,i)=f(t_i,w_i)=t_i-w_i\]
\[T^2(t_i,w,i)=f(t_i,w_i)+\frac{h}{2}f'(t_i,w_i)=t_i-w_i+\frac{h}{2}(1-t_i+w_i)\]

The first order Taylor difference equation, which is identical to the Euler method, is $\(w_{i+1}=w_i+h(t_i-w_i). \)\( The second order Taylor difference equation is \)\(w_{i+1}=w_i+h(t_i-w_i+\frac{h}{2}(1-t_i+w_i)). \)$

import numpy as np
import math 

%matplotlib inline
import matplotlib.pyplot as plt # side-stepping mpl backend
import matplotlib.gridspec as gridspec # subplots
import warnings

warnings.filterwarnings("ignore")
def Second_order_taylor(N,IC):
    x_end=4
    x_start=0
    
    INTITIAL_CONDITION=IC
    h=x_end/(N)
    N=N+1;
    Numerical_Solution=np.zeros(N)
    Numerical_Solution_first=np.zeros(N)
    t=np.zeros(N)
    Analytic_Solution=np.zeros(N)
    Upper_bound=np.zeros(N)
    
    t[0]=x_start
    Numerical_Solution[0]=INTITIAL_CONDITION
    Numerical_Solution_first[0]=INTITIAL_CONDITION
    Analytic_Solution[0]=INTITIAL_CONDITION
    for i in range (1,N):
        Numerical_Solution_first[i]=Numerical_Solution_first[i-1]+h*(t[i-1]-Numerical_Solution_first[i-1])
        Numerical_Solution[i]=Numerical_Solution[i-1]+h*(t[i-1]-Numerical_Solution[i-1]+h/2*(1-t[i-1]+Numerical_Solution[i-1]))
        t[i]=t[i-1]+h
        Analytic_Solution[i]=2*math.exp(-t[i])+t[i]-1
    

    fig = plt.figure(figsize=(10,4))
    # --- left hand plot
    ax = fig.add_subplot(1,3,1)
    plt.plot(t,Numerical_Solution,color='blue',label='Second Order')
    plt.plot(t,Numerical_Solution_first,color='red',label='First Order')
    plt.legend(loc='best')
    plt.title('Numerical Solution h=%s'%(h))

    # --- right hand plot
    ax = fig.add_subplot(1,3,2)
    plt.plot(t,Analytic_Solution,color='blue')
    plt.title('Analytic Solution')

    #ax.legend(loc='best')
    ax = fig.add_subplot(1,3,3)
    plt.plot(t,np.abs(Analytic_Solution-Numerical_Solution),color='blue',label='Second Order Error')
    plt.plot(t,np.abs(Analytic_Solution-Numerical_Solution_first),color='red',label='First Order Error')
    plt.title('Error')
    plt.legend(loc='best')
    # --- title, explanatory text and save
    
   
    # --- title, explanatory text and save
    fig.suptitle(r"$y'=y-t$", fontsize=20)
    plt.tight_layout()
    plt.subplots_adjust(top=0.85)    
    print(Analytic_Solution)
    print(Numerical_Solution)
Second_order_taylor(40,1)
[1.         0.90967484 0.83746151 0.78163644 0.74064009 0.71306132
 0.69762327 0.69317061 0.69865793 0.71313932 0.73575888 0.76574217
 0.80238842 0.84506359 0.89319393 0.94626032 1.00379304 1.06536705
 1.13059778 1.19913724 1.27067057 1.34491286 1.42160632 1.50051769
 1.58143591 1.66417    1.74854716 1.83441103 1.92162013 2.01004644
 2.09957414 2.1900984  2.28152441 2.37376633 2.46674654 2.56039477
 2.65464744 2.74944705 2.84474154 2.94048382 3.03663128]
[1.         0.91       0.83805    0.78243525 0.7416039  0.71415153
 0.69880714 0.69442046 0.69995051 0.71445522 0.73708197 0.76705918
 0.80368856 0.84633815 0.89443602 0.9474646  1.00495546 1.06648469
 1.13166865 1.20016013 1.27164492 1.34583865 1.42248398 1.501348
 1.58221994 1.66490904 1.74924269 1.83506463 1.92223349 2.01062131
 2.10011228 2.19060162 2.28199446 2.37420499 2.46715552 2.56077574
 2.65500205 2.74977685 2.84504805 2.94076849 3.03689548]
../_images/202_Taylor_Method_Error_Example_3_1.png