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

Python实现割线法(Secant Method)代码报错求助及问题排查

割线法(Secant Method)代码错误排查与修正

问题描述

需要实现Python版割线法求解方程$f(x)=0$的根,要求:

  • 函数接收初始猜测值$x0$、$x1$,参数$m$(解的小数位数)、$n$(迭代精度,需满足$|x(k+1)-x(k)| < 10^{-n}$)
  • 原代码导入math模块后运行报错,报错信息如下:
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-6-7ea489c76165> in <module>
     13     return x_k2, itr_num
     14 
---> 15 f(x) = math.asin(x) - 0.5
     16 Secant_Method(0.5,0.6,4,4)

NameError: name 'x' is not defined

原代码:

import math
def Secant_Method(x0,x1,m,n):
    delta_x = x1 - x0
    x_k = x1
    x_k1 = x0
    itr_num = 1
    while (abs(delta_x) > 10**(-n)) and (f(x_k) > 10**(-m)):
        x_k2 = x_k - f(x_k)*((x_k - x_k1)/(f(x_k) - f(x_k1)))
        delta_x = abs(x_k2 - x_k1)
        x_k1 = x_k
        x_k = x_k2
        itr_num += 1
    return x_k2, itr_num
f(x) = math.asin(x) - 0.5
Secant_Method(0.5,0.6,4,4)

错误原因分析

  • 函数定义语法错误:Python中定义函数不能用f(x) = ...这种数学表达式写法,必须用def关键字或者lambda表达式定义函数,否则会触发NameError(因为x未定义)。
  • 循环终止条件漏洞:
    • 判断函数值收敛时,应该取绝对值abs(f(x_k)) > 10**(-m),否则当函数值为负时会提前终止迭代。
    • 初始的delta_x未取绝对值,可能导致循环条件判断错误。
  • 变量未初始化风险:如果循环一次都不执行(比如初始猜测就满足精度),x_k2未定义,返回时会报错。
  • 迭代步长计算错误:更新delta_x时应该是abs(x_k2 - x_k),而不是abs(x_k2 - x_k1),因为迭代精度要求的是当前步和上一步的差值。

修正后的代码

import math

# 定义目标函数
def f(x):
    return math.asin(x) - 0.5

def Secant_Method(x0, x1, m, n):
    # 初始化迭代变量
    x_prev = x0
    x_curr = x1
    itr_num = 1
    # 计算初始差值和函数值
    delta_x = abs(x_curr - x_prev)
    f_curr = f(x_curr)
    
    # 迭代终止条件:满足精度要求 或 函数值足够小
    while delta_x > 10**(-n) and abs(f_curr) > 10**(-m):
        # 割线法迭代公式
        f_prev = f(x_prev)
        x_next = x_curr - f_curr * (x_curr - x_prev) / (f_curr - f_prev)
        # 更新差值和迭代变量
        delta_x = abs(x_next - x_curr)
        x_prev = x_curr
        x_curr = x_next
        f_curr = f(x_curr)
        itr_num += 1
    
    # 保留m位小数后返回结果和迭代次数
    return round(x_curr, m), itr_num

# 调用测试
root, iterations = Secant_Method(0.5, 0.6, 4, 4)
print(f"方程的根:{root},迭代次数:{iterations}")

代码说明

  • 用标准def语法定义目标函数f(x),避免语法错误。
  • 修正迭代终止条件:同时判断迭代步长的绝对值和函数值的绝对值,确保收敛到根。
  • 调整delta_x的计算逻辑,符合题目中“$|x(k+1)-x(k)| < 10^{-n}$”的要求。
  • 最后用round()函数将结果保留m位小数,满足题目输出要求。
  • 增加变量初始化,避免未定义变量的报错。

内容的提问来源于stack exchange,提问作者Guy Weizman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:43:15