当前位置:文档之家› MATLAB教学视频:详解数据拟合的MATLAB实现(非线性拟合)

MATLAB教学视频:详解数据拟合的MATLAB实现(非线性拟合)


待定参数初值 param0
MATLAB 内部求解器 计算出新的待定参数
新的待定参数 param 否 满足结束计算的条件?
是 结束计算
lsqcurvefit 内部迭代计算过程
MATLAB 实现非线性拟合 —— lsqcurvefit
◼ 使用 lsqcurvefit 实现非线性拟合的基本步骤
✓ 给定已知的数据 (x, y) 以及 x y 之间满足的函数关系 y = f(x) ✓ 确定 y = f(x) 中的待定参数 param = [r, ym] ✓ 定义拟合函数 y = f(x) : function y = curvefun (param, x) ✓ 给定参数的初值 param0 → 调用 lsqcurvefit 求解
人口呈指数无限增长
人口 爆炸
人口不可能无限制地增长
人口阻滞增长模型 —— Logistics 模型
◼ 由于资源和环境的阻滞作用,人口越多,人口的增长率越低
◼ 人口增长率不再是常数,而是人口数量 y 的函数 r(y) → r(y) 是 y 的减函数 ◼ 设有限的资源和环境,能够供养的最大人口数量为 ym → 人口阻滞增长模型
◼ 待定参数初值的确定 param0 = [0.15, 400]
✓ 当人口总数较少时,近似成指数增长,令 x = 5
y = erx y1975 = 20.3 e5r r 0.15
y0
y1970 9.7
✓ 人口数量的极限为 ym → ym > 2015 年人口数量 (330.7)
y=
ym
◼ 初值的选取
✓ 根据函数的形式,使用一部分数据,预估参数的值 → 人口模型的分析 ✓ 根据参数的物理意义和建模所用的专业知识,合理确定参数的范围 → 土壤含水率问题
指数增长
阻滞增长
案例一:人口预测问题
◼ 已知某地区在 1970 - 2015 年的人口数据 (万人) 如下,预测该地区在 2040 年前的人口数量
年份 第x 年 人口 y
1970 0 9.7
1975 5 20.3
1980 10 34.2
1985 15 55.7
1990 20 95.3
1995 25 168.5
◼ 输入参数解读
◼ 输出参数解读
✓ fun : 定义拟合函数 ✓ param0 : 拟合函数待定参数的初值 ✓ xdata / ydata : 已知的横 / 纵坐标数据点 ✓ lb / ub : 待定参数的下边界和上边界 ✓ options : 拟合函数的优化选项 → help
✓ param : 待定参数的求解结果 ✓ resnorm : 拟合残差的平方和 ✓ residual : 拟合残差 ✓ exitflag : 结束标记,大于 0 → 局部最优 param ✓ output : 有关拟合计算过程的信息 → help
✓ 线性拟合
➢ 通用方法:求解线性超定方程组 → 第 14 期教学视频 ➢ 求解线性拟合问题,无需给出参数的初值,算法稳定可靠 → 全局最优解
✓ 非线性拟合
➢ MATLAB 函数:lsqcurvefit / lsqnonlin / nlinfit / fsolve → 局部最优解 ➢ 拟合问题 → 也可以转化成优化问题 → MATLAB 的优化函数求解 ➢ 求解非线性拟合问题,需要给出待定参数的初值,可能会出现迭代不收敛
案例二:土壤含水率问题
◼ 设置待定参数的初值 param0 = [1, 3, 0.5, 0.5]
✓ 设定 MaxFunctionEvaluations 的值为 1000 ✓ 设定 Algorithm 为 levenberg-marquardt
✓ 设定参数的上下边界
结束语 —— 拟合问题总结
◼ 拟合问题:能转化成线性拟合问题的,绝不使用非线性拟合
◼ 输入 / 输出参数解读
✓ fun : 定义拟合函数 y = f(x) ✓ param0 : 拟合函数待定参数的初值 ✓ xdata / ydata : 已知的横 / 纵坐标数据点 (测量数据) ✓ param : 待定参数的求解结果
◼ lsqcurvefit 结束计算
✓ 求解失败,例如,超出最大迭代次数 (默认 400) 等 ✓ 求解成功,得到局部最优的待定参数
dy

dx
=
r( y) y
=
r 1−

y ym

y

y(0)
=
y0
y=
ym
1+

ym y0

1
e−
rx

◼ 时间 x 越大 → 人口数量 y 越大 | x → Inf , y → ym ◼ 当 y 很小时,r(y) → r (常数),人口呈指数增长 ◼ 当 y 接近 ym 时,r(y) → 0,人口不再增长 (阻滞)
r = y(x + x) − y(x) y(x + x) − y(x) = ry(x)
y ( x)x
x
◼ 当 Δx → 0 时,可得微分方程 → 起始年份的人口数量为 y0 → 微分方程的解析解
dy
=
ry
dx
y = y0erx
y(0) = y0
由于资源和环境容量等的限制
案例二:土壤含水率问题
◼ 已知土壤含水率 θ 与压力水头 h 之间的函数关系,以及 (h, θ) 的测量数据

= r
+
s −r
1 +
h
n
1− 1 n

=
r
+
s
−r
1− 1
An
水头 h 含水率 θ 水头 h 含水率 θ
0.00 0.476 159.12 0.312
27.2 0.434 197.20 0.287
✓ 哪个局部的最优解好? ✓ 局部最优解 (拟合数据) 与测量数据的“匹配度”如何?
◼ 评价指标
✓ 横向比较不同的局部最优解 → 拟合的定义是使得残差平方和最小 → 直接比较 resnorm ✓ 拟合数据与测量数据的“匹配度”
➢ 计算测量数据与拟合数据之间的标准均方根误差 (NRMSE) → 越接近 1 越好 ➢ 计算测量数据与拟合数据之间的标准均方误差 (NMSE) → 越接近 1 越好 ➢ MATLAB 实现:系统辨识工具箱里的 goodnessOfFit 函数
2000 30 217.8
2005 35 257.6
2010 40 296.1
2015 45 330.7
◼ 根据 Logistics 人口模型 → 待定参数:r & ym
y=
ym
1+

ym y0

1
e−
rx

◼ 方程个数 (10) 大于未知数个数 (2) → 拟合问题 → 非线性拟合问题
◼ 求待定参数:α , n , θr , θs ◼ 参数的上下边界: α (0 – 5) , n (1 – 5) , θr (0 – 1) , θs (0 – 1) ◼ 参考文献:彭建平,邵爱军. 用 MATLAB 确定土壤水分特征曲线参数 [J]. 土壤 (Soils), 2007, 39 (3)
1+

ym y0

1
e−
rx

MATLAB 实现非线性拟合 —— lsqcurvefit
◼ 计算拟合残差 / 残差平方和
✓ 拟合残差 = 拟合值 – 测量值 ✓ 残差平方和 = Σ 残差平方
◼ 执行结果:得到了局部最小值,lsqcurvefit 内部迭代结束 (收敛)
◼ 拟合的定义 / 目标 → 残差平方和最小 ◼ 局部最小值 → 残差平方和局部最小
y
*
y = f (x)
f (xk )
yk
*
*
**
*
residualk = f (xk ) − yk
n
n
resnorm = f (xk ) − yk 2 = residualk2
k =1
k =1
xk
x
人口指数增长模型 —— Malthus 模型
◼ Malthus 人口模型:假设单位时间内的人口增长率 r 为常数
MATLAB 教学视频 详解数据拟合的 MATLAB 实口增长模型
✓ 人口指数增长模型 —— Malthus 模型 ✓ 人口阻滞增长模型 —— Logistics 模型
◼ MATLAB 实现非线性拟合 —— lsqcurvefit ◼ 寻优算法 —— 局部最优解 ◼ 拟合效果的评价 ◼ 土壤含水率问题的分析 ◼ 结束语 —— 拟合问题总结
MATLAB 实现非线性拟合 —— lsqcurvefit
◼ 设定待定参数的初值 param0 = [30, 600]
◼ 虽然得到了局部最小值,但是拟合的效果非常差
寻优算法 —— 局部最优解
◼ 拟合问题:寻找参数 → 残差平方和最小
◼ 寻找你所在区域内的海拔最低点
◼ 不同的初值 → 可能得到不同的局部最优解 ◼ 不同的出发地点 → 可能找到不同的区域内最低点
53.04 0.406 251.60 0.271
62.56 0.401 262.48 0.261
69.36 0.392 286.96 0.253
81.60 0.382 359.04 0.252
95.20 0.365 452.88 0.236
108.80 0.351 503.20 0.234
126.48 0.335
◼ options 设置示例 → 设置内部最大迭代次数为 1000 | 绘制每次内部迭代后的残差平方和
✓ options = optimoptions ('lsqcurvefit', 'MaxIterations', 1000, 'PlotFcn', @optimplotresnorm)
相关主题