Tengo una ecuación dy/dx = x + y/5 y un valor inicial, y(0) = -3.

Me gustaría saber cómo trazar el gráfico exacto de esta función usando pyplot.

También tengo un x = np.linspace(0, interval, steps+1) que me gustaría usar como eje x. Entonces solo estoy buscando los valores del eje y.

Gracias de antemano.

2
Liam Vinson 6 mar. 2017 a las 18:37

2 respuestas

La mejor respuesta

Solo para completar, este tipo de ecuación puede integrarse fácilmente numéricamente, utilizando scipy.integrate.odeint.

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

# function dy/dx = x + y/5.
func = lambda y,x : x + y/5.
# Initial condition
y0 = -3  # at x=0
# values at which to compute the solution (needs to start at x=0)
x = np.linspace(0, 4, 101)
# solution
y = odeint(func, y0, x)
# plot the solution, note that y is a column vector
plt.plot(x, y[:,0])
plt.xlabel('x')
plt.ylabel('y')
plt.show()

enter image description here

3
ImportanceOfBeingErnest 6 mar. 2017 a las 17:59

Dado que necesita resolver el d.e. es posible que prefiera hacer esto algebraicamente, con sympy. (O tal vez no).

Importe el módulo y defina la función y la variable dependiente.

>>> from sympy import *
>>> f = Function('f')
>>> var('x')
x

Invocar al solucionador. Tenga en cuenta que todos los términos de d.e. debe transponerse a la izquierda del signo igual, y que y debe reemplazarse por el designador para la función.

>>> dsolve(Derivative(f(x),x)-x-f(x)/5)
Eq(f(x), (C1 + 5*(-x - 5)*exp(-x/5))*exp(x/5))

Como era de esperar, la solución se da en términos de una constante arbitraria. Debemos resolver eso usando el valor inicial. Lo definimos como una variable sympy.

>>> var('C1')
C1

Ahora creamos una expresión para representar esta constante arbitraria como el lado izquierdo de una ecuación que podemos resolver. Reemplazamos f (0) con su valor en la condición inicial. Luego sustituimos el valor de x en esa condición para obtener una ecuación en C1 .

>>> expr = -3 - ( (C1 + 5*(-x - 5)*exp(-x/5))*exp(x/5) )
>>> expr.subs(x,0)
-C1 + 22

En otras palabras, C1 = 22. Finalmente, podemos usar este valor para obtener la solución particular de la ecuación diferencial.

>>> ((C1 + 5*(-x - 5)*exp(-x/5))*exp(x/5)).subs(C1,22)
((-5*x - 25)*exp(-x/5) + 22)*exp(x/5)

Como estoy distraído y siempre temo cometer errores atroces, verifico que esta función satisfaga la condición inicial.

>>> (((-5*x - 25)*exp(-x/5) + 22)*exp(x/5)).subs(x,0)
-3

(Por lo general, las cosas son incorrectas solo cuando me olvido de revisarlas. Así es la vida).

Y también puedo trazar esto en sympy.

>>> plot(((-5*x - 25)*exp(-x/5) + 22)*exp(x/5),(x,-1,5))
<sympy.plotting.plot.Plot object at 0x0000000008C2F780>

solution to d.e.

2
Bill Bell 6 mar. 2017 a las 17:15