如何在R语言for循环中返回绘图?二分法迭代绘图报错求助
修复你的二分法绘图程序
看起来你在SageMath环境下编写二分法程序时遇到了绘图相关的问题,我来帮你梳理下代码里的几个关键问题并给出修正方案:
问题分析
- 绘图执行逻辑错误:你在
return语句里同时返回根、绘图和点,但points()需要叠加在已有的绘图对象上,而且return会直接终止函数,导致points()可能根本不会被正确执行。 - 迭代终止时机的绘图缺失:当找到满足精度的根时,函数直接返回,没有完成完整的绘图步骤;最大迭代次数到达时也没有对应的绘图逻辑。
- 绘图对象管理混乱:你需要先创建一个基础绘图容器,再把迭代生成的中点逐步叠加进去,而不是分开调用
plot()和points()。
修正后的代码
def Bisec(f, a=1, b=2, max_iter=100, tol=1e-10): midVals = [] # 先创建基础函数图像,设置合适的x范围覆盖[a,b]及周边区域 p = plot(f, xmin=a-0.5, xmax=b+0.5, color='blue', legend_label='f(x) = x² - 2') p += plot(0, xmin=a-0.5, xmax=b+0.5, color='black', linestyle='--') # 添加x轴参考线 for i in range(max_iter): c = (a + b)/2 midVals.append(c) # 每次迭代就把当前中点(c, f(c))添加到图上,仅第一次添加时设置图例 p += point((c, f(c)), color='red', size=20, legend_label='迭代中点' if i==0 else None) if abs(f(c)) < tol: print(f"找到根:{c},迭代次数:{i+1}") p.show(title='二分法迭代过程') return c, midVals, p elif f(a)*f(c) > 0: a = c else: b = c print("达到最大迭代次数,未找到满足精度的根") p.show(title='二分法迭代过程(已达最大迭代次数)') return None, midVals, p x = var('x') f = function(x): x*x - 2 root, mid_points, plot_obj = Bisec(f, 1, 3, max_iter=100, tol=1e-10)
关键改进点
- 提前初始化绘图对象:先绘制目标函数和x轴参考线,让迭代中点的位置更直观。
- 迭代中实时添加点:每计算出一个中点就立刻添加到绘图里,避免遗漏任何一次迭代的位置。
- 统一的绘图展示逻辑:无论是找到根还是触发最大迭代次数,都会自动展示完整的迭代过程图。
- 优化迭代次数参数:把原来不切实际的
max=1e10改成max_iter=100——二分法收敛速度极快,100次迭代足以达到极高精度。 - 清晰的返回值结构:返回根、所有中点列表和绘图对象,方便后续进一步分析迭代过程。
修改后运行代码,你就能看到红色的迭代中点逐步逼近函数零点的完整过程了。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

