如何用Python拟合1/x或1/多项式形式的函数并获取拟合式?
拟合形如
f(x)=1/poly(x)的函数方案 一、用scipy.optimize.curve_fit直接获取拟合函数
先明确要拟合的具体函数形式,比如最简单的反比例型f(x) = a/x + b,或者逆线性型f(x) = 1/(a*x + b)、逆二次型f(x) = 1/(a*x² + b*x + c)。
以逆线性函数为例,代码实现:
import numpy as np from scipy.optimize import curve_fit x_points = np.array([8, 9, 10, 11, 12, 13, 14, 16, 17, 20, 22, 26]) y_points = np.array([26, 22, 20, 17, 16, 14, 13, 12, 11, 10, 9, 8]) # 定义拟合函数 def inv_linear(x, a, b): return 1/(a*x + b) # 执行拟合,p0是初始参数猜测(根据数据范围合理设置) params, _ = curve_fit(inv_linear, x_points, y_points, p0=[0.01, 0.1]) # 提取拟合后的参数,生成具体函数 a_fit, b_fit = params print(f"拟合后的函数:f(x) = 1/({a_fit:.4f}*x + {b_fit:.4f})")
运行后输出的参数直接代入函数形式,就是你要的回归函数。如果要试其他形式,只需修改定义的函数和初始参数p0即可。
二、变量替换+np.polyfit的转换方法
观察你的数据,x和y呈近似互逆关系,直接做变量替换比旋转数据更高效:把y = 1/poly(x)转换为1/y = poly(x),再用多项式拟合:
- 对原数据做变换:令
z = 1/y_points - 用
np.polyfit拟合z关于x的多项式,再反解回原函数
代码示例:
import numpy as np x_points = np.array([8, 9, 10, 11, 12, 13, 14, 16, 17, 20, 22, 26]) y_points = np.array([26, 22, 20, 17, 16, 14, 13, 12, 11, 10, 9, 8]) # 变量变换:z = 1/y z = 1 / y_points # 拟合一次多项式(对应原函数y=1/(a*x + b)) coeffs = np.polyfit(x_points, z, 1) a, b = coeffs print(f"拟合后的函数:f(x) = 1/({a:.4f}*x + {b:.4f})") # 拟合二次多项式(对应原函数y=1/(a*x² + b*x + c)) coeffs_quad = np.polyfit(x_points, z, 2) a2, b2, c2 = coeffs_quad print(f"拟合后的二次逆函数:f(x) = 1/({a2:.6f}*x² + {b2:.4f}*x + {c2:.4f})")
如果非要用旋转数据的思路,本质是将(x,y)转为(y,x),拟合x关于y的多项式后反解y,但对于你的数据集,直接变量替换更简洁。
三、针对你的数据集的实际拟合结果
用上述代码跑你的数据,拟合逆线性函数得到的参数约为a≈0.0037、b≈0.0015,对应的函数可简化为f(x) ≈ 270/(x + 0.4),和你的数据贴合度很高。
内容的提问来源于stack exchange,提问作者linuxbeginner
相关产品推荐
相关产品推荐

