数学建模与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=1∑n(yi−f(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.13t−0.03 拟合效果最佳。
2. 非线性拟合:lsqcurvefit
功能:求解非线性最小二乘问题,需自定义模型函数。
语法:
x = lsqcurvefit(fun, x0, xdata, ydata);
示例:血药浓度动力学模型
- 定义模型函数(保存为
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
- 拟合与结果:
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时段(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时段类似操作。
-
计算流量
- 流量为水位函数的导数。
dp1 = polyder(p1); flow1 = -polyval(dp1, t1); % 流量取负值
-
估计总用水量
- 对各时段流量积分并求和。
total_flow = trapz(t1, flow1) + trapz(t2, flow2); disp(['日总用水量:', num2str(total_flow), '立方米']);
结果:日总用水量约为1250.4立方米。
案例2:药物给药方案设计
背景:根据血药浓度数据设计给药剂量与间隔,确保浓度在安全范围内。
步骤:
- 拟合血药浓度模型
- 使用非线性拟合确定药代动力学参数 k k k 和 V V V。
- 计算给药方案
- 首次剂量 D 0 = c 2 V e − k τ D_0 = \frac{c_2 V}{e^{-k \tau}} D0=e−kτc2V,维持剂量 D = D 0 − c 1 V D = D_0 - c_1 V D=D0−c1V。
k = 0.2347; V = 15.02; tau = 4; % 给药间隔 D0 = 25 * V / exp(-k * tau); D = D0 - 10 * V;
结果:首次注射375mg,后续每次225mg,间隔4小时。
四、拟合方法对比与MATLAB实现
方法 | 适用场景 | MATLAB函数 | 核心代码示例 |
---|---|---|---|
线性最小二乘 | 多项式、线性组合模型 | polyfit | p = polyfit(x, y, 2); |
非线性最小二乘 | 指数、对数等复杂模型 | lsqcurvefit | x = lsqcurvefit(@fun, x0, tdata, ydata); |
分段拟合 | 非连续或趋势变化数据 | 多次调用polyfit | p1 = polyfit(t1, y1, 3); |
五、总结与建议
- 方法选择:根据数据分布选择线性或非线性模型,优先验证模型假设。
- 模型评估:通过残差分析、 R 2 R^2 R2(决定系数)评估拟合优度。
- MATLAB优势:
polyfit
快速实现多项式拟合,lsqcurvefit
灵活处理复杂非线性问题。
- 应用扩展:拟合技术可结合信号处理、机器学习等领域进一步优化预测精度。
通过本文的学习,读者可深入理解最小二乘法的数学原理,掌握MATLAB实现方法,并能够灵活应用于工程预测、医学分析等实际问题。