【数模修炼之旅】05 拟合模型 深度解析(教程+代码)

【数模修炼之旅】05 拟合模型 深度解析(教程+代码)

接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法,大家可以关注这个专栏,持续学习哦,对于大家的能力提高会有极大的帮助。

拟合模型介绍及应用

拟合模型是一种数学工具,用于寻找一个函数或方程式,使其能最好地表达一组数据之间的关系。在数学建模(数模)中,拟合模型可以帮助我们从实验或观测数据中抽象出关键的数学关系,进而用于预测、优化或理解复杂系统的行为。这个算法必须得会,是数模竞赛中的基础算法之一。

1.1 拟合模型的基本类型

【数模修炼之旅】05 拟合模型 深度解析(教程+代码)_第1张图片

1.2 拟合模型在数学建模中的应用

  1. 预测模型:在经济学、气象学等领域,拟合模型可以用来预测未来的趋势。例如,通过拟合历史经济数据,模型可以预测未来的经济增长速度。
  2. 系统优化:在工程领域,拟合模型可以用来优化系统设计。例如,在化工过程中,通过拟合反应速率和原料浓度的关系,可以确定最佳的反应条件。
  3. 参数估计:在生物学和化学实验中,常常通过拟合实验数据来估计生化反应的动力学参数,如速率常数、活化能等。
  4. 风险管理:在金融领域,通过拟合历史金融市场数据,可以建立模型来估计金融资产的风险和回报,用于指导投资决策。

拟合模型代码(matlab+python)

这个算法比较简单,我们就用python代码给大家讲解一下。不再单独介绍其步骤。

2.1 python

拟合数据

x = np.arange(1, 31, 1)

y = np.array([20, 23, 26, 29, 32, 35, 38, 45, 53, 62, 73, 86, 101, 118, 138, 161, 188, 220, 257, 300, 350, 409, 478, 558, 651, 760, 887, 1035, 1208, 1410])

2.1.1 多项式拟合

由泰勒公式知道:任何一个函数都可以拆分成近似于这个函数的多项式表达。
多项式拟合需要用到的函数是np.polyfit,它的使用方法为:

def polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False):
    """
    Least squares polynomial fit.
    Fit a polynomial ``p(x) = p[0] * x**deg + ... + p[deg]`` of degree `deg`
    to points `(x, y)`. Returns a vector of coefficients `p` that minimises
    the squared error.

其中需要关注的参数为3个:x、y分别为需要拟合的散点的坐标序列,deg为需要拟合的多项式的最高项数。
例如:
# coding=utf-8
import pylab
import numpy as np

if __name__ == "__main__":
  x = np.arange(1, 31, 1)
  y = np.array([20, 23, 26, 29, 32, 35, 38, 45, 53, 62, 73, 86, 101, 118, 138, 161, 188, 220, 257, 300, 350, 409, 478, 558, 651, 760, 887, 1035, 1208, 1410])

  z1 = np.polyfit(x, y, 3)              # 曲线拟合,返回值为多项式的各项系数
  p1 = np.poly1d(z1)                    # 返回值为多项式的表达式,也就是函数式子
  print(p1)
  y_pred = p1(x)                        # 根据函数的多项式表达式,求解 y
  # print(np.polyval(p1, 29))             根据多项式求解特定 x 对应的 y 值
  # print(np.polyval(z1, 29))             根据多项式求解特定 x 对应的 y 值

  plot1 = pylab.plot(x, y, '*', label='original values')
  plot2 = pylab.plot(x, y_pred, 'r', label='fit values')
  pylab.title('')
  pylab.xlabel('')
  pylab.ylabel('')
  pylab.legend(loc=3, borderaxespad=0., bbox_to_anchor=(0, 0))
  pylab.show()
  pylab.savefig('p1.png', dpi=200, bbox_inches='tight')

2.1.1 非多项式拟合

如果需要进行多项式拟合,你必须大体上知道散点的大致曲线形式,大致的函数的形式。
比如,例子中的散点看起来像是指数的函数分布,因此可以给出func的函数:
def func(x, a, b, c):
  return b * np.power(a, x) + c

只要给出具体的函数形式(可以是任意的,只要能写的出来皆可),用最小二乘的方式去逼近和拟合,即求出函数的各项系数。
此时用到的是scipy.optimize包下的curve_fit函数了:
# coding=utf-8
import pylab
import numpy as np
import sys, os
from scipy.optimize import curve_fit

def func(x, a, b, c):
  return b * np.power(a, x) + c

if __name__ == "__main__":
  x = np.arange(1, 31, 1)
  y = np.array([20, 23, 26, 29, 32, 35, 38, 45, 53, 62, 73, 86, 101, 118, 138, 161, 188, 220, 257, 300, 350, 409, 478, 558, 651, 760, 887, 1035, 1208, 1410])

  popt, pcov = curve_fit(func, x, y)                # 曲线拟合,popt为函数的参数list
  y_pred = [func(i, popt[0], popt[1], popt[2]) for i in x]    # 直接用函数和函数参数list来进行y值的计算
  print(popt)

  plot1 = pylab.plot(x, y, '*', label='original values')
  plot2 = pylab.plot(x, y_pred, 'r', label='fit values')
  pylab.title('')
  pylab.xlabel('')
  pylab.ylabel('')
  pylab.legend(loc=3, borderaxespad=0., bbox_to_anchor=(0, 0))
  pylab.show()
  pylab.savefig('p1.png', dpi=200, bbox_inches='tight')

2.2 matlab

多项式拟合步骤
(1)输入待拟合数据x,y
(2)输入函数公式进行拟合
x=0:0.1:1;
 
y=[-0.447 1.978 3.28 6.16 7.08 7.34 7.66   9.56 9.48 9.30 11.2];
 
A=polyfit(x,y,2)

指定函数拟合步骤
 (1)输入待拟合数据x,y
(2)指定函数关系式
syms t;
x=[0;0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15];
y=[1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.17;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.09;0.032;-0.015;-0.02];%指定函数形式为f(t)=acos(kt)e^(wt),进行拟合
f=fittype('a*cos(k*t)*exp(w*t)','independent','t','coefficients',{'a','k','w'});
cfun=fit(x,y,f)     %显示拟合函数
xi=0:.1:20;
yi=cfun(xi);
plot(x,y,'r*',xi,yi,'b-');

需要参加数模竞赛的同学,可以看我的这个名片,会有最新的助攻哦:(大型比赛前会对名片进行更新)

你可能感兴趣的:(数模国一o奖攻略,数模修炼之旅,数学建模,全国大学生数学建模竞赛,数学建模竞赛,高教社杯数学建模,算法)