Python中用for循环在同一画布绘制多参数参数图求助
问题修正方案
你的代码存在几个关键问题,导致只能得到b=4的图,下面是修正说明和完整代码:
核心错误点
- 循环逻辑错误:你在循环内反复将
b赋值为整个数组,没有逐个使用每个b值;且np.arange(4,6,0.5)无法取到6,需调整为np.arange(4,6.1,0.5)才能包含目标值。 - 微分方程参数错误:
F函数里错误使用len(b)**2代替b**2,原数组长度为4,所以始终用1/4²计算,相当于固定b=4,这是所有图结果一致的根本原因。 - 绘图逻辑错误:每次循环新建画布并立即显示,导致每次仅展示单张图,无法在同一画布叠加。
修正后的代码
import matplotlib.pyplot as plt import numpy as np from scipy.integrate import solve_ivp alpha = 0.2 M = 1 # 定义要测试的5个b值 b_values = np.arange(4, 6.1, 0.5) # 创建单个画布,设置统一坐标轴范围 plt.figure(figsize=(6,6)) plt.xlim(-16,16) plt.ylim(-16,16) for b in b_values: # 针对当前b值定义微分方程 F = lambda t, r: (r**2 * ((1/b**2) - ((1 - (2*(1+alpha)*M)/ r + (alpha*(1+alpha)*M**2)/ (r**2))/r**2)))**0.5 t_eval = np.arange(0, 2*np.pi, 0.0001) # 求解数值积分 sol = solve_ivp(F, [0, 2*np.pi], [2.3], method='RK45', t_eval=t_eval) # 转换为直角坐标 x3 = sol.y[0] * np.cos(sol.t) y3 = sol.y[0] * np.sin(sol.t) # 绘制曲线并添加标签 plt.plot(x3, y3, label=f'b={b}') # 添加图例区分不同曲线 plt.legend() plt.show()
修正说明
- 循环直接遍历每个
b值,确保每次计算都使用当前目标参数。 - 将画布创建、坐标轴设置放在循环外,所有曲线绘制在同一画布上。
- 为每条曲线添加标签,通过图例清晰区分不同
b对应的结果。
内容的提问来源于stack exchange,提问作者A_Dutta
相关产品推荐
相关产品推荐

