Sympy求解Logistic微分方程后无法用Matplotlib/Sympy绘图问题求助
Logistic微分方程绘图问题修正
你的代码存在几个关键问题导致无法正常绘图,以下是具体分析和修正方案:
问题点梳理
- 时间点数量不足:
np.linspace(0, 10, 1)仅生成1个时间点,没有足够数据支撑曲线绘制,至少需要几十个点才能呈现趋势。 - 符号表达式无法直接用于绘图:
f是SymPy的符号函数,Matplotlib无法直接解析,需要转换为可计算数值的函数。 - 绘图参数顺序错误:
plt.plot(f, ft)颠倒了x轴(时间)和y轴(函数值)的参数顺序,不符合Matplotlib的绘图逻辑。
修正后的完整代码
import sympy as sm import numpy as np import matplotlib.pyplot as plt from sympy.abc import L, k, t y = sm.Function('y')(t) # 定义Logistic微分方程:y' = ky(L-y) dy = y.diff(t) rhs = k*y*(L - y) eq = sm.Eq(dy, rhs) print('微分方程:') sm.pretty_print(eq) print('微分方程通解:') sol = sm.dsolve(eq) sm.pretty_print(sol) print('初始条件y(0)=800的特解:') t0 = sol.args[1].subs({'t': 0}) n0 = 800 eq_init = sm.Eq(n0, t0) C1 = t0.args[2].args[0].args[0] t0_sol = sm.solve(eq_init, C1) final = sol.args[1].subs(C1, t0_sol[0]) final_eq = final.simplify() sm.pretty_print(final_eq.subs([(L,2000),(k,0.0003)])) # 修正部分 # 1. 生成足够多的时间采样点 ft = np.linspace(0, 10, 100) # 2. 将符号表达式转换为NumPy兼容的数值计算函数 f_numeric = sm.lambdify(t, final_eq.subs([(L,2000),(k,0.0003)]), 'numpy') # 3. 计算每个时间点对应的函数值 y_values = f_numeric(ft) # 4. 按x轴(时间)、y轴(函数值)的顺序绘图 plt.plot(ft, y_values) plt.xlabel('时间t') plt.ylabel('y(t)') plt.title('Logistic微分方程解的曲线') plt.show()
额外可选方案(SymPy原生绘图)
如果不想依赖Matplotlib,也可以直接用SymPy内置的绘图功能替换最后部分代码:
f_sym = final_eq.subs([(L,2000),(k,0.0003)]) sm.plot(f_sym, (t, 0, 10), xlabel='t', ylabel='y(t)', title='Logistic解曲线')
内容的提问来源于stack exchange,提问作者Freya the Goddess
相关产品推荐
相关产品推荐

