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:
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 bibliotecanumpy
que proporciona una funciónsin()
que funciona con entradas en grados.Podemos modificar el código para usar
numpy
en lugar demath
de la siguiente manera:Esto debería solucionar el
ValueError
y producir el gráfico deseado.