I get error when trying to plot a graph : TypeError: Cannot convert expression to float
I also get empty graph:
from sympy import *
from IPython.display import display
init_printing()
import matplotlib.pyplot as plt
import numpy as np
x = symbols('x')
y = Function('y')
ode = Derivative(y(x), x, x) + 9 * y(x)
# Solve the ODE
solution = dsolve(ode, y(x))
# Plot the solution
x_vals = np.linspace(-10, 10, 1000)
y_vals = [solution.rhs.subs({x: val}).evalf() for val in x_vals]
plt.plot(x_vals, y_vals)
plt.xlabel('x')
plt.ylabel('y(x)')
plt.title('Solution to y\'\'(x) + 9y(x) = 0')
plt.grid(True)
plt.show()
python: 3.12
I tried latest Pycharm, Spider(Anaconda) and Jupyter notes (Anaconda)
simply version: 1.13.0
matplotlib: 3.9.1
numpy: 2.0.1
I also tried with lamdify but with same result
x_vals = np.linspace(-10, 10, 1000)
# Convert the symbolic expression to a numerical function
y_expr = solution.rhs
y_func = lambdify(x, y_expr, modules='numpy')
# Evaluate the solution function for all x_vals
y_vals = y_func(x_vals)
plt.plot(x_vals, y_vals)
plt.grid(True)
plt.show()
Your solution.rhs
is still undetermined, hence the error.
You need to provide appropriate initial conditions, using the ips
keyword argument to dsolve
.
Also, the Matplotlib contortions are unneeded, Sympy knows how to plot a Sympy function on itself.
from sympy import *
x = symbols('x')
y = Function('y')(x) ; y.dot = y.diff(x) ; y.ddot = y.dot.diff(x)
# Solve the ODE y'' + 9y = 0
solution = dsolve(y.ddot+9*y, ics={y.subs(x,-10):1, y.subs(x,10):1})
# Plot the solution
p = plot(solution.rhs)
I'd like to mention that p
is a Plot object whose attributes you can manipulate (but not as much as a Matplotlib Axes…)