es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo trazar la isoclina o nuloclina de una ecuación diferencial de segundo orden.

Tengo un código diseñado para trazar una isoclina o una nuloclina de una Ecuación Diferencial Ordinaria (EDO) de segundo orden, pero siempre obtengo un “ValueError: error de dominio matemático”. Proporcionaré el código que tengo y una imagen de cómo se supone que debe verse. La EDO de segundo orden se divide en dos EDO de primer orden diferentes: “dx/dt = f(x,y) = 3x – y^2” y “dy/dt = g(x,y) = sin(y) – x”. Este código está diseñado para cualquier EDO de segundo orden, pero estoy utilizando las ecuaciones de nuestros apuntes para asegurarme de que funcione antes de usarlo en cualquier otra.

El código está en Python 3.8.

Código:

import matplotlib.pyplot as plt
import math

def f(x,y):
    return 3*x-y*y
def g(x,y):
    return math.sin(y) - x

x = []
y = []

def IsoNull(x0, y0, dt, time):  
    x.append(x0)
    y.append(y0)
    for i in range(time):
        x.append(x[i] + (f(x[i],y[i])) * dt)
        y.append(y[i] + (g(x[i],y[i])) * dt)
    return x, y

IsoNull(0.5, 1, 0.01, 1000)

plt.plot(x, 'r-', label='x')
plt.plot(y, 'b-', label='y')
plt.xlabel("tiempo")
plt.legend(loc='best')

El error ocurre en la línea 6 del código: “return sin(y) – x”.

Tratando de obtener una gráfica como esta utilizando el código anterior:

Gráfica Real

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La solución

    El error está ocurriendo porque la función math.sin() espera que la entrada esté en radianes, pero le estamos proporcionando una entrada en grados. Para solucionar esto, podemos usar la biblioteca numpy que proporciona una función sin() que funciona con entradas en grados.

    Podemos modificar el código para usar numpy en lugar de math de la siguiente manera:

    import matplotlib.pyplot as plt
    import numpy as np
    
    def f(x,y):
        return 3*x-y*y
    
    def g(x,y):
        return np.sin(np.deg2rad(y)) - x
    
    x = []
    y = []
    
    def IsoNull(x0, y0, dt, time):  
        x.append(x0)
        y.append(y0)
        for i in range(time):
            x.append(x[i] + (f(x[i],y[i])) * dt)
            y.append(y[i] + (g(x[i],y[i])) * dt)
        return x, y
    
    IsoNull(0.5, 1, 0.01, 1000)
    
    plt.plot(x, 'r-', label='x')
    plt.plot(y, 'b-', label='y')
    plt.xlabel("time")
    plt.legend(loc='best')
    

    Esto debería solucionar el ValueError y producir el gráfico deseado.

Comments are closed.