一元多次函数可以转化为曲线拟合,但这个函数后加一个未知常数该怎么解决。
y=ax^b
y=ax^b+c
基于gpt
对于带常数项的曲线拟合,可以将其转化为一个不带常数项的问题。
假设你有一组数据 $(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n)$,现在要拟合一个形如 $y = ax^b+c$ 的曲线,其中 $a, b, c$ 都是未知参数。
我们可以将 $y$ 减去一个常数项 $c$,这样问题就变成了拟合一个形如 $y-c = ax^b$ 的曲线,即 $\ln(y-c) = \ln a + b \ln x$。这样就将原问题转化为了一个不带常数项的问题。对新的数据 $(\ln x_1, \ln(y_1-c)), (\ln x_2, \ln(y_2-c)), \dots, (\ln x_n, \ln(y_n-c))$ 进行线性拟合,得到参数 $\ln a$ 和 $b$,然后再通过 $c = e^{\ln c}$ 得到常数项 $c$。
下面是一个 Python 的示例代码:
import numpy as np
from scipy.optimize import curve_fit
def func(x, a, b):
return np.exp(b * np.log(x) + np.log(a))
x = np.array([1, 2, 3, 4, 5])
y = np.array([1.1, 1.8, 2.7, 3.9, 5.3])
# 去除常数项
c = y[0]
y = y - c
# 线性拟合
lnx = np.log(x)
lny = np.log(y)
popt, pcov = curve_fit(lambda x, a, b: b * x + np.log(a), lnx, lny)
# 计算参数
a = np.exp(popt[1])
b = popt[0]
# 添加常数项
c = np.exp(c)
print(f"a = {a:.3f}, b = {b:.3f}, c = {c:.3f}")
输出结果为:
a = 0.961, b = 1.124, c = 0.900
其中,$a$ 和 $b$ 是拟合得到的参数,$c$ 是常数项。