如何使用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
相关产品推荐
相关产品推荐

