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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
◼ 初值的选取
✓ 根据函数的形式,使用一部分数据,预估参数的值 → 人口模型的分析 ✓ 根据参数的物理意义和建模所用的专业知识,合理确定参数的范围 → 土壤含水率问题
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
由于资源和环境容量等的限制
1+

ym y0

1
e−
rx

MATLAB 实现非线性拟合 —— lsqcurvefit
◼ 计算拟合残差 / 残差平方和
✓ 拟合残差 = 拟合值 – 测量值 ✓ 残差平方和 = Σ 残差平方
◼ 执行结果:得到了局部最小值,lsqcurvefit 内部迭代结束 (收敛)
◼ 拟合的定义 / 目标 → 残差平方和最小 ◼ 局部最小值 → 残差平方和局部最小
MATLAB 实现非线性拟合 —— lsqcurvefit
◼ 调用格式 —— lsqcurvefit (least-squares curve-fitting)
✓ 最简单的格式:param = lsqcurvefit (fun, param0, xdata, ydata) ✓ 为了便于理解,将 help 里的 x / x0 使用 param / param0 替换
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 为常数
◼ options 设置示例 → 设置内部最大迭代次数为 1000 | 绘制每次内部迭代后的残差平方和
✓ options = optimoptions ('lsqcurvefit', 'MaxIterations', 1000, 'PlotFcn', @optimplotresnorm)
MATLAB 实现非线性拟合 —— lsqcurvefit
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
案例二:土壤含水率问题
◼ 设置待定参数的初值 param0 = [1, 3, 0.5, 0.5]
✓ 设定 MaxFunctionEvaluations 的值为 1000 ✓ 设定 Algorithm 为 levenberg-marquardt
✓ 设定参数的上下边界
结束语 —— 拟合问题总结
◼ 拟合问题:能转化成线性拟合问题的,绝不使用非线性拟合
人口呈指数无限增长
人口 爆炸
人口不可能无限制地增长
人口阻滞增长模型 —— Logistics 模型
◼ 由于资源和环境的阻滞作用,人口越多,人口的增长率越低
◼ 人口增长率不再是常数,而是人口数量 y 的函数 r(y) → r(y) 是 y 的减函数 ◼ 设有限的资源和环境,能够供养的最大人口数量为 ym → 人口阻滞增长模型
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) → 拟合问题 → 非线性拟合问题
✓ 哪个局部的最优解好? ✓ 局部最优解 (拟合数据) 与测量数据的“匹配度”如何?
◼ 评价指标
✓ 横向比较不同的局部最优解 → 拟合的定义是使得残差平方和最小 → 直接比较 resnorm ✓ 拟合数据与测量数据的“匹配度”
➢ 计算测量数据与拟合数据之间的标准均方根误差 (NRMSE) → 越接近 1 越好 ➢ 计算测量数据与拟合数据之间的标准均方误差 (NMSE) → 越接近 1 越好 ➢ MATLAB 实现:系统辨识工具箱里的 goodnessOfFit 函数
✓ 线性拟合
➢ 通用方法:求解线性超定方程组 → 第 14 期教学视频 ➢ 求解线性拟合问题,无需给出参数的初值,算法稳定可靠 → 全局最优解
✓ 非线性拟合
➢ MATLAB 函数:lsqcurvefit / lsqnonlin / nlinfit / fsolve → 局部最优解 ➢ 拟合问题 → 也可以转化成优化问题 → MATLAB 的优化函数求解 ➢ 求解非线性拟合问题,需要给出待定参数的初值,可能会出现迭代不收敛
案例二:土壤含水率问题
◼ 已知土壤含水率 θ 与压力水头 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
MATLAB 实现非线性拟合 —— lsqcurvefit
◼ 设定待定参数的初值 param0 = [30, 600]
◼ 虽然得到了局部最小值,但是拟合的效果非常差
寻优算法 —— 局部最优解
◼ 拟合问题:寻找参数 → 残差平方和最小
◼ 寻找你所在区域内的海拔最低点
◼ 不同的初值 → 可能得到不同的局部最优解 ◼ 不同的出发地点 → 可能找到不同的区域内最低点
MATLAB 教学视频 详解数据拟合的 MATLAB 实现 —— 非线性拟合
教学内容
◼ 拟合残差及残差平方和 ◼ 人口增长模型
✓ 人口指数增长模型 —— Malthus 模型 ✓ 人口阻滞增长模型 —— Logistics 模型
◼ MATLAB 实现非线性拟合 —— lsqcurvefit ◼ 寻优算法 —— 局部最优解 ◼ 拟合效果的评价 ◼ 土壤含水率问题的分析 ◼ 结束语 —— 拟合问题总结
◼ 待定参数初值的确定 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
待定参数初值 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 求解
◼ 输入参数解读
◼ 输出参数解读
✓ fun : 定义拟合函数 ✓ param0 : 拟合函数待定参数的初值 ✓ xdata / ydata : 已知的横 / 纵坐标数据点 ✓ lb / ub : 待定参数的下边界和上边界 ✓ options : 拟合函数的优化选项 → help
✓ param : 待定参数的求解结果 ✓ resnorm : 拟合残差的平方和 ✓ residual : 拟合残差 ✓ exitflag : 结束标记,大于 0 → 局部最优 param ✓ output : 有关拟合计算过程的信息 → help
拟合残差及残差平方和
◼ 残差:已知的测量点到拟合曲线 y = f(x) 的距离,即拟合值 (估计值) 与测量值 (观察值) 之差 ◼ 残差平方和:即残差的平方和 → 拟合值 (估计值) 与测量值 (观察值) 之差的平方和 ◼ 回顾线性拟合教学视频:拟合的定义 → 求解 y = f(x) 里的待定参数,使得残差平方和最小
wenku.baidu.com
MATLAB 实现非线性拟合 —— lsqcurvefit
◼ 高级调用格式 —— 更多输入设置 / 输出信息
✓ [param, resnorm, residual, exitflag, output] = lsqcurvefit (fun, param0, xdata, ydata, lb, ub, options)
◼ 求待定参数:α , n , θr , θs ◼ 参数的上下边界: α (0 – 5) , n (1 – 5) , θr (0 – 1) , θs (0 – 1) ◼ 参考文献:彭建平,邵爱军. 用 MATLAB 确定土壤水分特征曲线参数 [J]. 土壤 (Soils), 2007, 39 (3)
指数增长
阻滞增长
案例一:人口预测问题
◼ 已知某地区在 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
◼ 不合理的初值 → 可能导致求解失败
◼ 超出国界的出发地点 → 无法跨越的障碍
5 # 初值
O
珠 穆 朗 印玛
1 # 初值
2 # 初值

3 # 初值
4 # 初值


度峰

新川
X


X





X








选 取 要 合 理

拟合效果的评价
◼ 不同的参数初值 → 可能会得到不同的局部最优解 ◼ 引发两个基本问题
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,人口不再增长 (阻滞)
◼ 输入 / 输出参数解读
✓ fun : 定义拟合函数 y = f(x) ✓ param0 : 拟合函数待定参数的初值 ✓ xdata / ydata : 已知的横 / 纵坐标数据点 (测量数据) ✓ param : 待定参数的求解结果
◼ lsqcurvefit 结束计算
✓ 求解失败,例如,超出最大迭代次数 (默认 400) 等 ✓ 求解成功,得到局部最优的待定参数
相关文档
最新文档