已知多项式拟合曲线与部分参数,如何求解系数d?
问题:从拟合曲线中获取系数d的具体值
我有一组数据集,已通过以下代码绘制并拟合曲线:
import numpy as np import matplotlib.pyplot as plt R= -1.6, -1.4, -1.2, -1.0, -0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6 power = 486.040152, 343.466487, 233.706048, 151.069770, 90.792498, 48.455720, 20.748440, 5.267210, 0.080000, 5.267210, 20.748440, 48.455720, 90.792498, 151.069770, 233.706048, 343.466487, 486.040152 p = np.polyfit(R, power, 4) #定义多项式 f = np.poly1d(p) #定义函数 plt.plot(R, power, '<', color="brown", fillstyle='none', label="R(T=1.23)", markersize=12) plt.plot(R, f(R), color="brown", linewidth=2.0) plt.ylabel('Power', fontsize='20') plt.xlabel('Distance', fontsize='20') plt.legend(framealpha=1, frameon=False, fontsize='16', loc=(0.4, 0.75), ncol=1, handletextpad=-0.4)
绘制的图像如下:
该曲线还可表示为以下函数形式:
f(T, R) = (a1 * T²) + (b1 * T⁴) + (a2 * R²) + (b2 * R⁴) + (d * T² * R²)
已知参数:a1 = -73.08、b1 = 29.16、a2 = 74.37、b2 = 25.46、T = 1.23,请问如何从拟合曲线中获取系数d的具体值?
解决方案
有两种方法可以获取系数d:
方法一:对比多项式系数求解
代入T并整理目标函数
先计算T的幂次:- T² = 1.23² = 1.5129
- T⁴ = (1.23²)² ≈ 2.28886641
把已知参数代入目标函数,整理为关于R的多项式:
f(R) = (-43.8194) + (74.37 + 1.5129*d)R² + 25.46R⁴注:常数项由
a1*T² + b1*T⁴计算得出。对比拟合多项式的系数
np.polyfit(R, power, 4)返回的系数数组p是从高次到低次排列:[R⁴系数, R³系数, R²系数, R系数, 常数项]。由于数据关于R对称,R的奇次项系数会接近0。取R²项的系数
p[2],代入等式:p[2] = 74.37 + 1.5129*d求解d:
d = (p[2] - 74.37) / 1.5129
方法二:直接拟合目标函数求解(更准确)
直接以目标函数为模型,仅将d作为未知参数拟合,避免多项式拟合的误差累积:
import numpy as np from scipy.optimize import curve_fit # 已知参数 a1 = -73.08 b1 = 29.16 a2 = 74.37 b2 = 25.46 T = 1.23 T2 = T**2 T4 = T**4 # 定义目标函数 def power_model(R, d): return a1*T2 + b1*T4 + (a2 + d*T2)*np.square(R) + b2*np.power(R, 4) # 转换数据为numpy数组 R = np.array([-1.6, -1.4, -1.2, -1.0, -0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6]) power = np.array([486.040152, 343.466487, 233.706048, 151.069770, 90.792498, 48.455720, 20.748440, 5.267210, 0.080000, 5.267210, 20.748440, 48.455720, 90.792498, 151.069770, 233.706048, 343.466487, 486.040152]) # 拟合求解d popt, _ = curve_fit(power_model, R, power) d_value = popt[0] print(f"系数d的值为:{d_value:.4f}")
运行这段代码后,即可得到准确的d值。
内容的提问来源于stack exchange,提问作者Bip
相关产品推荐
相关产品推荐

