|
目录编辑第一部分:插值的基本原理及应用1.插值的基本原理1.1插值多项式1.2拉格朗日插值 1.3牛顿插值 1.4样条插值2.插值的Python实现2.1使用NumPy进行插值2.2使用SciPy进行插值2.2.1一维插值编辑2.2.2二维插值3.插值的应用场景3.1数据平滑和填补3.2图像处理编辑3.3数值模拟4.实例分析实例1:空气质量数据的校准编辑实例2:波浪能最大输出功率设计第二部分:拟合的基本原理及应用1.拟合的基本原理1.1线性拟合1.2多项式拟合1.3指数拟合编辑1.4对数拟合编辑1.5幂函数拟合2.拟合的Python实现2.1使用SciPy进行拟合2.1.1线性拟合2.1.2多项式拟合2.1.3指数拟合2.1.4对数拟合2.1.5幂函数拟合3.拟合的应用场景3.1数据预测3.2数据建模3.3物理实验数据分析3.4工程设计4.实例分析实例1:股票价格预测实例2:温度变化分析总结 专栏:数学建模学习笔记第一部分:插值的基本原理及应用1.插值的基本原理插值是一种在已知数据点之间估算函数值的方法。它在数据分析、信号处理和数值分析中具有广泛应用。插值的目标是通过构造一个插值函数,使该函数在给定的数据点处具有精确的函数值。1.1插值多项式1.2拉格朗日插值 importnumpyasnpimportmatplotlib.pyplotasplt#拉格朗日基函数deflagrange_basis(x,x_values,j):basis=1foriinrange(len(x_values)):ifi!=j:basis*=(x-x_values[i])/(x_values[j]-x_values[i])returnbasis#拉格朗日插值多项式deflagrange_interpolation(x,x_values,y_values):interpolation=0forjinrange(len(y_values)):interpolation+=y_values[j]*lagrange_basis(x,x_values,j)returninterpolation#数据点x_values=np.array([0,1,2,3,4,5])y_values=np.array([1,3,2,5,7,8])#插值点x_interp=np.linspace(0,5,100)y_interp=[lagrange_interpolation(x,x_values,y_values)forxinx_interp]#绘图plt.plot(x_values,y_values,'o',label='Datapoints')plt.plot(x_interp,y_interp,'-',label='LagrangeInterpolation')plt.legend()plt.xlabel('x')plt.ylabel('y')plt.show() 1.3牛顿插值 importnumpyasnpimportmatplotlib.pyplotasplt#计算差分商defdivided_diff(x_values,y_values):n=len(x_values)coef=np.zeros([n,n])coef[:,0]=y_valuesforjinrange(1,n):foriinrange(n-j):coef[i][j]=(coef[i+1][j-1]-coef[i][j-1])/(x_values[i+j]-x_values[i])returncoef[0,:]#牛顿插值多项式defnewton_interpolation(x,x_values,coef):n=len(x_values)-1p=coef[n]forkinrange(1,n+1):p=coef[n-k]+(x-x_values[n-k])*preturnp#数据点x_values=np.array([0,1,2,3,4,5])y_values=np.array([1,3,2,5,7,8])#计算差分商系数coef=divided_diff(x_values,y_values)#插值点x_interp=np.linspace(0,5,100)y_interp=[newton_interpolation(x,x_values,coef)forxinx_interp]#绘图plt.plot(x_values,y_values,'o',label='Datapoints')plt.plot(x_interp,y_interp,'-',label='NewtonInterpolation')plt.legend()plt.xlabel('x')plt.ylabel('y')plt.show() 1.4样条插值样条插值是一种分段插值方法。常见的样条插值包括线性样条和三次样条。三次样条插值具有良好的光滑性和逼近性能,是一种常用的插值方法。三次样条插值代码示例:importnumpyasnpfromscipy.interpolateimportCubicSplineimportmatplotlib.pyplotasplt#数据点x=np.array([0,1,2,3,4,5])y=np.array([1,3,2,5,7,8])#创建三次样条插值对象cs=CubicSpline(x,y)#插值点x_interp=np.linspace(0,5,100)y_interp=cs(x_interp)#绘图plt.plot(x,y,'o',label='Datapoints')plt.plot(x_interp,y_interp,'-',label='CubicSplineInterpolation')plt.legend()plt.xlabel('x')plt.ylabel('y')plt.show()2.插值的Python实现Python提供了丰富的库来实现插值方法,主要包括NumPy和SciPy库。2.1使用NumPy进行插值NumPy提供了一些基本的插值函数,例如numpy.interp可以进行一维线性插值。importnumpyasnpimportmatplotlib.pyplotasplt#原始数据点x=np.linspace(0,10,10)y=np.sin(x)#插值点x_interp=np.linspace(0,10,100)y_interp=np.interp(x_interp,x,y)#绘图plt.plot(x,y,'o',label='Originaldata')plt.plot(x_interp,y_interp,'-',label='Interpolateddata')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()2.2使用SciPy进行插值SciPy提供了更加全面的插值函数,例如scipy.interpolate.interp1d和scipy.interpolate.CubicSpline。2.2.1一维插值fromscipy.interpolateimportinterp1dimportnumpyasnpimportmatplotlib.pyplotasplt#原始数据点x=np.linspace(0,10,10)y=np.sin(x)#创建插值对象linear_interp=interp1d(x,y,kind='linear')cubic_interp=interp1d(x,y,kind='cubic')#插值点x_interp=np.linspace(0,10,100)y_linear=linear_interp(x_interp)y_cubic=cubic_interp(x_interp)#绘图plt.plot(x,y,'o',label='Originaldata')plt.plot(x_interp,y_linear,'-',label='Linearinterpolation')plt.plot(x_interp,y_cubic,'--',label='Cubicinterpolation')plt.legend()plt.show()2.2.2二维插值fromscipy.interpolateimportRectBivariateSplineimportnumpyasnpimportmatplotlib.pyplotasplt#原始数据点x=np.linspace(0,10,10)y=np.linspace(0,10,10)z=np.sin(x[:,None]+y[None,:])#创建插值对象linear_interp=RectBivariateSpline(x,y,z,kx=1,ky=1)cubic_interp=RectBivariateSpline(x,y,z,kx=3,ky=3)#插值点x_interp=np.linspace(0,10,100)y_interp=np.linspace(0,10,100)z_linear=linear_interp(x_interp,y_interp)z_cubic=cubic_interp(x_interp,y_interp)#绘图plt.subplot(1,2,1)plt.imshow(z_linear,extent=(0,10,0,10),origin='lower',aspect='auto')plt.title('Linearinterpolation')plt.subplot(1,2,2)plt.imshow(z_cubic,extent=(0,10,0,10),origin='lower',aspect='auto')plt.title('Cubicinterpolation')plt.show() 3.插值的应用场景插值在许多实际问题中都有广泛的应用,例如:3.1数据平滑和填补在处理实验数据时,可能会遇到一些缺失值或噪声数据。插值可以用于平滑数据和填补缺失值,使数据更加连贯。importnumpyasnpfromscipy.interpolateimportinterp1dimportmatplotlib.pyplotasplt#原始数据点,包含缺失值x=np.array([0,1,2,4,5,7,8,9])y=np.array([3,2,7,1,8,6,2,5])#创建插值对象f_linear=interp1d(x,y,kind='linear')#插值点,包括原始数据点和缺失值x_interp=np.arange(0,10,1)y_interp=f_linear(x_interp)#绘图plt.plot(x,y,'o',label='Originaldata')plt.plot(x_interp,y_interp,'-',label='Interpolateddata')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()3.2图像处理在图像处理领域,插值常用于图像的放大、缩小和旋转。例如,双线性插值和双三次插值是常用的图像插值方法。importnumpyasnpfromscipy.ndimageimportzoomimportmatplotlib.pyplotaspltfromskimageimportdata#加载示例图像image=data.camera()#使用双线性插值进行图像缩放zoom_factor=2image_zoomed=zoom(image,zoom_factor,order=1)#order=1表示双线性插值#显示原始图像和缩放后的图像plt.subplot(1,2,1)plt.title('OriginalImage')plt.imshow(image,cmap='gray')plt.subplot(1,2,2)plt.title('ZoomedImage')plt.imshow(image_zoomed,cmap='gray')plt.show()3.3数值模拟在数值模拟中,插值用于构造离散点之间的连续函数。例如,在有限元方法中,插值用于构造形函数。importnumpyasnpfromscipy.interpolateimportCubicSplineimportmatplotlib.pyplotasplt#离散点x=np.linspace(0,10,10)y=np.sin(x)#创建三次样条插值对象cs=CubicSpline(x,y)#插值点x_interp=np.linspace(0,10,100)y_interp=cs(x_interp)#绘图plt.plot(x,y,'o',label='Discretepoints')plt.plot(x_interp,y_interp,'-',label='CubicSplineInterpolation')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()4.实例分析为了更好地理解插值方法,我们来看一个具体的实例分析。实例1:空气质量数据的校准在2019年的全国大学生数学建模竞赛中,赛题涉及到空气质量数据的校准问题,需要使用插值算法来处理不完整的数据。importnumpyasnpfromscipy.interpolateimportinterp1dimportmatplotlib.pyplotasplt#原始数据点days=np.array([1,2,4,7,8,10])aqi=np.array([50,55,70,65,60,75])#创建插值对象interp=interp1d(days,aqi,kind='cubic')#插值点days_interp=np.linspace(1,10,100)aqi_interp=interp(days_interp)#绘图plt.plot(days,aqi,'o',label='Originaldata')plt.plot(days_interp,aqi_interp,'-',label='Interpolateddata')plt.xlabel('Days')plt.ylabel('AQI')plt.legend()plt.show()实例2:波浪能最大输出功率设计在2022年的全国大学生数学建模竞赛中,赛题涉及到波浪能最大输出功率的设计问题,需要使用插值算法来优化设计参数。importnumpyasnpfromscipy.interpolateimportinterp1dimportmatplotlib.pyplotasplt#原始数据点wave_heights=np.array([0.5,1.0,1.5,2.0,2.5,3.0])power_output=np.array([10,20,30,40,50,60])#创建插值对象interp=interp1d(wave_heights,power_output,kind='cubic')#插值点wave_heights_interp=np.linspace(0.5,3.0,100)power_output_interp=interp(wave_heights_interp)#绘图plt.plot(wave_heights,power_output,'o',label='Originaldata')plt.plot(wave_heights_interp,power_output_interp,'-',label='Interpolateddata')plt.xlabel('WaveHeights(m)')plt.ylabel('PowerOutput(kW)')plt.legend()plt.show()、第二部分:拟合的基本原理及应用1.拟合的基本原理拟合是一种通过选择适当的函数形式,使该函数尽可能逼近已知数据点的方法。拟合的目的是通过已有的数据点,预测或估计未知数据点的值。拟合方法包括线性拟合、多项式拟合、指数拟合、对数拟合等。1.1线性拟合线性拟合假设数据点之间的关系是线性的,通过最小二乘法求解线性方程组,得到拟合直线。线性拟合的目标函数为:fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#线性拟合函数deflinear_func(x,a,b):returna*x+b#数据点xdata=np.linspace(0,10,10)ydata=2.5*xdata+1.0+np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(linear_func,xdata,ydata)yfit=linear_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'o',label='Data')plt.plot(xdata,yfit,'-',label='LinearFit')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()1.2多项式拟合多项式拟合使用多项式函数来拟合数据点。多项式的阶数越高,拟合效果越好,但也容易出现过拟合现象。多项式拟合的目标函数为:importnumpyasnpimportmatplotlib.pyplotasplt#数据点xdata=np.linspace(0,10,10)ydata=2.5*xdata**2+1.0+np.random.normal(size=len(xdata))#多项式拟合p=np.polyfit(xdata,ydata,2)yfit=np.polyval(p,xdata)#绘图plt.plot(xdata,ydata,'o',label='Data')plt.plot(xdata,yfit,'-',label='PolynomialFit')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show() 1.3指数拟合指数拟合假设数据点之间的关系是指数函数,通过对数变换和线性拟合相结合的方法进行求解。指数拟合的目标函数为:fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#指数拟合函数defexponential_func(x,a,b):returna*np.exp(b*x)#数据点xdata=np.linspace(0,4,10)ydata=2.5*np.exp(1.3*xdata)+np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(exponential_func,xdata,ydata)yfit=exponential_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'o',label='Data')plt.plot(xdata,yfit,'-',label='ExponentialFit')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()1.4对数拟合对数拟合假设数据点之间的关系是对数函数,通过非线性最小二乘法进行求解。对数拟合的目标函数为:fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#对数拟合函数deflogarithmic_func(x,a,b):returna*np.log(x)+b#数据点xdata=np.linspace(1,10,10)ydata=2.5*np.log(xdata)+1.0+np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(logarithmic_func,xdata,ydata)yfit=logarithmic_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'o',label='Data')plt.plot(xdata,yfit,'-',label='LogarithmicFit')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()1.5幂函数拟合幂函数拟合假设数据点之间的关系是幂函数,通过对数变换和线性拟合相结合的方法进行求解。幂函数拟合的目标函数为:fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#幂函数拟合函数defpower_func(x,a,b):returna*x**b#数据点xdata=np.linspace(1,10,10)ydata=2.5*xdata**1.5+np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(power_func,xdata,ydata)yfit=power_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'o',label='Data')plt.plot(xdata,yfit,'-',label='PowerFit')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()2.拟合的Python实现Python提供了丰富的库来处理拟合问题,常用的库包括SciPy和NumPy。2.1使用SciPy进行拟合SciPy提供了多种拟合函数,例如scipy.optimize.curve_fit可以进行非线性拟合。2.1.1线性拟合fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#线性拟合函数deflinear_func(x,a,b):returna*x+b#数据点xdata=np.linspace(0,10,50)ydata=2.5*xdata+1.0+0.5*np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(linear_func,xdata,ydata)yfit=linear_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'b-',label='Data')plt.plot(xdata,yfit,'r-',label='Fit:a=%.3f,b=%.3f'%tuple(popt))plt.legend()plt.show()2.1.2多项式拟合importnumpyasnpimportmatplotlib.pyplotasplt#数据点xdata=np.linspace(0,10,50)ydata=2.5*xdata**2+1.0+0.5*np.random.normal(size=len(xdata))#拟合p=np.polyfit(xdata,ydata,2)yfit=np.polyval(p,xdata)#绘图plt.plot(xdata,ydata,'b-',label='Data')plt.plot(xdata,yfit,'r-',label='Polynomialfit')plt.legend()plt.show()2.1.3指数拟合fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#指数拟合函数defexponential_func(x,a,b):returna*np.exp(b*x)#数据点xdata=np.linspace(0,4,50)ydata=2.5*np.exp(1.3*xdata)+0.5*np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(exponential_func,xdata,ydata)yfit=exponential_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'b-',label='Data')plt.plot(xdata,yfit,'r-',label='Fit:a=%.3f,b=%.3f'%tuple(popt))plt.legend()plt.show()2.1.4对数拟合fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#对数拟合函数deflogarithmic_func(x,a,b):returna*np.log(x)+b#数据点xdata=np.linspace(1,10,50)ydata=2.5*np.log(xdata)+1.0+0.5*np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(logarithmic_func,xdata,ydata)yfit=logarithmic_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'b-',label='Data')plt.plot(xdata,yfit,'r-',label='Fit:a=%.3f,b=%.3f'%tuple(popt))plt.legend()plt.show()2.1.5幂函数拟合fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#幂函数拟合函数defpower_func(x,a,b):returna*x**b#数据点xdata=np.linspace(1,10,50)ydata=2.5*xdata**1.5+0.5*np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(power_func,xdata,ydata)yfit=power_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'b-',label='Data')plt.plot(xdata,yfit,'r-',label='Fit:a=%.3f,b=%.3f'%tuple(popt))plt.legend()plt.show()3.拟合的应用场景拟合在许多实际问题中都有广泛的应用,例如:3.1数据预测在时间序列分析中,拟合常用于预测未来的数据点。例如,线性回归模型可以用于预测股票价格、温度变化等。fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#线性拟合函数deflinear_func(x,a,b):returna*x+b#数据点xdata=np.linspace(0,10,10)ydata=2.5*xdata+1.0+np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(linear_func,xdata,ydata)yfit=linear_func(xdata,*popt)#预测未来的数据点x_predict=np.linspace(10,15,5)y_predict=linear_func(x_predict,*popt)#绘图plt.plot(xdata,ydata,'o',label='Data')plt.plot(xdata,yfit,'-',label='LinearFit')plt.plot(x_predict,y_predict,'x',label='Prediction')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()3.2数据建模在机器学习中,拟合用于构建回归模型,以揭示数据之间的关系。常见的回归模型包括线性回归、逻辑回归和多项式回归。importnumpyasnpimportmatplotlib.pyplotasplt#数据点xdata=np.linspace(0,10,10)ydata=2.5*xdata**2+1.0+np.random.normal(size=len(xdata))#多项式拟合p=np.polyfit(xdata,ydata,2)yfit=np.polyval(p,xdata)#绘图plt.plot(xdata,ydata,'o',label='Data')plt.plot(xdata,yfit,'-',label='PolynomialFit')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()3.3物理实验数据分析在物理实验中,拟合用于分析实验数据,提取物理参数。例如,通过拟合实验数据,可以确定材料的弹性模量、热导率等物理参数。fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#指数拟合函数defexponential_func(x,a,b):returna*np.exp(b*x)#实验数据点xdata=np.linspace(0,4,10)ydata=2.5*np.exp(1.3*xdata)+np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(exponential_func,xdata,ydata)yfit=exponential_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'o',label='Data')plt.plot(xdata,yfit,'-',label='ExponentialFit')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()3.4工程设计在工程设计中,拟合用于优化设计参数。例如,在机械设计中,通过拟合实验数据,可以优化零件的尺寸和材料选择。fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#幂函数拟合函数defpower_func(x,a,b):returna*x**b#实验数据点xdata=np.linspace(1,10,10)ydata=2.5*xdata**1.5+np.random.normal(size=len(xdata))#拟合popt,pcov=curve_fit(power_func,xdata,ydata)yfit=power_func(xdata,*popt)#绘图plt.plot(xdata,ydata,'o',label='Data')plt.plot(xdata,yfit,'-',label='PowerFit')plt.xlabel('X')plt.ylabel('Y')plt.legend()plt.show()4.实例分析为了更好地理解拟合方法,我们来看几个具体的实例分析。实例1:股票价格预测通过拟合历史股票价格数据,可以预测未来的股票价格。fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#线性拟合函数deflinear_func(x,a,b):returna*x+b#历史股票价格数据days=np.array([1,2,3,4,5,6,7,8,9,10])prices=np.array([10,11,13,14,15,18,19,21,22,24])#拟合popt,pcov=curve_fit(linear_func,days,prices)predicted_prices=linear_func(days,*popt)#绘图plt.plot(days,prices,'o',label='Historicaldata')plt.plot(days,predicted_prices,'-',label='Predicteddata')plt.xlabel('Days')plt.ylabel('Prices')plt.legend()plt.show()实例2:温度变化分析通过拟合温度数据,可以分析温度变化的趋势。fromscipy.optimizeimportcurve_fitimportnumpyasnpimportmatplotlib.pyplotasplt#指数拟合函数defexponential_func(x,a,b):returna*np.exp(b*x)#温度数据days=np.array([1,2,3,4,5,6,7,8,9,10])temperatures=np.array([15,17,20,22,24,28,30,32,35,37])#拟合popt,pcov=curve_fit(exponential_func,days,temperatures)predicted_temperatures=exponential_func(days,*popt)#绘图plt.plot(days,temperatures,'o',label='Historicaldata')plt.plot(days,predicted_temperatures,'-',label='Predicteddata')plt.xlabel('Days')plt.ylabel('Temperatures')plt.legend()plt.show()总结 插值与拟合的基本原理、常用方法及其Python实现,涵盖了拉格朗日插值、牛顿插值、样条插值等插值方法,以及线性拟合、多项式拟合、指数拟合、对数拟合和幂函数拟合等拟合方法,并通过具体的代码实例展示了插值与拟合在数据平滑、图像处理、数值模拟、数据预测、数据建模、物理实验数据分析和工程设计中的实际应用。
|
|