使用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值、返回对应函数值的函数,不是返回数组的函数。
修正步骤
- 让目标函数接受x参数:修改
f函数,让它接收一个x输入,返回三次Legendre多项式在x处的计算值。你可以直接调用Legendre多项式对象的__call__方法来实现这一点。 - 调整求解区间:三次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
相关产品推荐
相关产品推荐

