Soluciones num茅ricas vs. exactas

7/12

Lectura

En la clase pasada resolvimos una ecuaci贸n diferencial muy sencilla con el m茅todo de Euler, pero mencionamos tambi茅n que esa misma ecuaci贸n diferencial se puede resolver con m茅todos del c谩lculo y el 谩lgebra tradicionales, por ejemplo, por medio de separaci贸n de variables, para obtener:

...

Reg铆strate o inicia sesi贸n para leer el resto del contenido.

Aportes 3

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

La ultima parte no quer铆a salir de regresi贸n lineal no quer铆a salir pero por alguna raz贸n fue necesario hacer una modificaci贸n, demasiados decimales me parece.

import numpy as np 
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

def exact_sol(ts): return np.exp(ts)

def num_sol(ts, dt, tf=10, y0=1):
    ys = [y0]
    ts = [0]
    num_steps = int(tf/dt)
    for _ in range(num_steps):
        ts.append(ts[-1]+dt)
        ys.append((1+dt)*ys[-1])
    return ts, ys


 
if __name__=='__main__':

    ys = [1] # creamos un areglo inicial de valores en y
    ts = [0] # creamos un areglo inicial de valores en t
    dt = 0.01

    num_steps = 1000
    for i in range(num_steps):
        ts.append(ts[-1]+dt) # calculamos el proximo t y lo agregamos al arreglo
        ys.append((1+dt)*ys[-1]) # calculamos el proximo y y lo agregamos al arreglo

    #print (ts)
    #print(ys)

   
    plt.figure(figsize=(15,8))
    plt.plot(ts,ys)
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    #plt.show()

    plt.figure(figsize=(12,6))
    for dt in [0.1, 0.05, 0.01]:
        ts, ys = num_sol(ts, dt)
        plt.plot(ts, ys, '--', label='dt = {}'.format(dt))
    
    plt.plot(ts,exact_sol(ts), label='exact')
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    plt.legend(fontsize=20)
    #plt.show()

    plot_text_size = 20
    local_error = []
    dt_arr = []
    dt_arr = np.arange(0.0001, 0.5, 0.0001)
    for dt in dt_arr:
        ts, ys_num = num_sol(ts, dt=dt)
        ys_ex = exact_sol(ts)
        local_error.append(np.abs(ys_num[-1] - ys_ex[-1]))
    
    plt.figure(figsize=(10,8))
    plt.xscale('log')
    plt.yscale('log')
    plt.plot(dt_arr,local_error)
    plt.plot(dt_arr[:-4900], local_error[:-4900],'-*r')
    plt.xticks(fontsize=plot_text_size)
    plt.yticks(fontsize=plot_text_size)
    plt.xlabel(r'$(\Delta t)$',fontsize=plot_text_size)
    plt.ylabel(r'$(\Delta E)$', fontsize=plot_text_size)
   
    local_error = np.array(local_error)
    
    x = np.log(dt_arr[:-4900])
    x = np.log(dt_arr[:-4900]).reshape(-1,1)
    y = np.log(local_error[:-4900])
 
    #reg = LinearRegression().fit(x, y)
    reg = LinearRegression(fit_intercept=True, normalize=True, copy_X=True, n_jobs=None).fit(x.astype(np.float32), y)
    print(reg.score(x,y))
    print(reg.coef_)
    
    fig, ax = plt.subplots(1, 1, figsize=(7,7), dpi=120)
    ax.plot(x, y, label='Regresion Lineal', marker='o', linestyle='dashed')
    ax.legend()
    plt.show()


RPTA: 
位 py metodo_euler.py
0.9999677987793394
[0.989571]

Buen tema
Gracias!!