如何通过数据集求解函数y=Ax^(4/3)的参数A?
解决y=Ax^(4/3)的参数拟合问题
1. 修正curve_fit的核心错误
你当前的拟合函数参数顺序完全颠倒了,curve_fit要求拟合函数的第一个参数是自变量x,后续才是待拟合的参数。你的写法会让程序把A当成自变量、x当成拟合参数,直接导致结果完全错误。
修正后的代码:
from scipy.optimize import curve_fit def func(x, A): return A * x**(4/3) # 代入你的x、y数据 popt, pcov = curve_fit(func, x[:18], y[:18]) print(popt) # 此时应该能得到接近0.055的合理结果
2. 优化线性化拟合的稳定性
你之前用对数线性化+polyfit时,移除点后斜率波动大,本质是对数变换会放大小数值点的误差。可以通过以下方式优化:
- 不要随意删除数据点,仅移除明确的异常值(比如用3σ准则判定)
- 使用加权最小二乘法,给y值较大的点更高权重(这类点的对数变换误差更小):
import numpy as np # 线性化转换:ln(y) = ln(A) + (4/3)ln(x) ln_x = np.log(x[:18]) ln_y = np.log(y[:18]) # 用原始y值作为权重,放大可靠数据的影响力 weights = y[:18] # 加权拟合一次直线 coeffs = np.polyfit(ln_x, ln_y, 1, w=weights) # 还原A值 A = np.exp(coeffs[1]) print(A)
3. 验证拟合效果的实用方法
无论用哪种方法,拟合后都建议画图验证效果:
import matplotlib.pyplot as plt # 生成拟合曲线的x序列 x_fit = np.linspace(min(x[:18]), max(x[:18]), 100) y_fit = func(x_fit, popt[0]) plt.scatter(x[:18], y[:18], label='原始数据') plt.plot(x_fit, y_fit, 'r-', label=f'拟合曲线 A={popt[0]:.4f}') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者epselonzero
相关产品推荐
相关产品推荐

