Jupyter Notebook中用Sympy定义方程、求导积分绘图及报错解决
SymPy函数求导/积分后绘图报错解决方案
报错原因
- SymPy的所有求导、积分、自定义函数都是符号运算逻辑,仅支持传入SymPy符号类变量,你后续将符号变量
x覆盖为numpy数组后,再把数组传入求导/积分函数自然会触发参数校验报错 - 即使是预定义好的符号表达式,也无法直接接收numpy数组完成批量数值计算,需要做格式转换
修正方法
使用SymPy内置的sp.lambdify()方法,将符号表达式转换为支持numpy数组输入的数值计算函数即可,同时要注意不要重复覆盖符号变量的名称,避免变量冲突。
完整可运行代码
import sympy as sp from IPython.display import display sp.init_printing() import matplotlib.pyplot as plt import numpy as np # 定义符号变量,不要和后续数值数组变量重名 x_sym = sp.symbols('x') a = sp.sympify("4/5") # 1. 定义原函数符号表达式 func_sym = x_sym**3 + a * x_sym**2 display("原函数:", func_sym) # 2. 定义导函数符号表达式 dfunc_sym = sp.diff(func_sym, x_sym) display("导函数:", dfunc_sym) # 3. 定义积分函数符号表达式(不定积分,可按需加常数项) int_func_sym = sp.integrate(func_sym, x_sym) display("不定积分结果:", int_func_sym) # 将所有符号表达式转换为支持numpy数组输入的数值函数 func_num = sp.lambdify(x_sym, func_sym, 'numpy') dfunc_num = sp.lambdify(x_sym, dfunc_sym, 'numpy') int_func_num = sp.lambdify(x_sym, int_func_sym, 'numpy') # 生成数值计算用的x数组 x_arr = np.linspace(-10, 10, 20) # 绘图 plt.plot(x_arr, func_num(x_arr), label='原函数') plt.plot(x_arr, dfunc_num(x_arr), label='导函数') plt.plot(x_arr, int_func_num(x_arr), label='不定积分函数') plt.legend() plt.show()
额外说明
如果需要计算定积分,只需要在生成积分符号表达式时传入上下限即可,示例:
# 计算x从0到2的定积分,得到的是固定值 fixed_int = sp.integrate(func_sym, (x_sym, 0, 2)) display("0到2的定积分结果:", fixed_int)
内容的提问来源于stack exchange,提问作者M_Mueller
相关产品推荐
相关产品推荐

