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

最小化Chi Square函数时参数缺失问题求助

解决卡方函数最小化时的参数错误问题

问题根源梳理

  1. 目标函数参数格式错误:scipy.optimize.minimize要求目标函数必须接受单个一维数组作为输入参数,你定义的chisquard(a,b)是两个独立参数,不符合要求。
  2. minimize调用逻辑错误:你直接执行了chisquard(print(a,b),b)并将结果传入minimize,但minimize需要传入的是函数对象,而非函数的执行结果;同时此处的参数传递完全不符合预期。
  3. 变量名冗余且冲突:后续定义的a=np.linspace(-10,10)和b=np.linspace(-10,10)既与其他变量重名,又没有实际作用,属于冗余代码。
  4. 卡方计算的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:17:06