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

使用curve_fit拟合网格定义函数的多维拟合问题求助

解决curve_fit拟合二维网格函数的问题

我明白你遇到的问题了——scipy.optimize.curve_fit确实要求输入的自变量和因变量是一维数组,而你的数据是二维网格形式的。别担心,只需要做几个小调整就能搞定,核心思路是把二维数组扁平化,同时适配你的自定义函数的输入格式。

问题分析

你的myfunc现在接收的是二维的X、Y网格,但curve_fit会把自变量当成一维数组传递,所以需要调整函数,让它能处理扁平化后的X和Y,再计算对应的输出。另外,你的z数据也需要从二维转成一维。

修改后的完整代码

import numpy as np
from scipy.optimize import curve_fit

# 调整函数:接收扁平化后的x和y,更贴合curve_fit的参数传递逻辑
def myfunc(x, y, a, b):
    return a * (x**b + y**b)

# 生成二维网格(用meshgrid比手动循环更高效)
x = np.linspace(0, 1, 100)
y = np.linspace(0, 1, 100)
X, Y = np.meshgrid(x, y)

# 生成模拟的真实数据(对应你要拟合的目标)
z_true = X**2 + Y**2

# 把二维数组扁平化,转成curve_fit要求的一维格式
x_flat = X.ravel()
y_flat = Y.ravel()
z_flat = z_true.ravel()

# 调用curve_fit:用lambda把多个自变量打包传递
popt, pcov = curve_fit(lambda x, y, a, b: myfunc(x, y, a, b), 
                      (x_flat, y_flat), z_flat, p0=[1, 2])

print("拟合得到的参数a:", popt[0])
print("拟合得到的参数b:", popt[1])

关键调整点

  • 扁平化数组:用ravel()方法把二维的X、Y、z数组转成一维,这是让curve_fit能处理数据的核心步骤。
  • 函数适配:把原来接收元组的函数改成直接接收扁平化后的x和y,逻辑更清晰;如果想保留原函数结构,也可以用下面的写法。
  • 多自变量传递:在调用curve_fit时,用lambda函数把多个自变量打包成元组,这是处理多自变量拟合的标准方式。

兼容原函数结构的写法

如果你想保留最初myfunc接收元组的形式,只需要修改调用部分:

def myfunc(VARS, a, b):
    X, Y = VARS
    return a * (X**b + Y**b)

# 直接传递扁平化后的元组作为自变量
popt, pcov = curve_fit(myfunc, (x_flat, y_flat), z_flat, p0=[1, 2])

验证效果

运行代码后,你会看到拟合出的a接近1,b接近2,和你模拟数据的真实参数一致,说明拟合成功啦。

内容的提问来源于stack exchange,提问作者Joshhh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:46:34