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

如何使用Python的scipy.optimize.fmin最小化卡方值以优化参数C1、C2

如何使用Python的scipy.optimize.fmin最小化卡方值以优化参数C1、C2

嘿,我完全懂你现在的困惑——之前那个简单的fmin例子看起来很直接,但到了卡方拟合这种需要结合观测数据的场景,参数传递的方式确实得调整一下,不然就会触发位置参数不匹配的错误。我来一步步帮你理顺:

核心要点:fmin的参数要求

scipy.optimize.fmin要求待优化的所有参数必须打包成一个一维数组,作为目标函数(也就是你要最小化的卡方函数)的第一个参数。而那些固定不变的输入(比如观测值y、误差yerr、时间数组time_input),我们可以通过fmin的args参数传递进去,不用把它们放进待优化的参数里。

完整代码示例

下面是适配你需求的完整实现,你可以直接替换成自己的模型和数据:

首先导入必要的库:

import numpy as np
import scipy.optimize as optimize

定义你的模型函数f(这里用一个示例表达式,你替换成自己的真实模型即可):

def f(C1, C2, t):
    # 示例模型:你可以改成任何包含C1、C2和时间t的表达式
    return C1 * np.sin(t) + C2 * t**2

定义卡方函数,注意第一个参数是打包了C1、C2的数组:

def chi_squared(params, y, yerr, time_input):
    # 从参数数组里解包出C1和C2
    C1, C2 = params
    # 用当前参数计算模型预测值
    model = f(C1, C2, time_input)
    # 计算卡方值并返回
    return np.sum(((y - model) / yerr) ** 2)

准备你的观测数据(替换成你自己的真实数据):

# 假设你的data数组包含时间、观测值、误差三列
data = np.loadtxt("your_data_file.csv")  # 或者直接用你已有的data数组
time_input = data[:, 0]
y = data[:, 1]       # 真实观测值
yerr = data[:, 2]    # 观测值的误差

设置初始猜测的参数值,打包成数组:

# 你给出的初始猜测值
initial_guess = [0.002, 0.003]

调用fmin进行优化:

# 把固定的观测数据通过args传给卡方函数
optimized_params = optimize.fmin(chi_squared, x0=initial_guess, args=(y, yerr, time_input))

查看优化结果:

print("优化后的参数:")
print(f"C1 = {optimized_params[0]:.6f}, C2 = {optimized_params[1]:.6f}")

为什么之前会报错?

你之前的问题大概率是:要么把C1、C2作为单独的参数传给了卡方函数(而不是打包成数组),要么调用fmin时没有通过args传递固定的观测数据,导致卡方函数收到的参数个数和预期不符,触发了位置参数错误。现在的写法完美适配了fmin的要求,就不会有这个问题了。

小提示

如果你的模型比较复杂,或者需要更精准的优化(比如带约束条件),可以试试scipy.optimize.minimize,它支持更多优化方法,功能更强大。但对于这种无约束的卡方最小化,fmin已经足够好用啦。

备注:内容来源于stack exchange,提问作者User1265

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:04:08