Python割线法报错:局部变量'x1'在赋值前被引用
割线法求解多项式根的代码错误修复
问题描述
尝试用割线法求解多项式-2*x**6 -1.5*x**4 +10*x +2的根,初始值设为2和3,但运行代码时出现UnboundLocalError错误。
原代码
import numpy as np def f(x): return (-2*x**6)-(1.5*x**4)+(10*x)+(2) def secante(f,x,fp,N=100,emax=0.0001): for k in range(N): fp=(f(x1)-f(x0))/(x1-x0) x=x1-f(x1)/fp e=abs((x-x1)/x) if e<emax: break x0=x1 x1=x print(k,x,f(x),e) secante(f,2,3)
报错信息
--------------------------------------------------------------------------- UnboundLocalError Traceback (most recent call last) Input In [10], in <cell line: 17>() 15 x1=x 16 print(k,x,f(x),e) ---> 17 secante(f,2,3) Input In [10], in secante(f, x, fp, N, emax) 7 def secante(f,x,fp,N=100,emax=0.0001): 8 for k in range(N): ----> 9 fp=(f(x1)-f(x0))/(x1-x0) 10 x=x1-f(x1)/fp 11 e=abs((x-x1)/x) UnboundLocalError: local variable 'x1' referenced before assignment
错误原因
- 参数定义错误:
secante函数参数列表未定义x0和x1,代码却直接使用这两个变量,触发未定义错误;同时调用时把初始点传给了无关的x和fp,不符合割线法需要两个初始点的逻辑。 - 逻辑顺序错误:
break语句后的x0=x1和x1=x永远不会执行,break会直接跳出循环,导致迭代点无法更新。 - 参数冗余:
fp作为函数参数传入,但函数内又重新赋值,属于无效参数。
修正后的代码
import numpy as np def f(x): return (-2*x**6) - (1.5*x**4) + (10*x) + 2 def secante(f, x0, x1, N=100, emax=0.0001): for k in range(N): # 计算割线斜率 fp = (f(x1) - f(x0)) / (x1 - x0) # 割线法迭代计算新的近似根 x_new = x1 - f(x1) / fp # 计算相对误差,避免除以0 e = abs((x_new - x1) / x_new) if x_new != 0 else abs(x_new - x1) print(f"迭代{k}: 近似根={x_new:.6f}, 函数值={f(x_new):.6f}, 误差={e:.6f}") # 满足精度要求则停止迭代 if e < emax: print(f"精度达标,最终近似根: {x_new:.6f}") return x_new # 更新迭代点,为下一次循环做准备 x0, x1 = x1, x_new print(f"已达最大迭代次数{N},未满足精度要求") return x1 # 传入初始点2和3调用函数 secante(f, 2, 3)
修正说明
- 调整函数参数:将参数改为
x0和x1,对应割线法的两个初始点,解决变量未定义问题。 - 修复循环逻辑:将迭代点更新代码放到
break之前,确保每次迭代都能更新x0和x1,同时保证满足精度时能正常退出。 - 优化误差计算:增加
x_new为0的判断,避免出现除以0的异常。 - 清理冗余参数:移除无用的
fp参数,函数内自行计算割线斜率,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Thedark
相关产品推荐
相关产品推荐

