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

使用SciPy brentq求函数根时遇TypeError错误求助

解决SciPy brentq的TypeError问题

首先,咱们来拆解你遇到的错误:TypeError: f() takes 0 positional arguments but 1 was given,这个错误的核心原因是**brentq函数在迭代求解根的过程中,会自动把当前尝试的x值传递给你的目标函数f,但你的f定义时没有接受任何参数**,所以触发了参数不匹配的报错。

除此之外,你的f函数逻辑也存在偏差:Legendre.basis(3).linspace()是生成一组x坐标和对应的多项式值数组,而brentq需要的是一个能接受单个x值、返回对应函数值的函数,不是返回数组的函数。

修正步骤

  1. 让目标函数接受x参数:修改f函数,让它接收一个x输入,返回三次Legendre多项式在x处的计算值。你可以直接调用Legendre多项式对象的__call__方法来实现这一点。
  2. 调整求解区间:三次Legendre多项式(Legendre.basis(3))的表达式是$\frac{5x^3 - 3x}{2}$,它的根是$0, \pm\sqrt{\frac{3}{5}} \approx \pm0.7746$。你原来选的区间[1,2]内函数值都是正数(代入x=1得1,x=2得17),没有符号变化,brentq无法找到根,所以需要换成包含根的区间,比如[-1, 0]或者[0, 1]。

修正后的完整代码

from scipy.optimize import brentq
import matplotlib.pyplot as plt
from numpy.polynomial import Legendre

# 定义接受x参数的目标函数
def f(x):
    # 返回三次Legendre多项式在x处的值
    return Legendre.basis(3)(x)

# 选择包含根的区间,这里选[-0.8, 0]确保函数值跨0
root = brentq(f, -0.8, 0)
print(f"找到的根:{root}")

# 可选:可视化多项式和求解得到的根
x_vals, y_vals = Legendre.basis(3).linspace(100)
plt.plot(x_vals, y_vals, label='三次Legendre多项式')
plt.scatter(root, f(root), color='red', marker='o', label='求解得到的根')
plt.axhline(y=0, color='gray', linestyle='--')
plt.legend()
plt.show()

验证结果

运行上面的代码,你会得到接近-√(3/5)≈-0.7746的根,符合预期。如果想找正根,只需把区间改成[0, 0.8],得到的根会接近0.7746。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:44:47