最小化Chi Square函数时参数缺失问题求助
解决卡方函数最小化时的参数错误问题
问题根源梳理
- 目标函数参数格式错误:
scipy.optimize.minimize要求目标函数必须接受单个一维数组作为输入参数,你定义的chisquard(a,b)是两个独立参数,不符合要求。 minimize调用逻辑错误:你直接执行了chisquard(print(a,b),b)并将结果传入minimize,但minimize需要传入的是函数对象,而非函数的执行结果;同时此处的参数传递完全不符合预期。- 变量名冗余且冲突:后续定义的
a=np.linspace(-10,10)和b=np.linspace(-10,10)既与其他变量重名,又没有实际作用,属于冗余代码。 - 卡方计算的x值不匹配:
chisquard中使用的x是linspace(-15,15,30),但listofvalues是基于i=-14到15计算的,两者x值范围不对应,会导致计算维度或逻辑错误。
修正后的完整代码
import numpy as np from matplotlib import pyplot as plt import scipy.optimize as opt Mystudentnumber = 4420608 def f(x): a = float(str(Mystudentnumber)[-2:])/5 b = float(str(Mystudentnumber)[-2:])/2 return a*(x**4) + b # 绘制原始散点图 x = np.linspace(-15,15,30) plt.scatter(x, f(x), color='red') plt.xlabel("x axis") plt.ylabel("y axis") plt.title("Graph of function f(x)") plt.grid() plt.show() # 生成观测值O和对应的x数据 x_data = np.arange(-14, 16) # 对应i从-14到15,共30个值 listofvalues = [f(i) for i in x_data] error = [20,30,50,70,20,40,20,60,80,10,30,40,20,80,60,55,30,20,30,10,80,20,50,70,20,70,40,20,40,70] # 修正卡方函数:接受单个参数数组,包含a和b def chisquard(params): a, b = params E = a*(x_data**4) + b O = listofvalues err = error chisq = np.sum(((O - E)/err)**2) return chisq # 初始参数猜测 x0 = np.array([0, 0]) # 正确调用minimize:传入函数对象和初始值 result = opt.minimize(chisquard, x0) print("最小化结果:") print(result) print(f"最优参数a: {result.x[0]}, b: {result.x[1]}") print(f"最小卡方值: {result.fun}") assert result.success == True
修正说明
- 把
chisquard函数改成接受单个params数组,从中拆分出a和b,符合minimize的要求。 - 定义
x_data对应观测值的x范围,确保卡方计算中理论值E和观测值O的维度完全匹配。 - 移除冗余的
a=np.linspace(...)和b=np.linspace(...)代码,避免变量名冲突。 - 正确调用
opt.minimize(chisquard, x0),传入函数对象而非执行结果。
内容的提问来源于stack exchange,提问作者James Olivier bv
相关产品推荐
相关产品推荐

