You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因

  1. 参数定义错误:secante函数参数列表未定义x0和x1,代码却直接使用这两个变量,触发未定义错误;同时调用时把初始点传给了无关的x和fp,不符合割线法需要两个初始点的逻辑。
  2. 逻辑顺序错误:break语句后的x0=x1和x1=x永远不会执行,break会直接跳出循环,导致迭代点无法更新。
  3. 参数冗余: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:15:34