当前位置: 首页 > article >正文

数学建模与MATLAB实现:数据拟合全解析


引言

数据拟合是数学建模与实验分析中的核心任务,旨在通过数学模型逼近实际观测数据,揭示变量间的潜在规律。本文基于最小二乘法的理论框架,结合MATLAB代码实战,系统讲解线性拟合非线性拟合的实现方法,并通过电阻温度预测、血药浓度分析等案例,帮助读者掌握从数据预处理到模型优化的全流程技能。


一、拟合基础理论

1. 拟合与插值的区别
  • 插值:要求曲线通过所有数据点,适合精确重建已知数据。
  • 拟合:不要求曲线经过所有点,旨在反映整体趋势,适合噪声数据或预测。
2. 最小二乘法原理

目标:最小化观测数据与模型预测值的残差平方和。
数学形式
J ( a 1 , a 2 , … , a m ) = ∑ i = 1 n ( y i − f ( x i ) ) 2 J(a_1, a_2, \dots, a_m) = \sum_{i=1}^n \left( y_i - f(x_i) \right)^2 J(a1,a2,,am)=i=1n(yif(xi))2
其中 f ( x ) = a 1 r 1 ( x ) + a 2 r 2 ( x ) + ⋯ + a m r m ( x ) f(x) = a_1 r_1(x) + a_2 r_2(x) + \dots + a_m r_m(x) f(x)=a1r1(x)+a2r2(x)++amrm(x) 为拟合函数。

线性最小二乘法
f ( x ) f(x) f(x) 是待定系数的线性组合时,可通过解超定方程组 R a = y Ra = y Ra=y 的最小二乘解实现:
a = ( R T R ) − 1 R T y a = (R^T R)^{-1} R^T y a=(RTR)1RTy


二、MATLAB拟合函数详解

1. 线性拟合:polyfit

功能:多项式拟合,返回多项式系数。
语法

p = polyfit(x, y, m);   % m为多项式次数
y_fit = polyval(p, x);  % 计算拟合值

示例:电阻-温度关系拟合

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];  
p = polyfit(x, y, 2);   % 二次多项式拟合  
y_fit = polyval(p, x);  
plot(x, y, 'ko', x, y_fit, 'r-');  
xlabel('温度'); ylabel('电阻');  

结果:二次多项式 R ( t ) = − 9.81 t 2 + 20.13 t − 0.03 R(t) = -9.81t^2 + 20.13t - 0.03 R(t)=9.81t2+20.13t0.03 拟合效果最佳。

2. 非线性拟合:lsqcurvefit

功能:求解非线性最小二乘问题,需自定义模型函数。
语法

x = lsqcurvefit(fun, x0, xdata, ydata);  

示例:血药浓度动力学模型

  1. 定义模型函数(保存为 curvefun1.m):
function f = curvefun1(x, tdata)  
    f = x(1) + x(2) * exp(-0.02 * x(3) * tdata);  % x(1)=a, x(2)=b, x(3)=k  
end  
  1. 拟合与结果
tdata = 100:100:1000;  
cdata = 1e-3 * [4.54, 4.99, 5.35, 5.65, 5.90, 6.10, 6.26, 6.39, 6.50, 6.59];  
x0 = [0.2, 0.05, 0.05];  
x = lsqcurvefit(@curvefun1, x0, tdata, cdata);  
disp(['a=', num2str(x(1)), ', b=', num2str(x(2)), ', k=', num2str(x(3))]);  

输出 a = 0.0063 , b = − 0.0034 , k = 0.2542 a=0.0063, b=-0.0034, k=0.2542 a=0.0063,b=0.0034,k=0.2542,拟合曲线符合一室药代动力学模型。


三、实战案例解析

案例1:水塔流量估计

目标:根据水位记录数据,估计水塔流量及日总用水量。

步骤

  1. 分段拟合水位-时间曲线

    • 第1时段(08.97小时)和第2时段(10.9520.84小时)用3次多项式拟合。
    % 第1时段拟合  
    t1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];  
    h1 = [968, 948, 931, 913, 898, 881, 869, 850, 834, 822];  
    p1 = polyfit(t1, h1, 3);  
    
    • 第2时段类似操作。
  2. 计算流量

    • 流量为水位函数的导数。
    dp1 = polyder(p1);  
    flow1 = -polyval(dp1, t1);  % 流量取负值  
    
  3. 估计总用水量

    • 对各时段流量积分并求和。
    total_flow = trapz(t1, flow1) + trapz(t2, flow2);  
    disp(['日总用水量:', num2str(total_flow), '立方米']);  
    

结果:日总用水量约为1250.4立方米。

案例2:药物给药方案设计

背景:根据血药浓度数据设计给药剂量与间隔,确保浓度在安全范围内。
步骤

  1. 拟合血药浓度模型
    • 使用非线性拟合确定药代动力学参数 k k k V V V
  2. 计算给药方案
    • 首次剂量 D 0 = c 2 V e − k τ D_0 = \frac{c_2 V}{e^{-k \tau}} D0=ekτc2V,维持剂量 D = D 0 − c 1 V D = D_0 - c_1 V D=D0c1V
    k = 0.2347;  
    V = 15.02;  
    tau = 4;  % 给药间隔  
    D0 = 25 * V / exp(-k * tau);  
    D = D0 - 10 * V;  
    

结果:首次注射375mg,后续每次225mg,间隔4小时。


四、拟合方法对比与MATLAB实现

方法适用场景MATLAB函数核心代码示例
线性最小二乘多项式、线性组合模型polyfitp = polyfit(x, y, 2);
非线性最小二乘指数、对数等复杂模型lsqcurvefitx = lsqcurvefit(@fun, x0, tdata, ydata);
分段拟合非连续或趋势变化数据多次调用polyfitp1 = polyfit(t1, y1, 3);

五、总结与建议

  1. 方法选择:根据数据分布选择线性或非线性模型,优先验证模型假设。
  2. 模型评估:通过残差分析、 R 2 R^2 R2(决定系数)评估拟合优度。
  3. MATLAB优势
    • polyfit 快速实现多项式拟合,lsqcurvefit 灵活处理复杂非线性问题。
  4. 应用扩展:拟合技术可结合信号处理、机器学习等领域进一步优化预测精度。

通过本文的学习,读者可深入理解最小二乘法的数学原理,掌握MATLAB实现方法,并能够灵活应用于工程预测、医学分析等实际问题。


http://www.kler.cn/a/548569.html

相关文章:

  • 华为IPD简介
  • 【AIDevops】Deepseek驱动无界面自动化运维与分布式脚本系统,初探运维革命之路
  • C语言中的强制类型转换:原理、用法及注意事项
  • 从源代码编译构建vLLM并解决常见编译问题
  • LVS 负载均衡集群(NAT模式)
  • Oracle RHEL AS 4 安装 JAVA 1.4.2
  • 双轴伺服电机驱动控制器AGV、AMR专用双伺服电机驱动控制器解决方案
  • elasticsearch8 linux版以服务的方式启动
  • 开发板适配之I2C-RTC
  • 大疆无人机指令飞行JWT认证
  • HTTP 参数污染(HPP)详解
  • c++中什么时候应该使用final关键字?
  • 【在idea中配置两个不同端口,同时运行两个相同的主程序springboot】
  • 5G与物联网的协同发展:打造智能城市的未来
  • nginx的十一个阶段详解
  • unity学习40:导入模型的 Animations文件夹内容,动画属性和修改动画文件
  • Mongodb数据管理
  • Apollo 9.0 速度动态规划决策算法 – path time heuristic optimizer
  • python旅游推荐系统+爬虫+可视化(协同过滤算法)
  • 【Leetcode 每日一题】1552. 两球之间的磁力