请问如何用curve_fit拟合一个二元方程大体方程 z=(a*x**b)ln(cy),需要输入xyz求abc

请问如何用curve_fit拟合一个二元方程
大体方程 z=(a*x**b)ln(cy),需要输入xyz求abc

可以使用scipy库中的curve_fit函数来拟合二元函数。首先,需要定义函数的形式,然后将数据和参数传递给curve_fit。例如:

from scipy.optimize import curve_fit
import numpy as np

# 定义函数形式
def func(x, a, b, c):
    return a*x**b*np.log(c*y)

# 提供数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10])
z = np.array([3, 6, 9, 12, 15])

# 估计参数
popt, pcov = curve_fit(func, (x, y), z)

# popt为估计的参数a, b, c

需要注意的是,如果数据存在噪声或者函数形式不准确,估计的参数可能不准确,需要根据具体情况进行修正。

详见 Python小白的数学建模课-23.数据拟合全集

curve_fit() 使用非线性最小二乘法将自定义的拟合函数拟合到观测数据,不仅可以用于直线、二次曲线、三次曲线的拟合,而且可以适用于任意形式的自定义函数的拟合,使用非常方便。curve_fit() 允许进行单变量或多变量的自定义函数拟合。
curve_fit() 定义一个拟合函数 fitfunc7(X, p0, p1, p2, p3),函数名可以任意定义,但拟合函数的参数必须按照 (x,p1,p2,…) 的顺序排列,不能改变次序。p1, p2,… 是标量,不能写成数组。

# mathmodel25_v1.py
# Demo25 of mathematical modeling algorithm
# Demo of curve fitting with Scipy
# Copyright 2021 YouCans, XUPT
# Crated:2021-08-03

# 7. 自定义函数曲线拟合:多变量
import numpy as np
import matplotlib.pyplot as plt  # 导入 Matplotlib 工具包
from scipy.optimize import curve_fit  # 导入 scipy 中的曲线拟合工具

def fitfunc7(X, p0, p1, p2, p3):  # 定义多变量拟合函数, X 是向量
    # p0, p1, p2, p3 = p  # 拟合函数的参数
    y = p0 + p1*X[0,:] + p2*X[1,:] + p3*np.sin(X[0,:]+X[1,:]+X[0,:]**2+X[1,:]**2)
    return y

# 创建给定数据点集 (x,yObs)
p = [1.0, 0.5, -0.5, 5.0]  # 自定义函数的参数
p0, p1, p2, p3 = p  # y = p0 + p1*x1 + p2*x2 + p3*np.sin(x1+x2+x1^2+x2^2)
np.random.seed(1)
x1 = 2.0 * np.random.rand(8)  # 生成随机数组,长度为 8
x2 = 3.0 * np.random.rand(5)  # 生成随机数组,取值范围 (0,3.0)
xmesh1, xmesh2 = np.meshgrid(x1, x2)  # 生成网格点的坐标 xx,yy (二维数组)
xx1= xmesh1.reshape(xmesh1.shape[0]*xmesh1.shape[1], )  # 将网格点展平为一维数组
xx2= xmesh2.reshape(xmesh2.shape[0]*xmesh2.shape[1], )  # 将网格点展平为一维数组
X = np.vstack((xx1,xx2))  # 生成多变量数组,行数为变量个数
y = fitfunc7(X, p0, p1, p2, p3)  # 理论计算值 y=f(X,p)
yObs = y + 0.2*np.random.randn(y.shape[-1])  # 生成带有噪声的观测数据
print(x1.shape,x2.shape,xmesh1.shape,xx1.shape,X.shape)

# 用 scipy.optimize.curve_fit() 进行自定义函数拟合(多变量)
pFit, pcov = curve_fit(fitfunc7, X, yObs)  # 非线性最小二乘法曲线拟合
print("Data fitting of multivariable custom function")
print("y = p0 + p1*x1 + p2*x2 + p3*np.sin(x1+x2+x1^2+x2^2)")
for i in range(4):
    print("p[{:d}] = {:.4f}\tp[{:d}]_fit = {:.4f}".format(i, p[i], i, pFit[i]))

# 由拟合函数 fitfunc 计算拟合曲线在数据点的函数值
yFit = fitfunc7(X, pFit[0], pFit[1], pFit[2], pFit[3])