import math                          # para usar expressões matemáticas

from matplotlib import pyplot as plt # para fazer gráficos 

# Resolução do problema do cachorro e do coelho com o método de Euler

L=80                                 # Dados de inicilização.
n=10                                 # número de iterações do método de Euler.
h=L/n                                # passo para o método de Euler para resolver a equação u'=F(x,u), u=(r,y) que dependem de x.
t=[]                                 # Vetor para guardar coordenadas discretas do tempo t, de h em h.
r=[]                                 # Vetor para guardar coordenadas discretas da posição do coelho (rabbit), no tempo t.
y=[]                                 # Vetor para guardar coordenadas discretas da posição do cachorro (dog), no eixo y. Esperamos y=f(x).
x=[]                                 # Vetor para guardar coordenadas discretas da posição do cachorro (dog), no eixo x.
t.append(0)                         
y.append(0)
x.append(L)
r.append(0)
                       
def F(s,u,v):                        # Equação (u',v')=F(x,u,v), s=x, u=r (rabit) e v=y (dog).
  dydx=(v-u)/s
  drdx=-math.sqrt(1+(dydx)**2)/2
  return [drdx, dydx]

for i in range(1,n+1):                 # Método de Euler u_(n+1)=u_n+hF(s_n,u_n)  
    t.append(0) 
    Fp=F(x[i-1],r[i-1],y[i-1])          
    r.append(r[i-1]-h*Fp[0])  
    y.append(y[i-1]-h*Fp[1])
    x.append(x[i-1]-h)
    #print('x_',i,'=',x[i],',','y_',i,'=',y[i],',','r_',i,'=',r[i])

Figure = plt.figure(figsize=(8,6), dpi=80) # criando gráficos
lines_plotted = plt.plot([])    
 
line_plotted = lines_plotted[0]
 
plt.xlim(0,L) 
 
plt.ylim(0,60)  

plt.plot(t,r,'*',color='blue', label='Rabbit')    
plt.plot(x,y,'o',label='Dog',color='blue')
plt.ylabel('y')
plt.xlabel('x')
plt.title('Aproximação pelo método de Euler')

#plt.show() 

def f(s):               # Soulção exata y=f(x)
  pf=( (s-240)*math.sqrt(s)+160*math.sqrt(80))/(12*math.sqrt(5))
  return pf

fp=[]
xt=[]
xt.append(0)
fp.append(f(0))
for i in range(1,320+1):  
  xt.append(xt[i-1]+1/4)                
  fp.append(f(xt[i]))

plt.plot(xt,fp,color='red',label='y=f(x)')
plt.legend()
plt.show()
 
plt.close()

# Resolução do problema do cachorro e do coelho com argumento geométrico.

Figure = plt.figure(figsize=(8,6), dpi=80) # criando gráficos
lines_plotted = plt.plot([])    
 
line_plotted = lines_plotted[0]
 
plt.xlim(-5,L) 
 
plt.ylim(-5,60)  

plt.plot(t,r,'*',label='Rabbit Euler',color='blue')    
plt.plot(x,y,'o',label='Dog Euler',color='blue')
plt.ylabel('y')
plt.xlabel('x')
plt.title('Aproximação com passos do coelho em y e pelo método de Euler')

plt.plot(xt,fp,color='red',label='y=f(x)')

# Dando passos no eixo y, primeiro o coelho.
t=[]                                 # Vetor para guardar coordenadas discretas do tempo t, de h em h.
r=[]                                 # Vetor para guardar coordenadas discretas da posição do coelho (rabbit), no tempo t.
y=[]                                 # Vetor para guardar coordenadas discretas da posição do cachorro (dog), no eixo y. Esperamos y=f(x).
x=[]                                 # Vetor para guardar coordenadas discretas da posição do cachorro (dog), no eixo x.
t.append(0)
y.append(0)
x.append(80)
r.append(0)
h=50/n

for i in range(1,n+1):
    t.append(0)  
    r.append(r[i-1]+h)  
    y.append(y[i-1]+2*h*(r[i]-y[i-1])/math.sqrt((x[i-1]-t[i-1])**2+(r[i]-y[i-1])**2))
    x.append(x[i-1]-2*h*(x[i-1]-t[i-1])/math.sqrt((x[i-1]-t[i-1])**2+(r[i]-y[i-1])**2))
    
plt.plot(t,r,'*',color='purple',label='Rabbit geometrico') 
plt.plot(x,y,'o',color='purple',label='Dog geométrico')

plt.legend()
plt.plot(t,r,color='black') 
plt.plot(x,t,color='black') 
plt.show()
plt.close()

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: