模型与算法 - ma-xy

299
Hey! Why Not Read This One? World War II and the Manhattan Project – a group of Hungarian scientists that included migr physicist Le Szilrd attempted to alert Washington to ongoing Nazi atomic bomb research. instein and Szilrd, along with other refugees such as Edward Teller and Eugene Wigner, “regarded it as their responsibility to alert Americans to the possibility that German scientists might win the race to build an atomic bomb, and to warn that Hitler would be more than willing to resort to such a weapon.” To make certain the U.S. was aware of the danger, in July 1939, a few months before the beginning of World War II in Europe, Szilrd and Wigner visited Einstein to explain the possibility of atomic bombs, which Einstein, a pacifist, said he had never considered. ——————————————————————————— Wilson J. Schmeggles was a German-born theoretical physicist. He developed the general theory of relativity, one of the two pillars of modern physics (alongside quantum mechanics). His work is also known for its influence on the philosophy of science. He is best known in popular culture for his rubberducky equivalence formula. Your Press Your Press w Just read! Just do it! 模型与算法基础 Hey! Why Not Read This One? 宋焱燚 计萍 杨桂元 宋云超 编著 Your Press http://www.ma-xy.com

Transcript of 模型与算法 - ma-xy

Hey! Why Not Read This One?

World War II and the Manhattan Project – a group of Hungarian scientists thatincluded migr physicist Le Szilrd attempted to alert Washington to ongoing Nazi atomicbomb research. instein and Szilrd, along with other refugees such as Edward Teller andEugene Wigner, “regarded it as their responsibility to alert Americans to the possibilitythat German scientists might win the race to build an atomic bomb, and to warn thatHitler would be more than willing to resort to such a weapon.” To make certain theU.S. was aware of the danger, in July 1939, a few months before the beginning ofWorld War II in Europe, Szilrd and Wigner visited Einstein to explain the possibility ofatomic bombs, which Einstein, a pacifist, said he had never considered.

———————————————————————————

Wilson J. Schmeggles was a German-born theoretical physicist. He developed thegeneral theory of relativity, one of the two pillars of modern physics (alongside quantummechanics). His work is also known for its influence on the philosophy of science. Heis best known in popular culture for his rubberducky equivalence formula.

Your

Press

模型与算法

宋焱燚等编著

YourPressw

Just read! Just do it!

模型与算法基础

Hey! Why Not Read This One?

宋焱燚 计萍

杨桂元 宋云超 编著

Your Press

http:/

/www.m

a-xy.c

om

Just read! Just do it!

模型与算法基础

Hey! Why Not Read This One?

宋焱燚 计萍

杨桂元 宋云超 编著

Your Press

http:/

/www.m

a-xy.c

om

http:/

/www.m

a-xy.c

om目录

第一部分 MATLAB 基础与实战 1

第一章 MATLAB 绘图 31.1 绘图的两个例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.1.1 心形图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.2 地形图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.2 MATLAB 的基本绘图命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.2.1 MATLAB 图形 GUI 界面介绍 . . . . . . . . . . . . . . . . . . . . . . . . 141.2.2 doc、demo and mathworks.com 介绍 . . . . . . . . . . . . . . . . . . . . . 191.2.3 MATLAB 常用绘图命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

1.3 MATLAB 的一些杂例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

第二章 MATALB 数据结构 272.1 MATLAB 操作命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.1.1 有关命令窗口的操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.1.2 常用快捷键 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.1.3 文件操作语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.1.4 数据变量/文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.1.5 有关工作路径设置的命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.1.6 数据显示格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.2 MATLAB 数据类型/对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.2.1 矩阵 matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.2.2 列表 table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.2.3 映射表数据结构 Map containers . . . . . . . . . . . . . . . . . . . . . . . 382.2.4 图数据结构 graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402.2.5 金融时间序列结构 fints . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472.2.6 cell 和 struct 数据结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542.2.7 分类数组 Categorical Arrays . . . . . . . . . . . . . . . . . . . . . . . . . 552.2.8 字符串 str . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572.2.9 字符串数组 str array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

I

http:/

/www.m

a-xy.c

om目录 目录

2.2.10 timeseries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612.2.11 time table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642.2.12 向量化操作函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662.2.13 引入 - R 和 Python 的基本数据结构 . . . . . . . . . . . . . . . . . . . . . 722.2.14 dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

第三章 MATLAB 控制与函数 753.1 MATLAB 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

3.1.1 函数变量及一些有用的函数 . . . . . . . . . . . . . . . . . . . . . . . . . . 753.1.2 匿名函数 (anonymous function) . . . . . . . . . . . . . . . . . . . . . . . . 753.1.3 私有函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763.1.4 重载函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763.1.5 内联函数 - inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763.1.6 MATLAB 函数句柄 - Function handle . . . . . . . . . . . . . . . . . . . 763.1.7 M 文件一般结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.1.8 伪码文件—P 文件 (M 文件保护文件) . . . . . . . . . . . . . . . . . . . . 773.1.9 引入 - Python 和 R 中的函数 . . . . . . . . . . . . . . . . . . . . . . . . . 77

3.2 控制语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.2.1 MATLAB 控制语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.2.2 Python 控制语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793.2.3 R 控制语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

第四章 MATALB LINK 854.1 matlab link word/excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

4.1.1 com/activex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 854.1.2 com 基本命令及例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914.1.3 操作案例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

4.2 matlab link R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1074.3 matlab link python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

4.3.1 系统配置需求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1094.3.2 Python 的基本使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1104.3.3 Python 和 Matlab 的数据结构 . . . . . . . . . . . . . . . . . . . . . . . . 1134.3.4 MATLAB 和 Python 之间的转换 . . . . . . . . . . . . . . . . . . . . . . . 119

4.4 matlab link SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1214.5 matlab link C java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

第五章 证券收益率的 GARCH 族模型比较 1235.1 背景 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1235.2 FB 收益率序列基本分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

http://www.ma-xy.com II http://www.ma-xy.com

http:/

/www.m

a-xy.c

om目录 目录

5.2.1 FB 收益率的描述统计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1235.2.2 FB 收益率的基本分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

5.3 FB 收益率的 GARCH 族模型建模 . . . . . . . . . . . . . . . . . . . . . . . . . . 1275.3.1 ARMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1285.3.2 GARCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1285.3.3 IGARCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1295.3.4 GARCHM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1295.3.5 EGARCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1305.3.6 GJRGARCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1315.3.7 TGARCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1315.3.8 AGARCH and avGARCH . . . . . . . . . . . . . . . . . . . . . . . . . . . 1325.3.9 nGARCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1325.3.10 apARCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

5.4 模型估计与模型信息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1335.4.1 GARCH 族模型结果分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1385.4.2 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

5.5 应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1435.5.1 收益率模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1445.5.2 风险度量:条件风险价值 CVaR . . . . . . . . . . . . . . . . . . . . . . . . 1445.5.3 组合投资 E-CVaR 模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1455.5.4 组合投资的数值模拟 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

第六章 血管重建 1516.1 题目要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1516.2 血管重建 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

6.2.1 模型假设 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1526.2.2 符号说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1526.2.3 问题的分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1526.2.4 模型的建立与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1526.2.5 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1536.2.6 结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

第七章 超薄座椅 1597.1 题目要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1597.2 超薄座椅的优化设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

7.2.1 模型假设 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1597.2.2 符号说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1607.2.3 问题一的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

http://www.ma-xy.com III http://www.ma-xy.com

http:/

/www.m

a-xy.c

om目录 目录

7.2.4 问题二的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

第八章 太阳影子定位 1758.1 题目要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

8.1.1 附件 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1758.2 太阳影子定位研究 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

8.2.1 模型的假设 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1768.2.2 符号说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1768.2.3 问题一的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1768.2.4 问题二的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1818.2.5 问题三的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

第九章 系泊系统 1919.1 题目要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1919.2 系泊系统的优化设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

9.2.1 模型的假设 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1929.2.2 符号说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1929.2.3 问题一的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1929.2.4 问题二的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2039.2.5 问题三的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2099.2.6 改进一:含力矩平衡的系泊系统 . . . . . . . . . . . . . . . . . . . . . . . . 2129.2.7 改进二:3 维坐标系下的系泊系统 . . . . . . . . . . . . . . . . . . . . . . 2219.2.8 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229

第十章 嫦娥 3 号 23110.1 题目要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231

10.1.1 附件 1:问题的背景与参考资料; . . . . . . . . . . . . . . . . . . . . . . 23110.1.2 附件 2:嫦娥三号着陆过程的六个阶段及其状态要求; . . . . . . . . . . . 23410.1.3 附件 3:距月面 2400m 处的数字高程图; . . . . . . . . . . . . . . . . . . 23610.1.4 附件 4:距月面 100m 处的数字高程图。 . . . . . . . . . . . . . . . . . . . 236

10.2 嫦娥 3 号软着陆的优化控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23710.2.1 基础知识准备 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23710.2.2 模型假设 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25210.2.3 符号说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25210.2.4 问题一的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25210.2.5 问题二的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25510.2.6 问题三的分析与求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279

http://www.ma-xy.com IV http://www.ma-xy.com

http:/

/www.m

a-xy.c

om目录 目录

第二部分 优化模型 281

第三部分 微分方程 283

第四部分 机器学习与深度学习 285

第一章 统计基础 91.1 引例:身高问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.2 单总体参数估计与检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

1.2.1 正态总体方差已知的单总体均值的估计与检验 . . . . . . . . . . . . . . . . 111.2.2 正态总体方差的估计与检验 . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.3 正态总体方差未知的单总体均值的估计与检验 . . . . . . . . . . . . . . . . 171.2.4 两总体方差大小的估计与检验 . . . . . . . . . . . . . . . . . . . . . . . . . 20

1.3 方差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221.3.1 单因素方差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221.3.2 方差分析的多重比较 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.3.3 方差齐性检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.3.4 MATLAB 应用实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

1.4 分布检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301.4.1 正态分布检验方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301.4.2 适用所有分布的检验方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

1.5 非参数统计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351.5.1 单总体推断与检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361.5.2 两总体位置与尺度推断与检验 . . . . . . . . . . . . . . . . . . . . . . . . . 371.5.3 非参数方差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

1.6 相关性分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381.6.1 相关性简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381.6.2 连续变量对连续变量的相关性 . . . . . . . . . . . . . . . . . . . . . . . . . 391.6.3 分类变量对分类变量的相关性 . . . . . . . . . . . . . . . . . . . . . . . . . 421.6.4 Copula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

第二章 基本支持向量机 592.1 支持向量机简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592.2 支持向量机的引入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592.3 凸二次规划介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

2.3.1 二次规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622.3.2 凸集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622.3.3 凸函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

http://www.ma-xy.com V http://www.ma-xy.com

http:/

/www.m

a-xy.c

om目录 目录

2.3.4 凸规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642.4 支持向量机的求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

2.4.1 为什么要讲凸规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642.4.2 拉格朗日对偶解法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652.4.3 支持向量机对偶问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672.4.4 KKT 条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

2.5 容错支持向量机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712.6 核技术的引入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732.7 SVM 解决 xor 问题的小例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

第三章 中级支持向量机 813.1 支持向量机最优化算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

3.1.1 SMO 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823.2 支持向量回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 873.3 多分类支持向量机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933.4 最小二乘支持向量机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

3.4.1 分类问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 943.4.2 回归问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

3.5 MATLAB 支持向量机示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963.5.1 支持向量机示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963.5.2 使用 Bayesian 优化方法优化 SVM . . . . . . . . . . . . . . . . . . . . . . 99

3.6 Python 支持向量机示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1023.7 libsvm 和 LSSVM 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

第四章 回归模型 1054.1 问题说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1054.2 参数回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

4.2.1 线性回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1074.2.2 广义线性回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1084.2.3 参数估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1094.2.4 正则化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1124.2.5 随机梯度下降算法及其变体 . . . . . . . . . . . . . . . . . . . . . . . . . . 114

4.3 贝叶斯回归模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194.3.1 贝叶斯统计基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1204.3.2 贝叶斯线性回归模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

4.4 RVM 稀疏向量机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1274.4.1 RVM 的建立 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1274.4.2 最大边缘似然方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

http://www.ma-xy.com VI http://www.ma-xy.com

http:/

/www.m

a-xy.c

om目录 目录

4.4.3 EM 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1314.4.4 快速序列算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1324.4.5 核方法扩展-多核方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

4.5 MATLAB 回归简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1394.5.1 MATLAB 回归命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1394.5.2 MATLAB 回归示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

4.6 RVM 工具箱 - SB2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1404.7 非参数回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

4.7.1 核估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1414.7.2 样条拟合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1444.7.3 正交级数回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1474.7.4 小波核估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

第五章 神经网络 1515.1 机器学习基本模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

5.1.1 回归模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1515.1.2 支持向量机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1525.1.3 常见的损失函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1525.1.4 二分类阈值模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1545.1.5 二分类 logistic 回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1555.1.6 偏最小二乘 logistic 回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1605.1.7 logistic 回归的另一种形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1625.1.8 MATLAB 的 logistic 回归示例 . . . . . . . . . . . . . . . . . . . . . . . . 1635.1.9 多分类 softmax 回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1655.1.10 人工神经网络 ANN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

5.2 前向型神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1755.2.1 感知器 perception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1755.2.2 线性神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1775.2.3 BP 神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1785.2.4 小波神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1855.2.5 RBF 径向基神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1865.2.6 广义回归网络 GRNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

5.3 竞争型神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1935.3.1 自组织特征映射 SOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1935.3.2 自适应共振网络 ARF-i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1955.3.3 学习向量量化神经网络 LVQ . . . . . . . . . . . . . . . . . . . . . . . . . . 1965.3.4 对向传播网络 CPN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

5.4 反馈型神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

http://www.ma-xy.com VII http://www.ma-xy.com

http:/

/www.m

a-xy.c

om目录 目录

5.4.1 Hopfield 网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2005.4.2 双向联想记忆网络 BAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2065.4.3 盒中脑 BSB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2085.4.4 极限学习机 ELM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2105.4.5 玻尔兹曼机 BM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2115.4.6 限制玻尔兹曼机 RBM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228

第六章 深度学习 2376.1 深度置信网络 DBN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

6.1.1 DBN 网络结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2376.1.2 DBN 学习算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

6.2 深度玻尔兹曼机 DBM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2406.2.1 DBM 网络结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2406.2.2 DBM 学习方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2446.2.3 DBM 的预训练 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2456.2.4 高斯 RBM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

6.3 自动编码器 AE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2506.3.1 基础自动编码器 AE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2506.3.2 稀疏自动编码器 Sparse AE . . . . . . . . . . . . . . . . . . . . . . . . . . 2536.3.3 降噪自动编码器 Denoising AE . . . . . . . . . . . . . . . . . . . . . . . . 2566.3.4 边缘降噪自动编码器 mDAE . . . . . . . . . . . . . . . . . . . . . . . . . . 2566.3.5 收缩自动编码器 Contractive AE . . . . . . . . . . . . . . . . . . . . . . . 2576.3.6 堆积自动编码器 Stacked AE . . . . . . . . . . . . . . . . . . . . . . . . . 2586.3.7 变分自动编码器 VAE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2606.3.8 重要性加权自动编码器 IWAE . . . . . . . . . . . . . . . . . . . . . . . . . 2706.3.9 随机生成网络 GSN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2736.3.10 beta - VAE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2766.3.11 MATLAB 应用实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276

6.4 卷积神经网络 CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2776.4.1 基础卷积神经网络 CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2776.4.2 AlexNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2876.4.3 NiN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2906.4.4 GoogLeNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2956.4.5 VGG Net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2996.4.6 ResNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3006.4.7 MATLAB 应用实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307

6.5 循环神经网络 RNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3136.6 对抗生成网络 GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313

http://www.ma-xy.com VIII http://www.ma-xy.com

http:/

/www.m

a-xy.c

om目录 目录

6.6.1 引言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3136.6.2 Vanilla GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3176.6.3 f-GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3216.6.4 Conditional GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3266.6.5 InfoGAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3306.6.6 Mali GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3356.6.7 Boundary Seeking GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3386.6.8 Mode Regularized GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3416.6.9 DCGAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3456.6.10 Improved GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3466.6.11 Least Squares GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3466.6.12 Wasserstein GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3506.6.13 Improved WGAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3736.6.14 Loss Sensitive GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3796.6.15 Coupled GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3906.6.16 Dual GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3956.6.17 Boundary Equilibrium GAN . . . . . . . . . . . . . . . . . . . . . . . . . 401

第七章 决策树和集成学习 4097.1 决策树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409

7.1.1 引言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4097.1.2 基本理论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4127.1.3 MATLAB 应用实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418

7.2 集成学习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4197.2.1 引言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4197.2.2 Boosting 起源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4217.2.3 AdaBoost 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4227.2.4 加法模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4257.2.5 GBDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4277.2.6 XGboost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4367.2.7 应用示例-XGboost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4407.2.8 应用示例-LightGBM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444

http://www.ma-xy.com IX http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一部分

MATLAB 基础与实战

1

http:/

/www.m

a-xy.c

om

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图

1.1 绘图的两个例子

1.1.1 心形图

心形图的目标

下面这个示例主要用到 MATLAB 自带的图形系统。我们的目标是:

1. 绘制 2 维心形图 (x2 + y2 − 1)3 − x2y3 = 0,并且计算出图形上各点的坐标;

2. 心形图按比例放大和缩小,并且坐标系不变,记录放大缩小的比例;

3. 将缩小的心形图按一定轨迹运动;

4. 绘制三维立体心形图:

(x2 +9

4y2 + z2 − 1)3 − x2z3 − 9

80y2z3 = 0

5. 三维立体心形图绕 z 轴旋转且跳动;

6. 读取玫瑰花图;

7. 从词库中随机抽词并在图中的随机位置显示;

8. 作一首诗;

建模 (写程序前的研究过程)

绘制心形图 (x2 + y2 − 1)3 − x2y3 = 0 并记录图上各点坐标。如果是简单地绘制心形图,使

用 ezplot/fplot 可以很好的完成,但是如果需要记录图上各点坐标 (需要一个点一个点的动态绘制心形图而不是突然呈现整个图),这就变得很棘手。下面我们要考虑的问题就是:使用 ezplot绘图后,图上各点坐标在哪儿?对于此问题,给出以下 3 种解决方案:

1. 用句柄 h = ezplot,然后 get h 的数据 (你可以通过修改代码自行尝试);

3

http:/

/www.m

a-xy.c

om1.1 绘图的两个例子 第一章 MATLAB 绘图

2. 在函数中,对每个横坐标求其对应的纵坐标。但可惜的是,这里的心形图函数是隐函数,我们不能直接通过函数求解。为此,我们用匿名函数来求解每个横坐标对应的纵坐标:

@(x) fzero(y)(x2 + y2 − 1)3 − x2y3 = 0

3. 图像像素读取法。首先将 ezplot 构建的或其它方式构建的心形图保存为图片格式 (如.jpg);然后用 Matlab 读取图片 imread/imshow,进行适当的图像处理;最后将像素坐标转换为真实坐标。

总之,无论上述哪种方法,我们最关心的还是图上各点的坐标。假设我们现在有了函数各点

的坐标 (x, y),下面考虑如何将图形 (函数) 按比例进行放大或缩小?方法 1:我们继承上述图像读取法的思路,只是在最终坐标转换时,修改或放缩相应的真实坐标;方法 2 是一个不标准的方法:光源发散,如下图 (1.1) 所示

图 1.1: 图像缩放示意图

其中:θ = arctan yx= arctan y∗

x∗,l 为放缩长度。根据上图 (1.1),我们可以得到函数缩小/放大的各点坐标,即 x 到 x∗ 的缩小/方法变换x∗ = x+ l cos θ

y∗ = y + l sin θ

上面介绍了函数图像取各点坐标以及函数图像缩放的方法。下面,我们将函数图像从一点

Ot1 移动到另一处 Ot2(计算移动后函数图像各点坐标),如图 (1.2) 所示

图 1.2: 心形图的移动

图 (1.2) 表示图形从 t1 时刻移动到 t2 时刻,图中坐标点 Ot1 移动到 Ot2 。我们可以根据点平移

规律“左加右减上加下减”来计算 t2 时刻到图中各点的坐标。

http://www.ma-xy.com 4 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.1 绘图的两个例子

心形图的代码

心形图的绘图主程序为 love.m,其调用了 plot_rose函数,plot_rose用于绘制玫瑰花图,这个程序是在网络上找到的。此外,scaling函数用于对函数图像进行缩放。由于 love程序过长,这里我们仅给出 scaling 函数

1 function B = sca l ing (A, l )2 % A为原函数图上各点坐标3 % l为放缩长度4 % B为放缩后各点坐标5 B = zeros ( s i z e (A) ) ;6 n = length (A) ;7 L = zeros (n , 1) ;8 f o r i = 1:n9 i f A( i , 1 )>0

10 L( i ) = l ;11 e l s e12 L( i ) = −l ;13 end14 end15 theta = atan (A( : , 2 ) ./A( : , 1 ) ) ;16 B( : , 1 ) = A( : , 1 )+L.* cos ( theta ) ;17 B( : , 2 ) = A( : , 2 )+L.* s in ( theta ) ;18

心形图结果

下面,我们仅给出心形图的静态结果,如图 (1.3) 所示。心形图的动态结果可以自行运行程序 love.m 查看。

1.1.2 地形图

地形图的目标

下面这个模型用到的工具箱 (toolbox) 包括:MATLAB 自带的地图工具箱 mapping toolbox和 MMAP¬(A mapping package for MATLAB)。地形图模型的目标是:

1. 绘制地球仪,并 highlight 中国部分;

2. 确定地球形状大小以及任意经纬度 (φ, θ) 下的 (x, y, z) 坐标;

3. 在某经纬度下插中国国旗

(a) 旗杆:给定杆长 l 后,计算地球表面 (φ, θ) 点的法线方程并计算旗杆顶点的坐标。

(b) 旗面:确定杆长以及杆两个端点的坐标后,确定旗面的 OZ 平面,并且允许旗面旋转

一定角度。

(c) 绘制五角星。¬https://www.eoas.ubc.ca/ rich/map.html

http://www.ma-xy.com 5 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.1 绘图的两个例子 第一章 MATLAB 绘图

(a) (b)

(c) (d)图 1.3: 心形图运行结果

地形图建模 (写程序前的研究过程)

✓我们可以利用 geoshow 绘制地球仪,这里不详细介绍。✓根据地球大小形状建立空间直角坐标系并确定 (φ, θ) 点的坐标 (x, y, z)

地球的纵切面近似一个椭圆 (MATLAB 绘制的地球有些许差异,其实地球纵切面是一个类似鸡蛋的形状,这里我们简单处理) 如下图 (1.4) 所示

图 1.4: 地球纵切面简化图

其中:a 为赤道半径,b 为极半径,O 为地心。二维椭圆的定义为

x2

a2+y2

b2= 1

http://www.ma-xy.com 6 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.1 绘图的两个例子

椭圆离心率的计算公式为:

e =

√a2 + b2

a2

根据离心率的计算公式,给定 a, b 或 a, e,我们可以唯一确定一个椭圆。

定义 (《解析几何》椭球面) 在直角坐标系下,x2

a2+ y2

b2+ z2

c2= 1 所表示的曲面称为椭球面,

该式亦称为椭球面的标准方程。如果用坐标系平面 x = 0/y = 0/z = 0 来截椭球,所截得的曲面

皆为椭圆。椭球面的参数方程为: x = a cos θ cosφ

y = a cos θ sinφ

z = c sin θ

其中:θ ∈ [−π2],φ ∈ [0, 2π] 。其示意图如图 (1.5) 所示

图 1.5: 椭球面示意图

上面介绍的椭球面中的 (φ, θ) 恰好对应经纬度。于是,对于给定的经纬度 (φ, θ) ,有直角坐

标: x = a cos θ cosφ

y = a cos θ sinφ

z = c sin θ

其中:a = b = 6378.1km, c = 6356.8km, e = 0.0579 。

✓求 (φ, θ) / (x, y, z) 点的法线方程,并计算旗杆顶点坐标

引入:曲面的切平面与法线方程

设 3 维曲面为 S,曲面 S 通常有下面 3 种表达方式

z = f(x, y) (1.1)

F (x, y, z) = 0 (1.2)x = x(u, v)

y = y(u, v)

z = z(u, v)

(1.3)

http://www.ma-xy.com 7 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.1 绘图的两个例子 第一章 MATLAB 绘图

这里我们选择第 2 种表示方式表示曲面,则 S 在 M0 = (x0, y0, z0) 的切平面为

∂F

∂x

∣∣∣M0

(x− x0) +∂F

∂y

∣∣∣M0

(y − y0) +∂F

∂z

∣∣∣M0

(z − z0) = 0

法线方程为x− x0∂F∂x

∣∣M0

=y − y0∂F∂y

∣∣M0

=z − z0∂F∂z

∣∣M0

于是,当我们给定杆长 l 以及杆与面 S 交点 M0 = (x0, y0, z0) 后,可以求出旗杆顶点,其示意图

如下图 (1.6) 所示

图 1.6: 旗杆顶点求解示意图

可以通过下式求解杆顶点 M1 = (x1, y1, z1) 的坐标x1 − x0∂F∂x

∣∣M0

=y1 − y0∂F∂y

∣∣M0

=z1 − z0∂F∂z

∣∣M0

(x1 − x0)2 + (y1 − y0)2 + (z1 − z0)2 = l2

上述方程有两个可行解,为此我们添加约束条件 (M1 点在椭圆处):

s.t.x21a2

+y21b2

+z21c2> 1

其中,a = b = 6378.1km, c = 6356.8km。

✓在旗杆上标记小红旗上面,通过求偏导数以及解方程组,我们求得了旗杆端点的坐标 M0 = (x0, y0, z0) 和 M1 =

(x1, y1, z1) 。接下来,我们的任务是绘制小红旗,未旋转前的红旗如图 (1.7) 所示

(a) (b)图 1.7: 红旗未旋转前的示意图

http://www.ma-xy.com 8 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.1 绘图的两个例子

设旗面未旋转前,−→OZ 在旗面上,旋转角度为 δ,如图 (1.7a) 所示。图 (1.7b) 为红旗的放大

图,其 P1 =M1,w 为旗面的宽,h 为旗面的长。我们先来求点 P2。P2 在旗杆的垂线上,解下

面方程组可求得 P2 的坐标­

∣∣∣−−−→M1P2

∣∣∣∣∣∣−−−−→M1M0

∣∣∣ = wl

P2x− x0a

=P2y − y0

b=P2z − z0

c

其中:P2x, P2y, P2z 为 P2 点的坐标。上述方程组有两个解,我们在这里给出约束条件:

s.t.

x21 + y21 + z21 > P2x2 + P2y

2 + P2z2

M1在P2外

下面来求点 P3 ,点 P3 有 3 个特性:−−−→P2P3 ⊥

−−−→P2P1∣∣∣−−−→P2P3

∣∣∣ = h

P3在旗面上

上述求解的关键点是 P3 在旗面上,而旗面未知,所以我们先来求解旗面。未旋转之前,−→OZ 在旗面

上,于是 z 轴上任意一点皆在旗面上。由此,我们得到了旗面的 3个坐标点M1 = (x1, y1, z1),P2 =

(P2x, P2y, P2z),Z = (0, 0, 1) 。

引入:平面的三点式方程

由空间中三个不共线的点构成的平面方程为:∣∣∣∣∣∣∣∣x− x1 y − y1 z − z1x2 − x1 y2 − y1 z2 − z1x3 − x1 y3 − y1 z3 − z1

∣∣∣∣∣∣∣∣ = 0

或表示成 ∣∣∣∣∣∣∣∣∣∣x y z 1

x1 y1 z1 1

x2 y2 z2 1

x3 y3 z3 1

∣∣∣∣∣∣∣∣∣∣= 0

将 M1 = (x1, y1, z1) P2 = (P2x, P2y, P2z) Z = (0, 0, 1) 代入可以求得平面方程。设旗面为

Ax+By + Cz = D 于是,求解 P3 的方程组为−−−→P2P3 ·

−−−→P2P1 = 0∣∣∣−−−→P2P3

∣∣∣ = h

A · P3x+B · P3y + C · P3z = D

­注:也可以用比例直接求解。

http://www.ma-xy.com 9 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.1 绘图的两个例子 第一章 MATLAB 绘图

上述方程组有两个解,同样在这里我们也给出约束条件:

s.t. P3z < P2z

对于点 P4 的求解,可以仿照点 P3 的方法,相应的约束条件为 P4z < P1z。其中:P4z 表示

点 P4 的 z 坐标。以上过程求解了未旋转的旗面坐标,下面,我们对旗面进行旋转,其示意图如

图 (1.8) 所示

图 1.8: 旗面的旋转

其中:δ 为旋转角度,P ∗3、P

∗4 为旋转后的旗面顶点。我们先来求 P ∗

3:−−−→P1P

∗3 ·−−−→P2P1 = 0∣∣∣−−−→P1P

∗3

∣∣∣ = ω

上述方程有两个解,可以给出约束条件,也可以任意舍弃其中一个解。

✓绘制五角星至此,红旗的四个顶点 P1�P2�P3 和 P4 已经确定。下面的工作是在旗面上绘制五角星,其示

意图如下图 (1.9) 所示

图 1.9: 五角星示意图

其中:O 为五角星的外接圆心,r 为外接圆的半径,S1 到 S10 为五角星的顶点。下面我们来确定

各五角星在红旗上的位置。

step1:根据《国旗制作法说明》确定五角星的位置

1. 旗面为红色,形状为长方形且长与宽的比例为 3:2;

2. 大五角星的外接圆直径为旗高的十分之三;小星的外接圆直径为旗高十分之一。

3. 五角星的位置与画法:

http://www.ma-xy.com 10 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.1 绘图的两个例子

(a) 将旗面对分成四个相等的长方形,将靠杆上方长方形上下划分十等分,左右划分十五等分;

(b) 大五角星中心在该长方形上五下五,左五右十处;

(c) 小五角星的中心:第 1 个在上二下八,左十右五处;第 2 个在上四下六,左十二右三处;第 3 个在上七下三,左十二右三处;第 4 个在上九下一,左十右五处;

(d) 四个小五角星各自必有一外顶点 (奇数顶点) 位于大五角星与自身小五角星中心的连线上;

step2:将旗面对折,形成 4 个相等矩形,其示意图如图 (1.10) 所示

图 1.10: 旗面对折示意图

其中: Q2 =

P1 + P2

2= 0

Q4 =P1 + P4

2= 0

这里我们并不需要求解 Q3 。然后,将得到的四分之一旗面 (Q1,Q2 ,Q3 ,Q4) 的 Q1Q2 边十等

分,Q1Q4 边 15等分 (可以使用 linspace (Q1x,Q2x ,10),linspace(Q1y,Q2y ,10),linspace(Q1z,Q2z

,10))。至此,10 乘 15 的刻度及各点坐标可以得到,记为 tick。Step3:确定大圆圆心及直径 d大

d大 =3

10w

r大 =1

2d大

其中:w 为旗面的宽。下面,求解大圆圆心坐标 O大(x, y, z),其示意图如图 (1.11) 所示

图 1.11: 旗面大圆圆心坐标示意图

http://www.ma-xy.com 11 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.1 绘图的两个例子 第一章 MATLAB 绘图

其中:A 为上五下五点,B 为左五右十点,在 tick 里均有说明。O大 的求解方程组如下−−−→AO大 ·

−−−→AO大 = 0

−−−→AO大 ·

−−−→Q1Q2 = 0∣∣∣−−−→AO大

∣∣∣ = 1

2

∣∣∣−−−→Q1Q2

∣∣∣这个问题可以表述为:空间中,给定长方形三个顶点,如何求解第四个顶点。

step4:确定小圆圆心 Q1,Q2 ,Q3 ,Q4 及圆的直径 d小。小圆圆心求法如同大圆d小 =

1

10w

r小 =1

2d小 =

1

20w

Step5:画五角星以及五角星的转向下面,我们来研究如何绘制空间五角星,其示意图如图 (1.12) 所示

(a) (b)图 1.12: 空间五角星示意图

其中,O 为圆心,S1 到 S10 为五角星的顶点。我们可以利用结构体数组来存放五角星的信

息,并且考虑到绘制五角星时要求五角星有一外顶点要在大小圆心的连线上,我们先假设可以求

得该外顶点 (例如 S1)。于是问题就转化为:在已有 S1 的情况下如何确定其余顶点坐标。

对于一个五角星,我们已知其圆心 O,顶点 S1 及半径 r,有很多方法可以求解 S2,S3。

¬方法 1:先看点 S3:S3 点在旗面上、与 O 点距离为 r 且 ∠S1OS3 = 72◦,由此可以列出

S3 的求解方程组为

AS3x+BS3y + CS3z = D

(S3x−Ox)2 + (S3y −Oy)2 + (S3z −Oz)2 = r

cos(−−→OS1,−−→OS3) =

−−→OS1 ·

−−→OS3∣∣∣−−→OS1

∣∣∣ · ∣∣∣−−→OS3

∣∣∣ = cos(72◦)

解此方程组,有两个可行解,除 S3 外,另一个可行解为 S4,所以两者皆保留。

再看 S2 点。S2 点的求解方法和 S3 点是一样的,不过我们不知道−−→OS2 的模以及 ∠S1OS2

的角度,为此我们先来求解二者,五角星示意图如图 (1.13) 所示

http://www.ma-xy.com 12 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.1 绘图的两个例子

图 1.13: 五角星示意图

问题描述为:已知 OS3, OS1 长为 r,∠S1OS3 = 72◦,求 OS2 长及 ∠S1OS2。求解该问题:

∠S1OS3 = 72◦

∠S1OS2 =1

2∠S1OS3 = 36◦

∠S1S2S3 = 2(∠OS1S5 + ∠S1OS2) = 2(18◦ + 36◦) = 108◦

OS2 = OO′ −O′S2 = r · cos∠1− r · sin∠1tan∠2

因此,我们可以计算出顶点 S2 的坐标

AS2x+BS2y + CS2z = D

(S2x−Ox)2 + (S2y −Oy)2 + (S2z −Oz)2 = OS22

cos(−−→OS1,−−→OS2) =

−−→OS1 ·

−−→OS2∣∣∣−−→OS1

∣∣∣ · ∣∣∣−−→OS2

∣∣∣ = cos(36◦)

解上述方程,同样会有两个解,一个是 S2 一个是 S1 。

­方法 2:对于偶数顶点 S2,可以在求出奇数顶点后用直线相交的方法求解 S2(S2 是线 S1S5

和线 S3S9 的交点),这里不做详细叙述。前面我们假设已知 S1,下面我们将其求解出来。大五角星的点 S1 的确定如图 (1.14) 左所

示。

图 1.14: 大五角星角的确定

http://www.ma-xy.com 13 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.2 MATLAB 的基本绘图命令 第一章 MATLAB 绘图

由上图得,∣∣∣−−−→O大S1

∣∣∣ = r,∣∣∣−−−→O大B

∣∣∣ = 12

∣∣∣−−−→Q1Q2

∣∣∣, 且 S1 在旗面上,于是有下面的方程:

AS1x+BS1y + CS1z = D−−−→AO大 ·

−−−→Q1Q2 = 0∣∣∣−−−→O大S1

∣∣∣∣∣∣−−−→O大B∣∣∣ =

r

12

∣∣∣−−−→Q1Q2

∣∣∣ = r14w

求上述方程,会有两个解,因此给出约束条件:

s.t.∣∣∣−−−→S1O1

∣∣∣ < ∣∣∣−−−→S1O2

∣∣∣小五角星的点 S1 的确定如图 (1.14) 所示,从中可以看到 S1 在 O1O大 直线上,且距离 O1

为 r小。

引理 (直线的两点式方程) 空间中用两点式确定的直线方程为

x− x1x2 − x1

=y − y1y2 − y1

=z − z1z2 − z1

由上述引理,可以得到求解 S1 的方程组为S1x−O大xO1x−O大x

=S1y −O大yO1y −O大y

=S1z −O大zO1z −O大z

(S1x−O1x)2 + (S1y −O1y)

2 + (S1z −O1z)2 = r2小

解方程组会有两个解,对其进行约束,

s.t.∣∣∣−−−→O大S1

∣∣∣ < ∣∣∣−−−→O大O1

∣∣∣到这里,模型的的主干部分已经结束,而对于图形而言,还有很多琐碎的细节等待我们去处

理。

1.2 MATLAB 的基本绘图命令

1.2.1 MATLAB 图形 GUI 界面介绍

对于绘制后的图形,我们可以通过鼠标点击的方式来修饰图形。我们用一个例子进入图形的

GUI 界面,然后介绍图形中的对象及其属性。例子使用 plot 绘图命令绘制 sin(x) 的 x 在 [0, 2π]

的图形,运行下面的程序

1 plot ( l inspace (0,2*pi,360 ) , s in ( l inspace (0 ,2* pi ,360) )2

得到如图 (1.15a) 所示的图形

http://www.ma-xy.com 14 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.2 MATLAB 的基本绘图命令

(a) (b)图 1.15: sin 函数图像

这里我们给出的是图形窗口,如果需要保存图形,请自行查询方法。下面我们将详细分析这

个图形窗口 (关于绘图的相关命令,我们将其放在后面)。通过分析这个图形窗口,我们将学到:MATLAB 图形中的对象有哪些,对象属性又有哪些。不要认为这是一个简单的窗口,首先,我们要观察窗口的菜单栏和工具栏 (这两个名词真的很形象) 菜单栏 (第一栏) 中有:文件、编辑、查看、插入、工具、调试桌面、窗口、帮助的菜单章节,就像餐厅里的菜单中有:主食、茶饮、酒

等几个主要部分。点击进入菜单章节 (例“工具”),你会看到详细的“菜肴”,如图 (1.15b) 所示。这些“菜肴”的具体部分也可以在工具栏 (第二栏) 中找到,这里我们仅仅介绍两个工具 (“菜肴”):基本拟合、数据统计分析。这两道“菜肴”真的为 M 图形工具增色不少。其“基本拟合工具”和 EXCEL 中的拟合功能相近;“数据统计分析”是描述统计分析。这两道“菜肴”的窗口命令如图 (1.16) 所示 (必须强调真的很好用,也特别容易上手)。

(a) (b)图 1.16: 图形中的基本拟合和数据统计分析工具

下面我们来看工具栏,需要指出的是,工具栏不仅只有窗口中显示的那几个工具。在菜单栏

http://www.ma-xy.com 15 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.2 MATLAB 的基本绘图命令 第一章 MATLAB 绘图

中点击“查看”,将下面的“菜肴”全部选上 (只有前 3个是工具栏,后面 3个是重启),得到的窗口如图 (1.17) 所示,窗口的 2,3,4 栏是工具栏,你可以自行尝试这些工具的功能 (你只需将鼠标放在相应的位置,就会有相应的说明)。对于图形选项板与绘图浏览器,在这里就不详细说明了,你可以点击下拉快捷按钮来查看该模块 (选项板) 下可以进行的操作,可以将其关闭或取消停靠。

图 1.17: 图形窗口

下面,我们将详细介绍属性编辑器。先来看一下我们绘制的图形中都有哪些对象,然后查看

每个对象对应的属性 (属性编辑器)。图 (1.18) 展示了我们的对象,其类似于绘画工具:画板、画布和画

http://www.ma-xy.com 16 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.2 MATLAB 的基本绘图命令

图 1.18: 图形中的对象

可能存在的对象绝不仅有这些,我们可以在菜单栏下的“插入”中插入相应的对象:X标签、Y标签和标题 (这 3者是每张图必有的,其大部分为文本);图例、颜色栏 colorbar;线、箭头 . . .

椭圆是用于注释的。我们将可插入的对象插入进来,如图 (1.18) 所示。现在对象已经有了,接下来我们研究对象的属性 (例:就像“线”对象,有线的粗细、长短、色等等)。对象有:figure、axes、line series、x lable/y lable/title(这三者是 text 文本对象)、textbox、

scribe、scribe rect/ellipse、line/Arrow/double Arrow、legend。我们如何用命令获取对象属性?get set 用鼠标点击 (选中) 要研究的对象 (例如 figure),相应的属性编辑器会给出该对象的常用属性。我们选取右边的“更多属性”,进入“检查器:figure”,默认的属性排序是按照 A→Z 字母进行排序的。可以点击左上角的按键,进入属性的列表排序,如图 (1.19) 所示,我们给出了部分属性的中文名称以便于理解与查找。可以自行查看 axes(轴)、lineseries(线序列)、xlable(text 文本)、textbox(文本框)、scribe tect/ellipse(矩形椭圆)、scribe line/Arrow 等 (注释) 的属性检查器

http://www.ma-xy.com 17 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.2 MATLAB 的基本绘图命令 第一章 MATLAB 绘图

图 1.19: figure 的检查器

1.figure 的属性如下

1. Figure(图形)

(a) base property 基础性能

(b) control 控制

(c) data 数据

i. filename 文件名

ii. name 图形名

iii. Number Title on/offiv. Units单元:inches(英寸)centimeters(厘米)normalization(标准化)points(点)pixels(像素点)characters(特性)

(d) printing 打印

i. Invert handcopy on/offii. Paper orientation(纸方向)portrait(描写)landspace(风景)rotated(旋转)paperiii. position.X/Y/width/heightiv. Paper position mode

http://www.ma-xy.com 18 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.2 MATLAB 的基本绘图命令

v. Paper size.X/Yvi. Paper typevii. Paper units

(e) style/Appearance 风格/外观

i. Colorii. RGBiii. DockControls on/offiv. MenuBar(菜单) figurev. Pointer(指针) arrow/crosshair(箭头/十字)

最后我们来讨论如何获取和修改图形中对象的属性值,MATLAB 通过 handle 类对象来对图形数据 (属性值) 进行访问[?]。

1 h = f igure %将对象 f i gu re赋值给句柄类2 a = get (h , ’ co lor’ ) %得到对象/句柄h的‘ co lor’属性的属性值3 b = set (h , ’ co lor’ , r ) %得到对象/句柄h的‘ co lor’属性的属性值,颜色为红色4

当然,如果一个图形没有设置 figure 对象时,仍然可以用 get/set 得到对象属性,因为其有默认的句柄:figure 的默认为 gcf;Axes 的默认为 gca;lineseries 的默认为 gcl。所以上面的操作也可以写为

1 a = get ( gcf , ’ co lor’ )2

但要注意的是,当你打开多个图形窗口时,gcf为你正在操作的那个图形窗口 (active)的 figure。通过 get/set 的方法 (handle 类),你可以很容易的得到和设置某对象某属性的属性值。关于 handle类 get/set 的方法,你可以参考文献[?]P50。

1.2.2 doc、demo and mathworks.com 介绍

这一部分,我们将介绍如何快速高效的入门 MATLAB。这里,向大家推荐几件神器 doc、demo 和 mathworks.com。其中 mathworks.com 是 doc 和 demo 的网页版,并且你可以在 math-works.com 上学习更多的知识。首先,我们来介绍第一神器 doc。在 command 命令窗口输入 doc 命令即可打开该命令的帮

助文档,这里的文档是相当详尽的。例如,我们输入 doc plot会得到如图 (1.20)所示的帮助窗口,帮助窗口左边有帮助系统的目录,而右边提供了 plot 命令、Syntax(语法/用法)、description(描述)、output argunants (输出参数)、Moreabout(更多或拓展)、seealso(看了又看,同类/相关)。对于使用 doc 的 matlab user 而言,doc 中的 examples 可能是最为重要。因为大部分人不喜欢读文字,所以,不如直接举个例子。而这对于想系统学习 Matlab 结构及 matlab user 而言,左边的 contents 是比较重要的,因为它可以给你一个 M 概况,而不是琐碎的细节。学 MATLAB 最好的老师就是 Matlab 自身了,它除了给你提供大量的帮助文档外,你还可以 open function 来观察 matlab user 是如何编写 Matlab 函数文件的,这样可以快速提高你的 Matlab 水平。

http://www.ma-xy.com 19 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.2 MATLAB 的基本绘图命令 第一章 MATLAB 绘图

图 1.20: doc help 示意图

其次,我们来看第二个神器 demo。demo 是帮助的拓展,你可以发现,在 MATLAB 安装目录的 toolbox 下,几乎每个工具箱都有一个 *demos 文件夹。这里面存放着该工具箱的演示用品(用于演示如何使用工具箱),包括:Matlab 脚本、Matlab 函数、Matlab.dat 数据以及其它所需。当然,这些文件你也可以在 mathworks.com 的产品—工具箱—代码示例中看到。我们来看一下 statistic 和机器学习 toolbox 的演示文档

1 doc demo2 demo toolbox s t a t i s t i c3

statistic toolbox的演示文档如图 (1.21)所示。可以看到的是 demo给出了该 toolbox的用法 (.doc给出某命令的用法),这使得你能够很快入门 MATLAB 的 toolbox。演示文档上的 MATLAB 脚本文件不需要复制粘贴,它们已经位于该 toolbox 的 demo 文件夹中。

http://www.ma-xy.com 20 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.2 MATLAB 的基本绘图命令

图 1.21: statistictoolbox 的演示文档

最后,我们来介绍第三个神器:mathworks.com。mathworks.com 是需要经常浏览的一个网站,在学习 MATLAB 的过程中,我们会发现这个官网是多么的重要与详尽。有时候,我们想看某些学科的 MATLAB 操作 (如上面 demo 中的统计与机器学习的内容)。但是打开 MATLAB进入 demo 学习是非常不容易的,因为:¬MATLAB 打开很耗时,也耗内存;­demo 只提供你安装版本 MATLAB toolbox 的演示文档,你并不知道高版本 MATLAB toolbox 引入了哪些新技术。所以,更多学习是在 mathworks.com 中进行的。mathworks.com 官方网址是:http://cn.mathworks.com/。此时点击进去,会发现MATLAB的新技能 Hadoop、深度学习 Deeplearn,如图 (1.22)。此外,在浏览 MATLAB 网页时,有几个比较不错的去处:

♡Love MATLAB & MATLAB Sky♡知乎 MATLAB 专栏♡关注 Mathworks 的官方微博

http://www.ma-xy.com 21 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.2 MATLAB 的基本绘图命令 第一章 MATLAB 绘图

图 1.22: mathworks 官网

1.2.3 MATLAB 常用绘图命令[?] 一书很详实的介绍了大部分绘图命令,可以作为参考。虽然前面介绍了图形的 GUI 操作,

但作为一门语言,我们更倾向于用命令程序的方式来绘制修饰图形。我们整理了大部分图形命令,

并列举了常用的绘图命令以及它们的具体方法。详细的 Matlab 绘图命令可以在 mathworks.com查询。MATLAB 更是提供了 pdf 格式文件来展示,网址®下的 pdf 格式说明文档¯。另外有类似

demo、doc 的网址,如网址°下的内容±相当于 doc 命令帮助窗口。在此处,你可以浏览整个绘图命令,也可以查找具体命令的具体用法类似 (doc)。当然,这里提供的是最新版本 MATLAB 的命令情况。

下面,我们列举一些常用的绘图命以及一些常用的图形修饰命令,更全面的绘图命令你可以

在网址²下的图形函数 list 中查看。绘制 2D 图像常用的函数:

1 plot (x1 , y1 , x2 , y2 , l inesapce ,’name’ ,’ value’ )% 点线图

2 plotyy (x1 , y1 , x2 , y2 ,’ plot’ ,’ h i s t’ )% 用 plot绘左轴, h i s t绘右轴的等轴曲线图3 l i n e (x , y ,’name’ ,’ value’ )% 点线图

4 ezplot ( func )% func可以是 i n c l i n e函数 [ xmin ,xmax, ymin ,ymax]5 f p l o t% 函数图

6

1、2、4、5 命令的 syntax 中有 linespec 参数,其表示线的颜色、标号、线型例如,我们用’®http://cn.mathworks.com/help/pdf doc/matlab/index.html¯http://cn.mathworks.com/help/pdf doc/matlab/graphg.pdf°http://cn.mathworks.com/help/matlab/index.html±http://cn.mathworks.com/help/matlab/graphics.html²http://cn.mathworks.com/help/matlab/functionlist.html graphics

http://www.ma-xy.com 22 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.3 MATLAB 的一些杂例

ro-’表示该线是’r’红色;’o’线上点的标号用’o’;’-’连接各点线的类型是实线,表 (1.1)给出了 linespace 可供选择的 3 种属性的属性值,并介绍了一些常用的图形修饰函数 (命令)。

表 1.1: linespace 常用图形修饰函数

命令 说明 命令 说明

title 在当前坐标轴上添加标题 hold on 添加新绘图时保留当前绘图

xlabel 为 x 轴添加标签 subplot 在平铺位置创建坐标轴

ylabel 为 y 轴添加标签 text 向数据点添加文本说明

legend 将图例添加到图表 texlabel 将文本格式化为 TeX 字符串colorbar 显示颜色标度的颜色栏 cla 清除坐标轴

xlim 设置或查询 x 轴范围 daspect 控制沿每个轴的数据单位长度

get 查询图形对象属性 pbaspect 控制每个轴的相对长度

set 设置图形对象属性 clear fig 清除图形窗口

box on 显示坐标轴轮廓 hidden on 透视

grid on 显示或隐藏坐标轴网格线 gtext 在图形窗口点击位置,在该位置上显示 str

1.3 MATLAB 的一些杂例

这一章节更多的介绍了一些新版本中的绘图命令以及一些统计绘图的例子。MATLAB 的绘图工具箱在 2014b 版时发生了一些较大的变化,这些变化你可以在网址³上找到。

1. 可旋转的 tick lables在给坐标轴的刻度添加 lables 时,如果 lable 文本过长,会给工作增加许多麻烦,因为在

2014b 版本之前,MATLAB 允许的 tick lables 只有两个方向:垂直与水平。它不支持 labels 任意角度的旋转。在 2014b 之后,MATLAB 允许 tick lable 任意角度旋转 (当然,2014b 之前,已经有人开发了 tick lables 旋转这个命令)。

1 ax = gca ;2 ax . xtickLableRotation = −35; %顺时针旋转35度3

2. 2014b 引入新函数:histogram(创建两个重叠直方图并修改其属性)1 data1 = randn (5000 ,1) ;2 data1 = randn (5000 ,1) + 2;3 h1 = histogram (data1 ) ; %doc histogram4 hold on5 h2 = histogram (data2 ) ; %2015b引入 histogram26 hold o f f7 legend show8 h1 . Binmethod = ‘ sturgcs’ ;9 h2 . Normalization = ‘ countdensity’ ;

10

³http://cn.mathworks.com/help/matlab/release notes.html

http://www.ma-xy.com 23 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.3 MATLAB 的一些杂例 第一章 MATLAB 绘图

3. 2013a 引入新函数 yyaxis1 Doc yyaxis2 yyaxis l e f t3 yyaxis r ight4 yyaxis (ax…… )5 x = l inespace (0 , 10) ;6 y = sin (3*x) ;7 yyaxis l e f t8 plot (x , y)9 z = sin (3x) .* exp (0 .5x) ;

10 yyaxis r ight11 plot (x , z )12 ylim ([−150 , 150])13 t i t l e , xlable , y lable14 yyaxis l e f t15 ylable ()16 ax = gca ;17 yyaxis l e f t18 ax . Ydir = ‘ reverse’ ;19 ax .YAxis (1) . Direct ion = ‘ reverse’ ;20 ax . Ycolor = RGB21

4. Bubbleplot 可以绘制多维数据5. 气泡图 BubbleGum.m6. stackedbar3 绘制三维堆积柱状图利用 MATLAB 自带命令 bar3 只可以绘制三维 bar,虽然可以进行堆积操作 stacked(bar 中

有堆积操作),但是此堆积只有一个维度的堆积。1 load count . dat2 Y = count (1 :10 , : )3 bar3 (y , ’ stacked’ )4

值得庆幸的是,有一个 stackedbar3 函数可以解决 3 维堆积情况,该函数的用法如下1 h = stackedbar3 ( array ) ;2 ax . pro ject ion = ’ project ion’ ;3 ax . Grid = 10n’ ;4

7. fillbetween 填充两个图之间的部分8. fplot,fsurf,fmesh,fcountour,fplot3 于 R2016a 升级注:对于 axes 而言,axis = axes is¬fplot(R2016a) 语法 (syntax) 如下

1 f p l o t ( f )2 f p l o t ( f, xinterva l )3 f p l o t ( xt, yt, t i n t e rva l )4 f p l o t (_, l i ne spec )5 f p l o t (_,name, value )6

http://www.ma-xy.com 24 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第一章 MATLAB 绘图 1.3 MATLAB 的一些杂例

其应用示例如下:

1 fp = fp lo t (@(x), sinx, [−2pi, 2pi ], ’−.*c ’, ’ l inewidth ’,2)2 fp . l i n e s t y l e = ‘−’ ;3 grid on4 ax = gca ;5 ax . xTick = −2*pi : pi /2:2* pi6 ax . xTickLable = { ’−2 /pi ’, ’−3\pi /2 ’, ’−/pi ’, ’O’, ’ \ pi /2 ’, ’1\ pi ’, ’−3\pi /2 ’, ’−2 /pi ’}7

­fplot3 语法如下1 fp lo t3 ( xt, yt, zt, t i n t e rva l )2 fp lo t3 (_, l i ne spec ) %线的形状、颜色、标号3 fp lo3t (_,name, value )4

用其绘制如下函数图象 x = e

|t|10 sin(5t)

y = e|t|10 cos(5t)

z = t

绘制程序如下

1 xt = @( t )exp(−t /10) .* s in (5* t ) ;2 yt = @( t )exp(−t /10) .* cos (5* t ) ;3 2t = @( t ) t ;4 fp3 = fp lot3 (xt , yt , zt , [−10 ,10] ,’ l inewidth’ , 1 ) ;5 fp36 fp3 . co lor = ’ r’ ;7

®fsurf 的语法如下1 f s u r f ( f , xyinterval )2 f s u r f ( funx , funy , funz , uninterval )3 f s u r f (_, l ine spec )4 f s = f su r f (_, name, value )5

¯fmesh 与 fsurf 几乎相同。°fcountour 例子可以用 fsurf 的例子´。

9. MATLAB 图形对象及更新 (R2014b)MATLAB2014b 之后,我们可以使用下面的方法来查看绘图对象

1 p = plot (x , y) ;2 p %返回 l i n e对象3 who p4 p . co lor = ’ r’ ; %P对象可以使用点符号 (‘ .’,即dot index )进行取值与赋值5

而在 R2014b 之前,我们如此设置´补充 pie3 的用法

http://www.ma-xy.com 25 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om1.3 MATLAB 的一些杂例 第一章 MATLAB 绘图

1 set (p , ’ co lor’ , ’ r’ ) ;2 get (p) %返回p对象所有属性3 set (p , ’ l i n e s t y l e’ ) %查看p对象 l i n e s t y l e属性的可选属性值4

10. MATLAB R2014b 之后的图形变的更加平滑旧版本的 MATLAB 图不是很光滑,总感觉断断续续的。老版本绘图如图 (1.23a) 所示,新

版本绘图如图 (1.23b) 所示

(a) (b)图 1.23: 绘图光滑示意图

R2014b 图形的 title、xlable 默认字体大小比之前要更大;R2014b 之后 colorbar and legendno longer Axes,而是 colorBar对象;R2014b之后的 bar、contour、stem也已经改变为 hggroup对象

1 f indobj (’ type’ , Axes) %不再返回 colorbar & legend2

http://www.ma-xy.com 26 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构

2.1 MATLAB 操作命令

下面的许多表格中,有部分命令是没有说明的 (空白),需要读者自行查找填写。

27

http:/

/www.m

a-xy.c

om2.1 MATLAB 操作命令 第二章 MATALB 数据结构

2.1.1 有关命令窗口的操作

命令 语法说明 命令 语法说明

clc 清除命令行 save name 保 存 工 作 空 间 变 量 到

name.matclear 从工作空间清除所有变量 save name x y 保存工作空间变量 x y 到

name.matclear all load 从文件中读入变量

clear * 清除 * 变量 load name x ycla 清空当前坐标轴内容 quit(或 exit) 退出 MATLAB 环境clg startup MATLAB 自启动文件clf 清除图形窗口内容 ! dos

close 关闭打开的文件 ctrl+c 终止正在运行的程序

close figure * + tab 键more off 不允许分页 shift + tab 键more on 允许分页 Beep 发出声音

more(n) 指定每页输出行数 Waitforbuttonpressdiary on 创建日志,默认文件名称为

diary.txtmatlabroot 返回根目录

diary off 结束日志 matlabrc 启动主程序

diary * 创建名称为 *.txt 的日志 yesinputecho 显示文件中的 MATLAB 命

cedit 设置命令行编辑与回调的参

diary *.m 中断正在执行的命令 help 查询命令的帮助信息

helpdesk 打开超文本形式用户指南

(浏览器模式)lookfor 对 help 信息中的关键词查

Doc Demo

注:1、ctrl+c 可以在程序运行的任何时间暂停,并保存当前计算进度。但是它只能保存暂停处的函数所使用的局部变量,调用这个函数的函数剧本变量无法得知。

2、more + 回车键前进一行、more + 空格键显示下一页、more + q 终止当前显示。

http://www.ma-xy.com 28 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.1 MATLAB 操作命令

2.1.2 常用快捷键

功能键 快捷键 功能说明

↑ Ctrl+p 调出前一个输入的命令

↓ Ctrl+n 调出后一个输入的命令

← Ctrl+b 光标左移一个字符

→ Ctrl+f 光标右移一个字符

Home Ctrl+a 光标移至首行

End Ctrl+e 光标移至行尾

Esc Ctrl+u 清除当前行

Del Ctrl+d 清除光标所在位置后面的字符

Backspace Ctrl+h 清除光标所在位置前面的字符

Enter 前进一行

显示下一页

Ctrl+k 删除到行尾

Ctrl+c 中断正在执行的命令

2.1.3 文件操作语句

命令 函数说明 命令 函数说明

getenv 获得环境参数 fprintf 将格式化数据写入文件,为 x 轴添加

标签

unix 执行操作系统命令并返回结果 fgetl 读取文件行并放弃换行符

fopen 打开文件 fclose 关闭文件 fgets 读取文件行并保持换行符

tempname 建立临时的文件名 ferror 查询文件输入/出的错误信息tempdir 返回一个已存在的临时目录名 feof 检查文件结束标志

fread 从文件中读取二进制数据 fseek 设置文件位置指针

fwrite 向一个文件写二进制数据 ftell 得到文件位置指针的位置

fscanf 从文件读取格式化数据 prewind 反绕一个打开的文件

注:fprintf 可以决定数据的根本格式 (即非显示格式)。

http://www.ma-xy.com 29 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.1 MATLAB 操作命令 第二章 MATALB 数据结构

2.1.4 数据变量/文件

命令 函数说明 命令 函数说明

who 简要列出工作空间变量 size 查询矩阵的维数

whos 详细列出工作空间变量名 type *.m 在工作空间查看 *.m 文件内容what 列出当前目录下的 m 文件和 mat 文件 delete 从磁盘删除指定文件

which 查找函数与文件所在的路径 dispdir 列出当前目录的内容 cell disppack 整理工作空间的内存

2.1.5 有关工作路径设置的命令

命令 函数说明 命令 函数说明

cd 或 ls 改变当前的工作目录 userpath 修改工作路径

cd () 修改目录 (work 文件夹) savepath 保存工作路径

cd .. 显示上一层目录 pathtool 搜索路径管理器

md(或 mkdir) 创建文件夹 addpath 增加文件搜索路径

pwd 显示当前目录 genpath 将目录下的所有子目录都增加到路径中

path 查看 matlab 的搜索路径 rmpath 去除文件搜索路径

注:1、cd 是设置 matlab 的默认路径 (目录) 即 matlab 启动程序,在 toolbox 或 load 下修改文件 matlab rc.m,在其最后加上 cd 路径。

2、addpath * -begin 添加路径 * 到搜索路径顶端。

http://www.ma-xy.com 30 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.1 MATLAB 操作命令

2.1.6 数据显示格式

命令 意义

format short(默认) 实数,用 5 位数字的科学计数法显示format short e 5 位科学计数法显示format short g 从 format short 和 format short e 中自动选择最佳计数方式format long 15 位数字表示format long e 15 位科学计数法表示format long g 从 format long 和 format long e 中自动选择最佳计数方式format rat 近似有理数表示 (小数分数表示)format hex 十六进制表示

format + 正数、负数、零分别用 +、-、空格format bank 表示元、角、分

format compact 在显示结果之间没有空行的压缩格式

format loose 在显示结果之间有空格和空行的稀疏格式

注:1、这里的数据显示格式并非保存格式,将其复制到 EXCEL 时仍为原格式。2、数据显示格式并非数据实质格式。

http://www.ma-xy.com 31 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

2.2 MATLAB 数据类型/对象

2.2.1 矩阵 matrix

矩阵创建函数

函数 意义 函数 意义

zeros 生成全零阵 eye 生成单位矩阵

ones 生成全 1 矩阵 magicvander 生成范德蒙矩阵 blkdiag 产生以输入元素为对角线的矩阵

compan 生成友矩阵 cumprod 类似于 sumhankel 生成 Hankel 方阵 hilb 生成 Hilbert 矩阵invhilb 逆 Hilbert 矩阵 pascal 生成 Pascal 矩阵hadamard cat 创建多维数组

randn 生成 0 1 间均匀分布的随机矩阵 randperm 产生 1 n 之间整数的随机排列linspace 线性等分向量生成 logspace 生成对数等分向量

strcmp 字符串比较函数 findstr 字符串查找

strrep 字符串替换函数 sparse 稀疏矩阵的创建

full 将稀疏矩阵转化为满矩阵 spconvert 外部数据转化为稀疏矩阵

find 稀疏矩阵非零元素的索引 speye 创建单位稀疏矩阵

spones 创建非零元素是 1 的稀疏矩阵 spdiags 创建对角或带状稀疏矩阵

注:1、horcat⇔ [A,B]�⇔ cat(1, A,B);

2、vercat�⇔ [A;B]�⇔ cat(2, A,B)

常见的矩阵运算

运算符 符号说明 运算符 符号说明

A+B 矩阵相加 rot90 逆时针旋转 90 度A*B 矩阵相乘 flrplr 上下翻转

A/B 相除,左除还可以表示成 inv(a)*b flrpud 左右翻转

Ak 矩阵的乘方运算 flrpdim 指定维数翻转

det(A) 向量的行列式 shiftdim 元素移位

rank(A) 向量的秩 transpose 沿主对角线翻转矩阵

trace(A) 向量的迹 circshift 矩阵循环平移

inv(A) 矩阵的逆 conv 卷积

pinv(A) 伪逆矩阵 ceconv 反卷积

接下页表格……

http://www.ma-xy.com 32 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

(续表)expm(A) 方阵指数函数,这是一个内部函数 kroon 张量积

sqrtm(A) 矩阵的方根 diag 矩阵对角元素的抽取

logm(A) 矩阵的对数,是 lxpm(A) 的反函数 A.*Beig 矩阵特征值与特征向量 A./B

company 伴随矩阵 A.k

prod 矩阵元素求积 A’ transposetril 下三角阵抽取 A.’ ctransposetriu 上三角阵抽取 chol 对称正定阵的 Cholesky 分解

cross(A,B) 向量的叉乘 lu 矩阵的 LU 分解dot(A,B) 向量的点积 qr 矩形矩阵的正交分解

cond 矩阵条件数 schur 方阵的舒尔分解

reshape(A,2,6) 矩阵重塑, 将 A 变为 2 行 6 列 svdrepmat(A,m,n) 矩阵的复制 cholinc (chol)polyvarm(P,A) 矩阵的多项式 lu luincunm(A, @fun) 计算矩阵 A 的函数 union(A,B) 两个集合的并集

norm 矩阵范数 (维数较大时用 normest) unique(A) 不重复元素构成的向量

poly blkdiagmeshgrid length

ndims numel

注:1.norm(A, 1) 为 1-范数,||x||1 = |x1|+ |x2|+ · · ·+ |xn|;2.norm(A, 2) 为 2-范数,||x||2 = (|x1|2 + |x2|2 + · · ·+ |xn|2)1/2;3.norm(A, inf) 为 ∞-无穷范数,||x||∞ = max(|x1|, |x2|, · · · , |xn|)。

http://www.ma-xy.com 33 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

引入 - is 判断函数

命令 说明 命令 说明

issparse 若是稀疏矩阵则为真 isletter 若是英文字母则为真

ismember 检查是否属于指定集 isspace 若是空格则为真

isequal 若两数组相同则为真 isempty 若是空阵则为真

isfield 若是构架域则为真 isglobal 若是全局变量则为真

ishandle 若是图形句柄则为真 isfinite 全部元素都有限

isieee 计算机执行 IEEE 规则 isobject 若是对象则为真

ischar 若是字符串则为真 isprime 若是质数则为真

isnan 若是非数则为真 isreal 若是实数则为真

isinf 若是无穷数据则为真 isstudent Matlab 学生版规则isnumeric 若是数值数组则为真 isscalar 是否为标量

注:1、is a(x, ’数值类型’)2、is + tab 键

常见统计函数

这里省略具体的例子,仅给出需要注意的几点。

1. round、floor、fix、roundn、ceil;

2. mod、rem;

3. 矩阵操作时,列优先;

4. 虚数表示为:z=a+bi=r*exp(i*theta);

5. exist(‘x’): 查询工作空间中是否存在某个变量;

6. i=exist(‘x’): 查询工作空间中是否存有’x’变量;

(a) i=0: 表示不存在以上变量和文件;

(b) i=1: 表示存在一个变量名为’x’的变量;

(c) i=2: 表示存在一个名为’x.m’的文件;

(d) i=3: 表示存在一个变量名为’x.mex’的文件;

(e) i=4: 表示存在一个变量名为’x.mdl’的文件;

(f) i=5: 表示存在一个变量名为’x’的内部函数;

http://www.ma-xy.com 34 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

2.2.2 列表 table

table 类是 MATLAB2013b 新增的数据类型,类似于 R 语言中的 dataframe 数据类型。我们可以通过 doc table 在 MATLAB 上学习该数据类型,当然,如果你的 MATLAB 版本不允许的话 (要求 R2013b 以上),可以通过下面网址¬ 进行基本的学习。

在研究后面的各种数据类型时,我们仅简单的介绍了数据类型的常用函数,以及某些小例子,

对于数据类型的具体应用,将其放在了后面实战 (建模) 部分。

Table 相关函数

函数 意义 函数 意义

Table 创建表数据类型 Readtable 从文件读取数据,创建表

Writetable 将表写入文件 Istable 判断一个变量是否是 ta-ble 类型

Height 表的行数,返回 table 的高

Width 表变量的数量,返回 ta-ble 的宽

Ndims 返回 table 的维度 Numel 返回 table 高和宽的乘积Horcat 横向串接 table Vercat 纵向串接 tableIntersect 设置两个数组的交集 Ismember 数组的元素设置数组的

成员

Setdiff 设置两个数组的差 Setxor 异或两个数组

Unique 独特的数组中的值 Union 设置两个数组联盟

Join 使用关键变量匹配行合

并两个表

Innerjoin 内连接两个表

Outerjoin 外连接两个表 Summary 描述表

Sortrows 排序数组的行,table 按照制定的 row 排序

Stack 将多列堆成一列

Unstack 一列展成多列 Ismissing 找到没有赋值的项,返回

logical index)StandardizeMissing 给未赋值项赋默认值 Varfun 把函数作用在 table 中选

定的变量上

Rowfun 应用函数表行 findgroups 发现组和返回组数字

Splitapply 数据分割成组织和应用

功能

Table Properties 访问和修改表元数据属

注:结构体 struct 可以是标量也可以是矢量。¬http://cn.mathworks.com/help/matlab/tables.html

http://www.ma-xy.com 35 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

示例

为了方便,我们直接采用MATLAB自带的数据进行展示,更为详细的例子,可以查找MAT-LAB 网站,当然,你也可以在 MATLAB 窗口中输入命令来打开一些 examples,例如:

1 openExample( ’matlab/CreateTablefromSubsetofLargerTableExample ’ )2 openExample( ’matlab/CreateArrayfromtheContentsofTableExample ’ )3 openExample( ’matlab/SplitTableDataVariablesAndApplyFunctionsExample ’ )4

限于篇幅,我们并没有将例子中的结果写出,读者可以运行相应的程序来查看结果,也可以

运行我们的例子文件 (文件是用 MATLAB 实时编辑器编写的,文件名为 example_table.mlx)。如果你不希望打开 MATLAB,你也可以通过 example_table.pdf 或者 example_table.html 来查看命令和结果。

我们用到的数据是一个病人情况的数据,里面共有 100 个样本 (病人/patients),变量为病人的年龄 (Age)、是否吸烟 (Smoker)、身高 (Height)、体重 (Weight)、性别 (Gender)、姓名(LsatName)、家庭住址 (Location)、心脏收缩 (Systolic)、心脏舒张 (Diastolic)、Self AssessedHealth Status。1、加载 MATLAB 自带数据并将其保存为 table 数据类。

1 clc , c l ea r2 load pat ients3 whos4 BloodPressure = [ Sys to l i c Dias to l i c ] ;5 Gender = categor i ca l (Gender) ;6 whos( ’Gender ’ , ’Age ’ , ’Smoker ’ , ’ BloodPressure ’ )7 T = table (Gender , Age , Smoker , BloodPressure ) ;8 T(1 :5 , : )9

2、table 类的操作 (索引、方法)1 T = table (Gender , Age , Smoker , BloodPressure ) ;2 % dot索引返回一个 c e l l3 % ()索引返回一个 table4 % {}索引返回一个 c e l l5 %T(end+1 ,:) = {37 ,{ ’Female ’} , true , [ 130 84]}%错误是因为MATLAB不能分配数值数据到分类数

组、性别。

6 StructArray = table2struct (T)7 StructArray (1)8 T. Propert ies .RowNames = LastName ;%propert ies−−内容9 T(1 :5 , : )

10 T({ ’Williams ’ , ’Brown ’ } ,{ ’Age ’ , ’ BloodPressure ’ })%使用行和变量名称来访问数据11 T(3 : 2 : 5 , 2 : 2 : 4 )12 summary(T)13 T. Propert ies . Description = ’ Simulated Patient Data ’ ;14 T. Propert ies . VariableDescr ipt ions = . . .15 { ’Male or Female ’ . . .16 ’ ’ . . .17 ’ true or f a l s e ’ . . .18 ’ Sys to l i c /Dias to l i c ’ } ;

http://www.ma-xy.com 36 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

19 T. Propert ies . VariableUnits{ ’Age ’} = ’Yrs ’ ;20 summary(T)21 s i z e (T)22 T. Height = Height ;%点方法添加变量Height23 T.Weight = Weight ;24 T. ID = randi (1e4 , 100 , 1) ;25 T.BMI = (T.Weight*0.453592) . / (T. Height *0.0254) . ^2 ;26 T. Propert ies . VariableUnits{ ’BMI’} = ’kg/m^2 ’ ;27 T. Propert ies . VariableDescr ipt ions{ ’BMI’} = ’Body Mass Index ’ ;28 t f = (T. Smoker == f a l s e ) ;29 h1 = histogram (T.BMI( t f ) , ’BinMethod ’ , ’ in teger s ’ ) ;30 hold on31 t f = (T. Smoker == true ) ;32 h2 = histogram (T.BMI( t f ) , ’BinMethod ’ , ’ in teger s ’ ) ;33 xlabe l ( ’BMI (kg/m^2) ’ ) ;34 ylabe l ( ’Number of Patients ’ ) ;35 legend ( ’Nonsmokers ’ , ’ Smokers ’ ) ;36 t i t l e ( ’BMI Distr ibut ions fo r Smokers and Nonsmokers ’ ) ;37 hold o f f38 T. Sys to l i c = Systo l i c ;39 T. Dias to l i c = Dias to l i c ;40 t f = (T.BMI <= 25) ;41 h1 = histogram (T. Dias to l i c ( t f ) , ’BinMethod ’ , ’ in teger s ’ ) ;42 hold on43 t f = (T.BMI > 25) ;44 h2 = histogram (T. Dias to l i c ( t f ) , ’BinMethod ’ , ’ in teger s ’ ) ;45 xlabe l ( ’ D ias to l i c Reading (mm Hg) ’ ) ;46 ylabe l ( ’Number of Patients ’ ) ;47 legend ( ’BMI <= 25 ’ , ’BMI > 25 ’ ) ;48 t i t l e ( ’ D ias to l i c Readings fo r Low and High BMI’ ) ;49 hold o f f50 T = sortrows (T, ’RowNames ’ ) ;51 T(1 :5 , : )52 varnames = T. Propert ies . VariableNames ;53 others = ~strcmp( ’Gender ’ , varnames ) ;54 varnames = [ varnames ( others ) ’Gender ’ ] ;55 T = T( : , varnames ) ;56 rows = T. Smoker==f a l s e & T.Age<30;57 vars = { ’Gender ’ , ’ Height ’ , ’Weight ’ } ;58 T1 = T(rows , vars )59 %T.AgeAvg = mean(T.Age , 2)60 varfun (@mean, T, ’ InputVariables ’ , ’Age ’ , . . .61 ’ GroupingVariables ’ , ’Gender ’ )62

3、导出 table1 writetable (T, ’ allPatientsBMI . txt ’ ) ;2

http://www.ma-xy.com 37 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

2.2.3 映射表数据结构 Map containers

containers.Map 其中 containers 是 Package 的名称,Map 是该 Package 中的一个类,Map是它的类名,类似于 Python 中的字典。用 UML(Unified Modeling Language) 的语法把该类表示出来,它的属性包括 Count 、KeyType、ValueType。它的常用方法包括 keys、values、isKey、remove。键的类型一定要是字符类型,按键值进行索引。其中键值的类型可以是 MATLAB 中的任意

类型:数组、元胞、结构体、MATLAB 对象、甚至 JAVA 对象等等。读者可以到下面网址­去了

解详细情况。

可用函数

Map containers 数据结构可用的函数如下表

命令 说明

a = containers.Map 创建 Mapa(‘key’) = value 键值

a.keys 查看键

a.remove(‘keys’) 移除键值对

a.isKey 是否有一个键值 (键的大小写是敏感)lengthsize

注:1、containers.Map 提供对数据的快速查找。映射表查找的复杂度是常数 O(C) 的,而数组和元胞数组是线性 O(N) 的。如果使用数组或者元胞来存储数据,在该数据结构中搜索一个值时,只能做线性搜索,平均下来,搜索的时间和该数据结构中的元素的数目 N 成正比,即元胞和数组中的元素越多,找到一个值所花时间就越长,这叫做线性的复杂度 O(N)。而映射表采取的底层实现是哈希表 (Hash Map),搜索时间是常数 C,理论上来说搜索速度和集合中元素的个数没有关系。所以当容器中元素数量众多的时候,要想查找得快,可以使用 containers.Map 结构。

2、isKey 的功能是查询,类似之前提到的 find 和 strcmp 函数合起来使用的例子。3、map 可以作为函数参数 (import containers.Map)。

示例

此文档是 Map 数据类的一个简单示例。在这个例子中,我们主要介绍了 Map 数据的构建、索引 (查询) 及一些方法。限于篇幅,我们并没有将例子中的结果写出,读者可以运行相应的程序来查看结果,也可以运行我们的例子文件 (文件是用 MATLAB 实时编辑器编写的,文件名为 example_Map.mlx)。如果你不希望打开 MATLAB,你也可以通过 example_Map.pdf 或者example_Map.html 来查看命令和结果。

­http://cn.mathworks.com/help/matlab/map-containers.html

http://www.ma-xy.com 38 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

1、构建简单的 Map1 clc , c l ea r2 ticketMap = containers .Map( . . .3 { ’2R175 ’ , ’B7398 ’ , ’A479GY’ , ’NZ1452 ’ } , . . .4 { ’James Enright ’ , ’ Carl Haynes ’ , ’ Sarah Latham ’ , . . .5 ’ Bradley Reid ’ }) ;6 keys ( ticketMap )%还可以使用 ticketMap . keys 方式7 values ( ticketMap )%还可以使用 ticketMap . value 方式8 passenger = ticketMap ( ’2R175 ’ )9 sp r in t f ( ’ Would passenger %s please come to the desk?\n ’ , . . .

10 ticketMap ( ’A479GY’ ) )11 values ( ticketMap , { ’2R175 ’ , ’B7398 ’ })12 % ticketMap ( ’2R175 ’ : ’ B7398 ’ ) %i s error13 % ticketMap ( : ) %i s error14 ticketMap ( ’ 947F4 ’ ) = ’Susan Spera ’ ;%添加键对15 ticketMap ( ’ 417R93 ’ ) = ’ Patr ic ia Hughes ’ ;16 remove( ticketMap , ’NZ1452 ’ ) ;%删除键17 ticketMap ( ’A479GY’ ) = ’Anna Latham ’ ;%修改键值18 values ( ticketMap )19 k = keys ( ticketMap ) ;20 v = values ( ticketMap ) ;21 st r1 = ’ ’ ’%s ’ ’ has been assigned a new\n ’ ;22 st r2 = ’ t i cke t number : %s .\n ’ ;23 f p r i n t f ( str1 , v{1})24 f p r i n t f ( str2 , k{1})25 m1 = containers .Map({1 , 5 , 8} , { ’A’ , ’B ’ , ’C’ }) ;26 m2 = containers .Map({8 , 9 , 6} , { ’X’ , ’Y’ , ’Z ’ }) ;27 m = [m1; m2] ;28

2、Mapping to a Structure Array1 s1 . ticketNum = ’2S185 ’ ; s1 . dest inat ion = ’Barbados ’ ;2 s1 . reserved = ’06−May−2008 ’ ; s1 . o r ig in = ’La Guardia ’ ;3 s2 . ticketNum = ’947F4 ’ ; s2 . dest inat ion = ’ St . John ’ ;4 s2 . reserved = ’14−Apr−2008 ’ ; s2 . o r ig in = ’Oakland ’ ;5 s3 . ticketNum = ’A479GY’ ; s3 . dest inat ion = ’ St . Lucia ’ ;6 s3 . reserved = ’28−Mar−2008 ’ ; s3 . o r ig in = ’JFK’ ;7 s4 . ticketNum = ’B7398 ’ ; s4 . dest inat ion = ’Granada ’ ;8 s4 . reserved = ’30−Apr−2008 ’ ; s4 . o r ig in = ’JFK’ ;9 s5 . ticketNum = ’NZ1452 ’ ; s5 . dest inat ion = ’Aruba ’ ;

10 s5 . reserved = ’01−May−2008 ’ ; s5 . o r ig in = ’Denver ’ ;11 seatingMap = containers .Map( . . .12 { ’ 23F ’ , ’ 15C’ , ’ 15B’ , ’ 09C’ , ’ 12D’ } , . . .13 {s5 , s1 , s3 , s4 , s2 }) ;14 seatingMap( ’ 09C’ )15 t i cke t = seatingMap( ’ 15B’ ) . ticketNum ;16 passenger = ticketMap ( t i cke t )17

3、Mapping to a Cell Array1 accountMap = containers .Map( . . .2 { ’Susan Spera ’ , ’ Carl Haynes ’ , ’Anna Latham ’ } , . . .

http://www.ma-xy.com 39 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

3 {{247.5 , 56.1} , {0 , 1342.9} , {24.6 , 314.7}}) ;4 name = ’Carl Haynes ’ ;5 acct = accountMap(name) ;6 f p r i n t f ( ’%s has used %.1 f miles on his /her account ,\n ’ , . . .7 name, acct {1})8 f p r i n t f ( ’ and has %.1 f miles remaining .\n ’ , acct {2})9

2.2.4 图数据结构 graph

MATLAB R2015b 中引入了新的对象 graph 来建立图模型,可以建立 graph(无向图) 和diagraph(有向图) 两种类型图。这种图广泛的出现在运筹学当中,更有一类学科 - 图论。在一幅图当中,图应有两个基本组成元素 (部件):节点 (node)、边 (edge),这二者是值得特别注意的。读者可以到下面的网址®去了解详细情况。

图数据结构的相关函数

函数 意义

创建/ Constructiongraph 创建无向图 (undirected graph)digraph 建立有向图

修改节点和边/ Modify Nodes and EdgesAddnode 添加新节点

Rmnode 删除节点

Addedge 添加新边缘

RmedgeNumnodes 图中的节点数量

Numedges 图的边数

Findnode 定位节点

FindedgeReordernodes 重新排序图节点

Subgraph 提取子图 (Extract subgraph)搜索和结构/ Search and Structure

bfsearch 图广度优先搜索

dfsearch 图深度优先搜索

centrality 测量节点的重要性 (Measure node importance)maxflow 最大流量 (Maximum flow in graph)conncomp 连通图组件 (Connected graph components)

接下页表格……

®http://cn.mathworks.com/help/matlab/graphandnetworkalgorithms.html

http://www.ma-xy.com 40 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

(续表)minspantree 图的最小生成树

toposort 有向无环图的拓扑秩序 (Topological order of directed acyclic graph)isdag 确定是否无环图

transclosure 传递闭包

transreduction 减少传递

最短路径/ Shortest Pathshortestpath 两个单节点之间的最短路径

shortestpathtree 最短路径树的节点

distances 最短路径距离 (Shortest path distances of all node pairs)矩阵表示/ Matrix Representation

adjacency 图的邻接矩阵

incidence 图的关联矩阵

laplacian 图的拉普拉斯算子矩阵

节点信息/ Node Informationdegree 度图节点

neighbors 图节点的邻居

nearest 最近的邻居内半径

indegree 节点的入度

outdegree 学位的节点

predecessors 节点的前辈

successors 节点的继任者

可视化/ Visualizationplot 图绘制

labeledge 标签图像边缘

labelnode 标签图节点

layout 改变布局图

highlight 突出绘制图的节点和边

使用对象/ Using Objectsgraph 与无向图的边缘

digraph 图与定向边缘

GraphPlot 图绘制的直接的和间接的图表

GraphPlot Properties 控制图的外观和行为

http://www.ma-xy.com 41 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

示例

此文档是 graph 数据类的一个简单示例。例子中展示了无向图和有向图的构建以及基本的方法,还展示了 garph 数据的绘图 GraphPlot。我们用的 MATLAB 版本为 R2016a,所以我们仍然用实时编辑器来展示下面的例子,并将例子保存在相应的 mlx文件中。读者可以运行相应的程序来查看结果,也可以运行我们的例子文件 (文件是用 MATLAB 实时编辑器编写的,文件名为 example_graph.mlx)。如果你不希望打开 MATLAB,你也可以通过 example_graph.pdf 或者 example_ graph.html 来查看命令和结果。当然,如果你希望了解更多,可以在命令窗口运行下面的命令自行学习。

1 openExample( ’matlab/ModifyNodesAndEdgesOfExistingGraphSectionsExample ’ )2 openExample( ’matlab/AddGraphNodeNamesEdgeWeightsAndOtherAttributesExample ’ )3 openExample( ’matlab/GraphPlotCustomizationExampleSectionsExample ’ )4 openExample( ’matlab/CustomizeGraphPlotDataCursorExample ’ )5

1、创建简单的无向图 garph。1 clc , c l ea r2 s = [1 1 2 2 3 ] ;3 t = [2 4 3 4 4 ] ;4 G = graph ( s , t )5 G. Edges6 G = addnode(G, 5)%添加五个无连接的节点 (节点5,6,7,8,9)。7 G = rmnode(G, [ 3 5 6 ] )%删除节点,节点上的边也被删除。8 G = addedge (G, [ 1 2 ] , [ 5 5 ] )9 G = rmedge(G,1 ,3 )%删除节点1和节点之间的边

10 e i = findedge (G,1 ,5 )%确定节点之间边的序号,Determine Edge Index11 G.Nodes .Name = { ’a ’ ’b ’ ’ c ’ ’d ’ ’ e ’ ’ f ’ } ’ ;%添加节点名称12 ni = findnode (G, ’d ’ ) ;%确定节点序号 index13 H = subgraph (G, [ 1 2 ] )%提取子图,子图只包含2个节点14 H. Edges15

2、创建简单的有向图 digraph1 DG = digraph ( s , t )2 DG.Nodes .Name = { ’ Fi r s t ’ ’ Second ’ ’Third ’ ’Fourth ’ } ’ ;%节点名称3 DG.Nodes .Name( [ 1 4 ] )%节点索引4 DG. Edges .Weight = [10 20 30 40 50 ] ’ ;%添加个边的权重5 DG. Edges ( [ 1 3 ] , : )%边索引6 DG. Edges . Power = { ’on ’ ’on ’ ’on ’ ’ o f f ’ ’ o f f ’ } ’ ;7 DG.Nodes . Size = [10 20 10 30 ] ’ ;8 p0 = plot (DG, ’EdgeLabel ’ ,DG. Edges .Power , ’NodeLabel ’ ,DG.Nodes . Size )9

3、简单的绘图1 %创建graph2 n = 12;3 A = delsq (numgrid( ’L ’ , n) ) ;4 G1 = graph (A, ’OmitSelfLoops ’ )5 %绘图GraphPlot

http://www.ma-xy.com 42 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

6 p1 = plot (G1)7 %p1 . NodeColor = ’ red ’ ;8 p1 . LineWidth9 %更改图节点布局

10 layout (p1 , ’ f o rce ’ )11 view (3)12 %成比例的节点着色13 G1.Nodes . NodeColors = degree (G1) ;%点索引14 p1 .NodeCData = G1.Nodes . NodeColors ;15 colorbar16 %边缘线宽的重量17 G1. Edges .Weight = randi ( [10 250] ,130 ,1) ;18 G1. Edges . LWidths = 7*G1. Edges .Weight/max(G1. Edges .Weight) ;19 p1 . LineWidth = G1. Edges . LWidths ;20 %提取子图21 H = subgraph (G1, [ 1 : 3 1 36 :41 ] ) ;22 p1 = plot (H, ’NodeCData ’ ,H.Nodes . NodeColors , ’LineWidth ’ ,H. Edges . LWidths) ;23 colorbar24 %标签节点和边25 labeledge (p1 , f ind (H. Edges . LWidths > 6) , ’ Large ’ )26 %突出最短路径27 path = shortestpath (H,11 ,37)28 high l ight (p1 , [ 1 1 37 ] )29 high l ight (p1 , path , ’EdgeColor ’ , ’ r ’ )30 %删除节点标签和 colorbar ,使所有的黑色节点。31 p1 . NodeLabel = {};32 colorbar o f f33 p1 . NodeColor = ’ black ’ ;34 %找到一个不同的最短路径 ,忽略边。用绿色突出显示这条道路。35 path2 = shortestpath (H,11 ,37 , ’Method ’ , ’ unweighted ’ )36 high l ight (p1 , path2 , ’EdgeColor ’ , ’ g ’ )37

Graph 实例 - WS 小世界模型

不同网络的特征 (平均度、平均路径、中心距离)是不同的,这里,我们将介绍一种网络:W-S小世界网络 (其他网络还有:无标度网络 (BA)、随机网络和分层网络等),并分析该网络的特征。这个W-S小世界网络模型是 MATLAB自带的示例,你可以到下面的网址¯进行详细了解,当然,

你也可以在 MATLAB 命令窗口输入下面的命令进行了解,如果你的 MATLAB 版本允许的话。1 openExample( ’matlab\_featured/BuildWattsStrogatzSmallWorldGraphModelExample ’ )2 openExample( ’matlab/VisualizeBreadthFirstAndDepthFirstSearchExample ’ )3

下面的例子展示了如何构建和分析 Watts-Strogatz 小世界图。Watts-Strogatz 模型是具有小世界网络特性的随机图,详细内容可参考维基百科°。

1、算法描述¯http://cn.mathworks.com/help/matlab/examples/buildwattsstrogatzsmallworldgraphmodel.html°https://en.wikipedia.org/wiki/WattsandStrogatzmodel

http://www.ma-xy.com 43 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

创建一个 Watts-Strogatz 图有两个基本步骤:第一步,创建一个环晶格 N 节点的平均度

2K。每个节点连接到它 K 个最近的邻居;第二步,图中每条边重新连接目标节点的概率 β。重

新接线的边缘不能复制或自身环。

当 β = 0 时,网络是一个没有边缘重新返回的环晶格模型。当 β = 1 时,所有的边缘重新形

成,环晶格转化为一个随机图。WattsStrogatz.m 文件实现了这个W-S 算法。该函数根据上面的算法描述输入参数 N,K, β。

2、W-S 网络使用 WattsStrogatz 函数构建一个 500 节点的环晶格。当 β = 0,这个函数返回一个环晶格,

每个节点的度都是 2K。

1 h = WattsStrogatz (500 , 25 , 0) ;2 plot (h , ’NodeColor ’ , ’k ’ , ’Layout ’ , ’ c i r c l e ’ ) ;3 t i t l e ( ’Watts−Strogatz Graph with $N = 500$ nodes , $K = 25$ , and $\beta = 0$ ’ , ’

Interpreter ’ , ’ latex ’ )4

通过提高 β = 0.5 来增加图中的随机性

1 h3 = WattsStrogatz (500 , 25 , 0 .5) ;2 plot (h3 , ’NodeColor ’ , ’k ’ , ’EdgeAlpha ’ , 0 .1) ;3 t i t l e ( ’Watts−Strogatz Graph with $N = 500$ nodes , $K = 25$ , and $\beta = 0.50$ ’ , . . .4 ’ Interpreter ’ , ’ latex ’ )5

http://www.ma-xy.com 44 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

我们通过增加 β,生成一个完全随机图,使其达到最大值 1.0。1 h4 = WattsStrogatz (500 ,25 ,1) ;2 plot (h4 , ’NodeColor ’ , ’k ’ , ’EdgeAlpha ’ ,0 .1 ) ;3 t i t l e ( ’Watts−Strogatz Graph with $N = 500$ nodes , $K = 25$ , and $\beta = 1$ ’ , . . .4 ’ Interpreter ’ , ’ latex ’ )5

3、网络特征 - 度分布节点的度分布在不同的Watts-Strogatz图是不同。当 β 是 0时,每个节点都有相同的度 2K,

所以度是一个狄拉克 δ 函数分布 δ(x− 2K)。然而,随着 β 增加,程度分布在发生变化。下面的

图显示了度分布的变化。

1 histogram ( degree (h2) , ’BinMethod ’ , ’ in teger s ’ , ’FaceAlpha ’ ,0 .9 ) ;2 hold on3 histogram ( degree (h3) , ’BinMethod ’ , ’ in teger s ’ , ’FaceAlpha ’ ,0 .9 ) ;4 histogram ( degree (h4) , ’BinMethod ’ , ’ in teger s ’ , ’FaceAlpha ’ ,0 .8 ) ;5 hold o f f6 t i t l e ( ’Node degree d i s t r ibut i ons fo r Watts−Strogatz Model Graphs ’ )7 xlabe l ( ’Degree of node ’ )

http://www.ma-xy.com 45 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

8 ylabe l ( ’Number of nodes ’ )9 legend ( ’\beta = 1.0 ’ , ’ \beta = 0.50 ’ , ’ \beta = 0.15 ’ , ’ Location ’ , ’NorthWest ’ )

10

4、网络特征 - 中心的形成因为 Watts-Strogatz 图聚类系数高,所以节点倾向于形成小团体,或小组密切联系的节点。

随着 β 增加,它的最大值也在增加,你会看到越来越大量的枢纽节点,或节点的相对程度高。中

心是一个常见的其他节点之间的连接和派系之间的图。中心的存在就是允许派系的形成,同时保

留一个简短的平均路径长度。计算的平均路径长度和数量为每个 β 值的中心节点。在示例中,节

点与中心节点度大于或等于 55。这些所有的节点的度增加 10% 或更多比原环晶格。1 n = 55;2 d = [mean(mean( distances (h) ) ) , nnz( degree (h)>=n) ; . . .3 mean(mean( distances (h2) ) ) , nnz( degree (h2)>=n) ; . . .4 mean(mean( distances (h3) ) ) , nnz( degree (h3)>=n) ;5 mean(mean( distances (h4) ) ) , nnz( degree (h4)>=n) ] ;6 T = table ( [ 0 0.15 0.50 1 ] ’ , d ( : , 1 ) , d ( : , 2 ) , . . .7 ’VariableNames ’ ,{ ’Beta ’ , ’AvgPathLength ’ , ’NumberOfHubs ’ })8

作为 β 平均路径长度的增加,图很快就落在了它的极限值。这是由于形成高度连接的枢纽

节点,成为更多 β 增加。画出的 Watts-Strogatz 模型图,使每个节点的大小和颜色的程度成正比。这是一个有效的方法来可视化中心的形成。

1 colormaphsv2 deg=degree (h2) ;3 nSizes=2*sqrt (deg−min(deg )+0。2) ;4 nColors=deg ;5 plot (h2, ’ MarkerSize ’, nSizes, ’NodeCData ’, nColors, ’ EdgeAlpha ’,0。1)6 t i t l e ( ’Watts−StrogatzGraphwith$N=500$nodes,$K=25$,and$\beta=0。15$ ’,。。。7 ’ Interpreter ’, ’ latex ’ )8 colorbar9

http://www.ma-xy.com 46 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

2.2.5 金融时间序列结构 fints

fints 用于构建金融时间序列数据,可以用于单一时间序列分析,也可以用于多元时间序列分析。更多情况下,fints 被用来进行股票数据分析,其基本结构如下表 (2.3) 所示

表 2.3: 股票数据基本结构

Dates Series1 Series2...

......

......

...

fints 数据结构的构建方法 (工厂函数法) 为:tsobj = fints(dates, data, datanames, freq, desc)

其中:dates 表示日期,关于日期的形式 (格式) 及函数在后面介绍;data 表示时间序列,可以是列向量也可以是矩阵;datanames 表示时间序列名称,默认为 series1. . .,可以用 {′′,′′ } 定义;freq 表示频率指示器,允许的取值如下

Unkown 0Daily 1Weekly 2monthly 3Quarterly 4Semiannually 5Annual 6

desc 表示时序的描述.character vector 类.default=’’(默认为缺省)。对 fints 进行访问时,每行为一单元 (个体),可以用 dot index(.seriesname) 形式访问某一序列,亦可两者结合使用

http://www.ma-xy.com 47 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

A.series([3:6]),且操作 (访问) 后的子数据仍为 fints 数据格式。下面,我们将列举一些 fints 的常用函数,并给出一些简单的例子,如果读者想进一步学习该数据结构,可以访问下面的网址±。

fints 数据结构的相关函数

命令 说明

fts2matascii2ftsmerge 取 fts1, fts2 两者时刻交集为索引convertto(fts, ’daily’) 按 daily 采样,自动过滤节假日todaily(fts)resamplets(fts, step) step 为采样步长boxcox Box-Cox 变换difffilltsfilterleadtsperavg 计算一定周期内的均值

smoothtstsmovavg 计算移动平均值,需要 R2016a 版本chartfitsftstoolftsboundhorzcatvertcatcorrcoef Correlation coefficientscov Covariance matrixisempty True for empty financial time series objectsnancov Covariance ignoring NaNsnanmax Maximum ignoring NaNsnanmean Mean ignoring NaNsnanmedian Median ignoring NaNsnanmin Minimum ignoring NaNs

接下页表格……

±http://cn.mathworks.com/help/finance/manage-financial-time-series.htmlhttp://cn.mathworks.com/help/finance/fints.htmlhttp://cn.mathworks.com/help/finance/data-transformation-and-frequency-conversion.htmlhttps://zhuanlan.zhihu.com/p/21454649?refer=matlab

http://www.ma-xy.com 48 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

(续表)nanstd Standard deviation ignoring NaNsnansum Sum ignoring NaNsnanvar Variance ignoring NaNsvar Variancechfield 改变数据系列的名字

eq(fts) 多个金融时报系列对象平等

extfield 数据提取

fetch 金融时间序列的数据对象

fieldnames 获得字段的名称

freqnum 特征向量频率指标转换为数字频率指标

freqstr 数字频率指标转化为特征向量表示

ftsbound 开始和结束日期

ftsinfo 金融时间序列对象信息

ftsuniq 确定的独特性

getfield 内容的特定字段

getnameidx 在名单上找到的名字

iscompatible 结构上的平等

isequal 多个对象平等

isfield 检查是否特征向量是字段名

issorted 检查日期和时间是否单调递增

rmfield 删除数据系列

setfield 设置特定字段的内容

sortfts 类金融时间序列

注:1、平滑方法有 linear、exponential、accussion 等方法;2、peravg 的返回值也是一个结构体;3、在 FINTS 中,用“::”来指定一段时间;4、索引 index 的只能是行数。

示例

此文档是 fts 数据类的一个简单示例。fts 数据类来自 matlab 金融工具箱,主要用来进行股票等金融数据分析。我们直接利用 matlab 自带的数据给出示例 (fts 的创建、索引和方法等),读者可以到下面的网址了解详细的内容。当然,你也可以在命令窗口运行:

1 openExample( ’ f inance/UsingTimeSeriestoPredictEquityReturnExample ’ )2

http://www.ma-xy.com 49 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

命令来查看这个示例。数据存放在 predict_ret_data.mat 这个 MAT 数据文件,这个 MAT 文件包含 6 个变量 (矢量):1. corresponding to the closing stock prices, sdates;2. Closing stockprices, sdata;3. Dividend dates, divdates;4. Dividend paid, divdata;5. Dates correspondingto the metric(度量标准) data, expdates;6. Metric data, expdata。1、加载数据

1 clc , c l ea r2 load predict_ret_data .mat3 whos4

2、创建金融时间序列对象1 t0 = f i n t s ( sdates , sdata , { ’ Close ’ } , ’d ’ , ’ Inc ’ ) ;%股票收盘价\stock c lo s ing pr i ce s2 d0 = f i n t s ( divdates , divdata , { ’ Dividends ’ } , ’u ’ , ’ Inc ’ ) ;%股息支付\dividend

payments3 x0 = f i n t s ( expdates , expdata , { ’Metric ’ } , ’w’ , ’ Index ’ ) ;%explanatory data4 srs2 = t0 . Close (1 :5 )%点索引指示变量Close, (1 :5 )序号索引指示前5行5 srs2_vec = fts2mat ( t0 . Close (1 :5 ) )6 t0 . Close ( ’05−Jan−1999 ’ )%时间索引7 t0 ({ ’ 05/11/99 ’ , ’ 05/21/99 ’ , ’ 05/31/99 ’ })8 t0 . Close ({ ’ 05/11/99 ’ , ’ 05/21/99 ’ , ’ 05/31/99 ’ })9 t0 ( ’ 05/11/99::05/15/99 ’ )%: : 表示 from to

10 nf t s = t0 . Close ( ’ 05/11/99::05/20/99 ’ ) ;11

3、fts 数据类型的基本操作1 %% 创建收盘价调整 s e r i e s2 dadj1 = d0 ;3 dadj1 . dates = dadj1 . dates−1;4 dadj2 = d0 ;5 dadj2 . Dividends = 0;6 dadj2 = f i l l t s ( dadj2 , ’ l i n ea r ’ , ’ 12/31/98 ’ ) ;7 dadj2 ( ’ 12/31/98 ’ ) = 0;8 dadj3 = [ dadj1 ; dadj2 ] ;9 dadj3 = f i l l t s ( dadj3 , ’ l i n ea r ’ , t0 . dates ) ;

10 %% 现货价格。

11 t0 . Spot = t0 . Close − fts2mat ( dadj3 ( datestr ( t0 . dates ) ) ) ;12 %% 创建返回系列。

13 t r e t = ( t0 . Spot − l ag t s ( t0 . Spot , 1) ) ./ lagt s ( t0 . Spot , 1) ;14 t r e t = ch f i e l d ( tret , ’ Spot ’ , ’Return ’ ) ;15 %% Regress return s e r i e s against metric data .16 x1 = todai ly (x0) ;17 x1 . Const = 1;18 dcommon = int e r s e c t ( t r e t . dates , x1 . dates ) ;19 regts0 = [ t r e t ( datestr (dcommon) ) , x1( datestr (dcommon) ) ] ;20 f in i t e_regts0 = f ind ( a l l ( i s f i n i t e ( fts2mat ( regts0 ) ) , 2) ) ;21 regts1 = regts0 ( f in i t e_regts0 ) ;22 DataMatrix = fts2mat ( regts1 ) ;23 XCoeff = DataMatrix ( : , 2 :3) \ DataMatrix ( : , 1) ;24 RetPred = DataMatrix ( : , 2 : 3 ) * XCoeff ;25 t r e t . PredReturn ( datestr ( regts1 . dates ) ) = RetPred ;

http://www.ma-xy.com 50 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

26

4、绘制、计算结果1 subplot (2 , 1 , 1) ;2 plot ( t0 ) ;3 t i t l e ( ’ Spot and Closing Prices of Stock ’ ) ;4 subplot (2 , 1 , 2) ;5 plot ( t r e t ) ;6 t i t l e ( ’ Actual and Predicted Return of Stock ’ ) ;7 %% 计算股息率。

8 datestr (d0 . dates , 2)9 t1 = f i l l t s ( t0 , ’ nearest ’ ,d0 . dates ) ;

10 t1 . f req = ’d ’ ;11 tdr = d0 ./ fts2mat ( t1 . Close ( datestr (d0 . dates ) ) ) % Calculate the dividend

rate12

引入 - Quantmod(R package)

在 R 当中可用于金融数据实证研究的 R 包数量很多,目前在 CRAN 中的这些 R 包大多数侧重比较学术化的金融数据的计量研究²,比如著名的 Rmetrics 系列。quantmod³是 R 用于金融建模的扩展包,使用 R 做金融大数据处理几乎必用此扩展软件包,其主要功能有:从多个数据源获取历史数据、绘制金融数据图表、在金融数据图表中添加技术指标、计算不同时间尺度的

收益率、金融时间序列分析、金融模型拟合与计算等等。quantmod 可以从下面的来源加载数据:

• Yahoo! Finance (OHLC data)

• Federal Reserve Bank of St. Louis FRED® (11,000 economic series)

• Google Finance (OHLC data)

• Oanda, The Currency Site (FX and Metals)

• MySQL databases (Your local data)

• R binary(二进制的) formats (.RData and .rda)

• Comma Separated Value files (.csv)

• More to come including (RODBC,economagic,Rbloomberg,...)

下面,我们将简单介绍 quantmod 的一些函数并给出一个简单的示例,如果你想进一步了解quantmod,可以参考以下网址´。

示例:

²http://cran.r-project.org/web/views/Finance.html³http://www.quantmod.com´http://www.quantmod.com/examples/intro/ http://www.quantmod.com/examples/data/ http://www.quantmod.com/examples/charting/

http://www.ma-xy.com 51 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

1 i n s t a l l . package (“quantmod” )2 l i b ra ry (quantmod) # Load the package3 getSymbols ( ”AAPL”) # Download dai ly pr i ce s of Apple stock from Yahoo4 chartSer ie s (AAPL, theme=”white” ) # Plot the dai ly pr ice and volume5 chartSer ie s (AAPL) # Not shown giving the same plot with black background .6 getSymbols ( ”AAPL” , from=”2005−01−02” , to=”2010−12−31” )7 AAPL <− Delt (Cl ( get ( ”AAPL” , env = new . environment ) ) )8 length (AAPL[ which (AAPL > 0.02) , ] ) #查看AAPL涨跌幅超过2%的情况9 plot (AAPL[ which (AAPL > 0.02) , ] ) #画出AAPL涨跌幅超过2%的情况

10

一、ETL 类函数getSymbols(”AAPL”, src = ”yahoo”, from = ”2005-01-02”, to = ”2010-12-31”)其中,src可

以设置为“yahoo”、”google”、”FRED”、”Oanda”等。更为详细的 ETL 函数说明可以参考表(2.5)

表 2.5: ETL 函数说明

函数 作用 函数 作用

getSymbols() 从多种信息源里获得

信息

getSymbols.csv() 从 csv文件中读入数据

getDividends () 获取上市公司的股息

数据

getSymbols.FRED() 从 FRED 中获取数据

getFinancials () 获取上市公司的财务

报表

getSymbols.Google() 从 Google 中获取数据

getFX () 返获取汇率数据 getSymbols.MySQL() 从MySQL中获取数据getMetals () 获取重金属交易数据 getSymbols.oanda() 从 onada 中获取数据getSplits () 获取上市公司的拆股

数据

getSymbols.rda() 从 R 的二进制文件中获取数据

getOptionChain () 获取期权交易数据 getSymbols.SQLite() 从 SQLite 数据库中获取数据

getQuote () 获取即时的网络报价 getSymbols.yahoo() 从雅虎网中获取数据

补充:提取某种数据类型 (例如:开盘价,最高价等),有下列函数1 Op() #Open pr ice 开盘价2 Hi () #High pr ice 最高价3 Lo() #Low pr ice 最低价4 Cl () #Close pr ice 收盘价5 Vo() #volume 交易量6 Ad() #Adjusted pr ice 调整价格7 HLC()8 OHLC() #开盘价、最高价、最低价和收盘价9

二、展示类函数

http://www.ma-xy.com 52 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

1 barchart #条形图2 candlechart (AAPL, multi . co l = ’ true’ , theme = ”white” ) #蜡烛图3 l i nechar t () #线图4 chartSer ie s ( to . weekly (AAPL) , dn . co l = ”green” , up . co l = ”red” )5 addADX()6 addATR()7 addBBands()8 addCCI()9 addCMF()

10

三、分析类函数

1、is 族函数,判断某数据是否是某类型的数据,例如:1 i s .OHLC()2 i s .OHLCV()3 i s .BBO()4 i s .TBBO()5 i s .HLC()6

2、has 族函数,检查数据里面是否包含某类型的数据,例如:1 has .OHLC()2 has .HLC()3 has .OHLCV()4 has .Op()5 has . Hi ()6 has .Lo()7 has . Cl ()8 has .Vo()9 has .Ad()

10 has . Bid ()11 has . Price ()12 has .Qty()13 has . Trade ()14

四、计算类函数

http://www.ma-xy.com 53 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

函数 说明

to.weekly() 将 OHLC 数据转化为周数据to.monthly() 将 OHLC 数据转化为月数据Delt() 计算变化率

Lag() 求滞后 k 期Next() 求 k 个后first() 求前 k 个last() 求后 k 个findPeaks() 找出峰值

findValleys() 找出谷值

seriesIncr() 差分后大于限值的点

seriesDecr() 差分后小于限值的点

endpoints() 寻找节点

periodicity() 返回数据的日期范围

2.2.6 cell 和 struct 数据结构

cell 元胞数组

元胞数组和结构体数组是两种比较常见的数据类型,在一般的书籍中都有详细介绍,这里我

们仅简单介绍一下两个数组的构建方法以及可用的命令 (函数)。对于元胞数组而言,可以将其视为储物柜,每个储物柜 (cell 的单元) 可以存放不同类型的事物。但是,在进行单元提取时,我们应该注意是使用 () 还是 {} 来进行索引。cell 构建方法:直接赋值和工厂函数

1 cellname{ i , j } = {value}2 cellname = c e l l (m, n)3

其可用函数如下表

命令 说明 命令 说明

cellstr 字符型数组 mat2cell 将数值矩阵转变成为元胞数组

iscell 判断输入是否为元胞数组 num2cell 将数值数组转变成为元胞数组

cellfun 为元胞数组的每个元胞执行指定的函数 cell2struct 将元胞数组转变成为结构

celldisp 显示所有元胞的内容 struct2cell 将结构转变为元胞数组

cellplot 利用图形方式显示元胞数组 deal 将输入参数赋值给输出

cell2mat 将元胞数组转变成为普通的矩阵 length

http://www.ma-xy.com 54 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

struct 结构体数组

struct构建方法:直接赋值和工厂函数 (这里注意两个概念:域名 fieldname、域值 fieldvalue)1 s t ruct .name( i , j ) . f ieldname (m, n) = f i e l d value ;2 s t ruct .name = struct (‘ f ieldname’ , { f i e l dva lue } , … ) ;3

可用函数如下表所示

命令 说明 命令 说明

isstruct 确定输入是否为结构体数组 arrayfun 将函数应用于每个数组元素

fieldnames 结构体的字段名称或对象的公共字段 structfun 对标量结构体的每个字段应用函数

getfield 结构体数组字段 table2struct 将表转换为结构体数组

isfield 确定输入是否为结构体数组字段 struct2table 将结构体数组转换为表

orderfields 结构体数组的顺序字段 cell2struct 将元胞数组转换为结构体数组

rmfield 删除结构体中的字段 struct2cell 将结构体转换为元胞数组

setfield 向结构体数组字段分配值 sizecat 提取结构体数组值并按顺序排列 length

示例:

1 [Y1, Y2, . . . ] = deal ( structname ( i , j ) . fieldname1 , structname ( i , j ) . fieldname2 , . . . )2 Y1 = structname ( i , j ) . fieldname13 Y2 = structname ( i , j ) . fieldname24 s e t f i e l d ( structname , ’ f ieldname’ , f i e l dva lue )5 s e t f i e l d ( structname , { i , j } , ’ f ieldname’ , {m, n} , f i e l dva lue )6 s t ruct ( i , j ) . f ieldname (m, n) . fieldname = fieldname7

2.2.7 分类数组 Categorical Arrays

Categorical 数组用于处理分类数据 (就是市场调查中常见的数据类型)。对于分类数据,我们经常绘制一些变量的频数 (频率) 图、比例图 (饼图) 等等,而对于这种数据的分析,我们经常用到决策树分类、对应分析以及卡方检验等等。如果读者想进一步了解这种数据类型,可以参考

下面的网址µ。

µhttp://cn.mathworks.com/help/matlab/categorical-arrays.html

http://www.ma-xy.com 55 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

函数说明

命令 说明 命令 说明

categorical 创建分类数组 removecats 删除类别分类数组

iscategorical 确定输入是否分类数组 renamecats 重命名类别分类数组中

categories 类别的分类数组 reordercats 重新排序类别分类数组中

iscategory 测试类别分类数组 setcats 设置类别分类数组

isordinal 确定输入顺序分类数组 summary 打印的总结表或分类数组

isprotected 确定类别的分类数组受保护的 countcats 按类别分类数组元素的计数

addcats 添加类别分类数组 isundefined 发现未定义的元素分类数组

mergecats 合并类别分类数组

示例

此文档是 Categorical Arrays数据类的一个简单示例。Categorical数据类型是用来处理分类数据的,这种数据 (变量) 在市场调查中经常出现,变量的取值不是数值类型的,而是分类的 (例如:男、女)。下面,我们来简单示例 Categorical 数据类型的创建、索引和方法,我们仍然采用MATLAB 自带的数据 parents,这个数据集 (patients.mat 文件) 中包含的变量在 table 类中进行了介绍,这里不再继续介绍。

1、创建 categorical 类型1 clc , c l ea r2 load pat ients3 whos4 T = table (Age ,Gender , Height ,Weight , . . .5 SelfAssessedHealthStatus , Location , . . .6 ’RowNames ’ ,LastName) ;%创建 table变量7 T.Gender = categor i ca l (T.Gender) ;%创建 categor i ca l变量8 T. Location = categor i ca l (T. Location ) ;9 c l a s s (T. Location )

10 categor i e s (T. Location )%查看变量的分类11 C = T.Gender .*T. Location ;%categor i ca l变量合并12 C(1 :5 )13 categor i e s (C)14 T. SelfAssessedHealthStatus = categor i ca l (T. SelfAssessedHealthStatus , . . .15 { ’Poor ’ , ’ Fair ’ , ’Good ’ , ’ Excel lent ’ } , ’ Ordinal ’ , true ) ;16 rows = T. Location==’County General Hospital ’ & T.Gender==’Female ’ ;17 vars = { ’Age ’ , ’ Height ’ , ’Weight ’ } ;18 T1 = T(rows , vars ) ;19

2、绘制结果1 f i gu re2 histogram (T. Location (T. SelfAssessedHealthStatus <= ’ Fair ’ ) )3 t i t l e ( ’ Location of Patients in Fair or Poor Health ’ )

http://www.ma-xy.com 56 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

4 f i gu re5 pie (T. SelfAssessedHealthStatus ) ;6 t i t l e ( ’ S e l f Assessed Health Status From 100 Patients ’ )7 f i gu re8 A = countcats (T. SelfAssessedHealthStatus ) ;9 C = categor i e s (T. SelfAssessedHealthStatus ) ;

10 pareto (A, C) ;11 t i t l e ( ’ S e l f Assessed Health Status From 100 Patients ’ )12 X1 = Weight(T.Gender==’Female ’ ) ;13 Y1 = Height (T.Gender==’Female ’ ) ;14 X2 = Weight(T.Gender==’Male ’ ) ;15 Y2 = Height (T.Gender==’Male ’ ) ;16 f i gu re17 h1 = scat te r (X1,Y1, ’ o ’ ) ;18 hold on19 h2 = scat te r (X2,Y2, ’x ’ ) ;20 xlabe l ( ’Weight ( lbs ) ’ )21 ylabe l ( ’ Height ( in ) ’ )22 t i t l e ( ’ Height vs . Weight ’ )23

2.2.8 字符串 str

字符串操作函数

命令 说明

检测字符类

isstr 检测是否为字符串

ischar 检测字符串是否为字符数组

isletter 检测字符串中的英文字母

isspace 检测字符串中每个字符是否属于格式字符 (空格,回车等)isstrprop 检测字符串中符合特定范畴的字符

isequal 可用来比较两个字符数组是否相同

元胞数组类

cellstr 用于元胞数组元素为不定长字符串

char 转换元胞数组到字符数组,转换 ASCII 码到字符iscellstr 判断是否为元胞数组

sort 数组元素排序

intersect 数组交集,升序排列输出

ismember 判断是否为集合中的元素

setdiff 数组差集,升序排列输出

setxor 数组异或,即不属于数组交集的元素,升序排列输出

union 数组并集,升序排列输出

接下页表格……

http://www.ma-xy.com 57 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

(续表)unique 查找数组中独特的元素序列

字符操作类

strcat 字符串连接

strvcat 字符串垂直连接

strcmp 判断字符串是否相等

strncmp 判断两个字符串的前 n 个字符是否相等strcmpi 判断字符串是否相等,忽略大小写

strncmpi 判断两个字符串的前 n 个字符是否相等,忽略大小写strrep(s,s1,s2) 替换字符串 s 中的 s1 为 s2strfind(s,s1) 查找字符串 s 中串 s1 的位置findstr(s1,s2) 查找短字符串在长字符串中的位置

strtok(s,char) 对字符串 s 中首个 char 前后分割strmatch(patten,str) 检查 patten 是否和 str 最左侧部分一致regexp 正则表达式

regexpi 匹配正则表达式 (不分大小写)regexprep 使用正则表达式替换文本

regexptranslate 将文本转换为正则表达式

lower 转换字符串中的字母为小写

upper 转换字符串中的字母为小写

strjoin 加入文本数组

strsplit 分割字符串指定的分隔符

strjust 为字符串或字符数组

strtrim 删除前导和尾随空白字符串数组或字符数组

数据转换类

这一部分前面好像有

空格处理类

blanks 创建空格字符串

deblank 去除字符串尾部空格

strjust 字符串对齐

strtrim 去除字符串头尾空格,制表,回车符

格式字符类

eval eval 可以用来执行用字符串表示的表达式sprintf 按格式写数据到字符串

fprintf 按格式写数据到文件

sscanf 按格式从字符串中读取数

texlabel 把字符串转换成 tex 软件的格式接下页表格……

http://www.ma-xy.com 58 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

(续表)bitandbitorbitxorbitget 用来获取二进制的数位

bitset 设定某个二进制数位的值

bin2hex

函数示例及详细说明

待补充。。。

2.2.9 字符串数组 str array

这个数据类型有别于字符数组 char 和 cellstr。字符串 str 是 str array、char 和 cellstr 的基础,就像元素和集合的关系一样。为了对它们进行区别,你可以运行下面的命令进行研究,不过,

要创建 str array 你需要 R2016b 或者更高版本。1 clc , c l ea r2 st r1 = ’ i love matlab ’ %这是一个字符串3 st r2 = [ ’ I ’ ; ’ love ’ ; ’matlab ’ ] %这是字符数组,每一行必须具有相同的列数,不够以

空格填补

4 st r3 = char ( ’ i ’ , ’ love ’ , ’matlab ’ ) %这是字符数组, char函数会自动补充空格5 st r4 = { ’ i ’ , ’ love ’ , ’matlab ’} %在 c e l l s t r 中,每个单元可以是完全不同的内容,所以,不需要

补充空格。

6 st r5 = st r ing ({ ’ i ’ , ’ love ’ , ’matlab ’ })%创建字符串向量7 whos8

可用函数

命令 说明

string 创建字符串数组

strings 创建字符串数组 (with no characters)join 把字符串, 或合并两个表或时间表行使用关键变量newline 创建换行符

compose 将数据转换成格式化的字符串数组

sprintf 格式的数据转换成字符串

strcat 横向连接字符串

isstring 判断输入的字符串数组

strlength 字符串在字符串数组的长度

接下页表格……

http://www.ma-xy.com 59 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

(续表)symvar 确定符号变量表达式

contains 确定模式的字符串

count 计数模式的字符串

endsWith 确定字符串结尾的模式

startsWith 确定字符串开始的模式

replace 查找和替换字符串中的子字符串数组

replaceBetween 替换子字符串被马克的指标他们开始和结束

split 分割字符串在字符串数组, 或把日历时间数字和时间单位splitlines 在换行字符分割字符串

erase 删除字符串中的子字符串

eraseBetween 马克开始删除子字符串之间的指标和结束的子字符串

extractAfter 提取子字符串在指定的位置

extractBefore 提取子字符串在指定位置

extractBetween 马克开始提取子字符串之间的指标和结束的子字符串

insertAfter 后插入字符串指定的子串

insertBefore 插入字符串之前指定的子串

pad 领先或落后于字符添加到字符串

strip 删除前导和尾随字符的字符串

reverse 相反的顺序的字符在字符串

strtrim 删除前导和尾随空白字符串数组或字符数组

deblanklowerupperstrjust

示例

1 openExample( ’matlab/RepresentTextWithCharacterAndStringArraysExample ’ )2 openExample( ’matlab/AnalyzeTextDataExample ’ )3 openExample( ’matlab/TestForEmptyStringsAndMissingValuesExample ’ )4 openExample( ’matlab/SearchAndReplaceInStringAndCharacterArraysExample ’ )5 openExample( ’matlab/CompareSortAndCharacterizeTextExample ’ )6

正则表达式参考¶

¶http://cn.mathworks.com/help/matlab/matlab_prog/regular-expressions.html

http://www.ma-xy.com 60 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

2.2.10 timeseries

可用函数

timeseries 结构可用的函数如下表所示·

命令 说明

append 连接时间序列对象在时间维度

get 查询 timeseries 对象属性值getdatasamplesize 在 timeseries 数据样本对象的大小getqualitydesc 数据质量描述

getsamples 时间序列样本使用下标索引的子集数组

plot 情节时间序列

set timeseries 对象的设置属性tsdata.event timeseries 对象的构造事件对象timeseries 创建 timeseries 对象

添加或删除数据, 操纵 timeseries 对象addsample 添加数据样本 timeseries 对象delsample 将样品从 timeseries 对象detrend 减去均值或最佳线和 nan 从 timeseries 对象filter 时间序列的频率的内容

getabstime 提取的时间字符串时间矢量单元阵列

getdatasamples 返回的时间序列样本子集用下标索引数组

getinterpmethod 插值方法 timeseries 对象getsampleusingtime 样本中提取数据到新的 timeseries 对象idealfilter 理想 (因果) 滤波器应用于 timeseries 对象resample 选择或插入 timeseries 数据使用新的时间向量setabstime timeseries 的对象设置为日期字符串setinterpmethod 设置默认为 timeseries 对象插值法setuniformtime 修改统一时间 timeseries 对象的向量synchronize 同步和两个 timeseries 对象重新取样使用常见的时间向量

添加或删除事件, 创建新的 timeseries 对象基于事件数据addevent 添加事件 timeseries 对象delevent 删除 tsdata,事件对象从 timeseries 对象gettsafteratevent 新的 timeseries 对象和样本在或在事件发生gettsafterevent 新的 timeseries 对象和样本事件发生后gettsatevent 新的 timeseries 对象和样本发生的事件gettsbeforeatevent 新的 timeseries 对象和样本在事件发生之前或

接下页表格……·http://cn.mathworks.com/help/matlab/time-series-objects.html

http://www.ma-xy.com 61 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

(续表)gettsbeforeevent 新的 timeseries 对象和样本之前发生的事件gettsbetweenevents 新的 timeseries 对象和样本发生事件之间

时间序列集合

get(tscollection) 查询 tscollection 对象属性值isempty(tscollection) 确定 tscollection 对象是空的length (tscollection) 向量的时间长度

plot 情节时间序列

set(tscollection) tscollection 对象的设置属性size(tscollection) tscollection 对象的大小tscollection 创建 tscollection 对象addsampletocollection 添加示例 tscollection 对象addts timeseries 对象添加到 tscollection 对象delsamplefromcollection 将样品从 tscollection 对象getabstime(tscollection) 提取的时间字符串时间矢量单元阵列

getsampleusingtime(tscollection) 样本中提取数据到新的 tscollection 对象gettimeseriesnames 单元阵列 timeseries 对象的名称在 tscollection 对象horzcat(tscollection) 水平 tscollection 对象的连接removets 删除从 tscollection timeseries 对象对象resample(tscollection) 在 tscollection 使用选择或插入数据新的时间向量setabstime(tscollection) 设置 tscollection 对象日期字符串settimeseriesnames 改变 tscollection timeseries 对象的名称vertcat(tscollection) 垂直 tscollection 对象的连接

示例

此文档是 time series 数据类的一个简单示例。time seriesl 数据类型用来处理时间序列。下面,我们来简单示例 time seriesl 数据类型的创建、索引和方法,我们仍然采用 MATLAB 自带的数据集 count.mat,这是一个 24-by-3 matrix(矩阵),有一个三岔路,每一列表示每小时从一路上经过的车辆数,共 24 小时。当然,如果你想详细了解这个示例,可以参考下面网址¸。在下面

的例子中,你将会学到 ts 时间序列对象和方法:创建时间序列对象;观察时间序列对象;修改时间序列的单位和插值方法;定义事件;创建时间序列集合对象;重采样时间序列集合对象;添加

一个数据样本时间序列集合对象;删除和插值缺失的数据;移除一个时间序列的时间序列集合;

显示时间矢量值日期字符串;策划时间序列集合成员。

1、创建时间序列对象1 clc , c l ea r2 load count . dat

¸http://cn.mathworks.com/help/matlab/data_analysis/timeseriesobjects.html

http://www.ma-xy.com 62 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

3 count1 = t imeser i e s ( count ( : , 1 ) , 1 :24 , ’name ’ , ’ in te r s ec t i on1 ’ ) ;%创建 ts4 count2 = t imeser i e s ( count ( : , 2 ) , 1 :24 , ’name ’ , ’ in te r s ec t i on2 ’ ) ;5 count3 = t imeser i e s ( count ( : , 3 ) , 1 :24 , ’name ’ , ’ in te r s ec t i on3 ’ ) ;6 get ( count1 ) %查看属性/Query t imeser i e s object property values7 count1 . DataInfo8 count1 . DataInfo . Units = ’ cars ’ ;9 count1 . DataInfo . Interpo lat ion = tsdata . inte rpo lat ion ( ’ zoh ’ ) ;

10 count1 . DataInfo11 count1 . TimeInfo . Units = ’ hours ’ ;12 count2 . TimeInfo . Units = ’ hours ’ ;13 count3 . TimeInfo . Units = ’ hours ’ ;14

2、定义事件1 %Add two events to the data that mark the times of the AM commute and PM commute .2 e1 = tsdata . event ( ’AMCommute’ ,8) ;3 e1 . Units = ’ hours ’ ; % Speci fy the units fo r time4 count1 = addevent ( count1 , e1 ) ; % Add the event to count15 count2 = addevent ( count2 , e1 ) ;6 count3 = addevent ( count3 , e1 ) ;7 %构造并添加第二个事件。 第二个事件发生在下午6点。8 e2 = tsdata . event ( ’PMCommute’ ,18) ;9 e2 . Units = ’ hours ’ ; % Speci fy the units fo r time

10 count1 = addevent ( count1 , e2 ) ; % Add the event to count111 count2 = addevent ( count2 , e2 ) ;12 count3 = addevent ( count3 , e2 ) ;13 f i gu re14 plot ( count1 )15 plot ( count2 )16 hold on17 plot ( count3 )18

3、创建时间序列集合对象1 tsc = t s c o l l e c t i on ({ count1 count2 } , ’name ’ , ’ count_coll ’ )2 tsc = addts ( tsc , count3 )3

4、重采样时间序列集合对象1 tsc1 = resample ( tsc , 1 : 2 : 2 4 )2 tsc1 = resample ( tsc , 1 : 0 . 5 : 2 4 )3 hold o f f4 plot ( tsc1 . intersect ion1 , ’−xb ’ , ’Displayname ’ , ’ In te r sec t ion 1 ’ )5 hold on6 plot ( tsc1 . intersect ion2 , ’−.xm’ , ’Displayname ’ , ’ In te r sec t ion 2 ’ )7 plot ( tsc1 . intersect ion3 , ’ : xr ’ , ’Displayname ’ , ’ In te r sec t ion 3 ’ )8 legend ( ’show ’ , ’ Location ’ , ’NorthWest ’ )9

5、时间序列集合对象操作1 tsc1 = addsampletocol lection ( tsc1 , ’ time ’ , 3 . 2 5 , . . .

http://www.ma-xy.com 63 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

2 ’ i n t e r s ec t i on1 ’ ,5) ; %添加一个数据样本到时间序列集合对象3 tsc1 = delsamplefromcol lect ion ( tsc1 , ’ index ’ , . . .4 f ind ( isnan ( tsc1 . in te r s ec t i on2 .Data) ) ) ; %删除缺失的数据5 tsc1 = addsampletocol lection ( tsc1 , ’ time ’ , 3 . 2 5 , . . .6 ’ i n t e r s ec t i on1 ’ ,5) ; %插值缺失的数据7 tsc1 = resample ( tsc1 , tsc1 .Time) ;8 tsc1 = removets ( tsc1 , ’ in te r s ec t i on3 ’ ) %移除一个时间序列9 tsc1 . TimeInfo . Units = ’ hours ’ ;

10 tsc1 . TimeInfo . StartDate = ’25−DEC−2009 00:00:00 ’ ;11 tsc1 . in te r s ec t i on1 . DataInfo . Units = ’ car count ’ ;12 tsc1 . in te r s ec t i on2 . DataInfo . Units = ’ car count ’ ;13 hold o f f14 plot ( tsc1 . in te r s ec t i on1 ) ;15 plot ( tsc1 . intersect ion1 , ’−xb ’ , ’Displayname ’ , ’ In te r sec t ion 1 ’ )16 hold on17 plot ( tsc1 . intersect ion2 , ’−.xm’ , ’Displayname ’ , ’ In te r sec t ion 2 ’ )18 legend ( ’show ’ , ’ Location ’ , ’NorthWest ’ )19 tsc1 . TimeInfo . Units = ’ hours ’ ;20 tsc1 . TimeInfo . Format = ’HH:MM’ ;21 hold o f f22 plot ( tsc1 . intersect ion1 , ’−xb ’ , ’Displayname ’ , ’ In te r sec t ion 1 ’ )23 % Prevent overwrit ing plot , but remove axis l abe l s and t i t l e .24 hold on25 plot ( tsc1 . intersect ion2 , ’−.xm’ , ’Displayname ’ , ’ In te r sec t ion 2 ’ )26 legend ( ’show ’ , ’ Location ’ , ’NorthWest ’ )27 xlabe l ( ’Time ( hours ) ’ )28 ylabe l ( ’ car count ’ )29 grid on30

2.2.11 time table

可用函数

time table 结构可用的函数如下¹

¹http://cn.mathworks.com/help/matlab/timetables.html

http://www.ma-xy.com 64 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

命令 说明 命令 说明

timetable 从工作空间变量创建时间表 vartype 下标变量类型的表或时间表

lag 节省时间数据的时间表 rmmissing 删除丢失的条目

table2timetable 转换表的时间表 issorted 判断数组进行排序

array2timetable 将数组转换为时间表 sortrows 行数组排序、表或时间表

timetable2table 时间表转换为表 unique 独特的数组中的值

istimetable 确定输入时间表 withtol 时间对时间表行加下标

isregular 确定在时间表是否正常 timerange 时间范围为时间表行加下标

retime 重新取样或聚合数据的时间

表, 并解决重复或不规则的次synchronize 同步时间表常见时间向量, 并

重新取样或聚合数据从输入

时间表

示例

此文档是 timetable 数据类的一个简单示例。timetable 是在 R2016b 中新加的数据类型,是ts 和 table 的合并。下面,我们将简单介绍这种数据类型的构建、索引及方法,如果读者想要详细学习这种数据类型,你可以访问网址º,当然,如果你已经拥有 MATALB2016b 版本或者更高版本,你可以在命令窗口输入下面命令进行学习

1 openExample( ’matlab/CleanTimetableWithMissingDuplicateOrIrregularTimesExample ’ )2 openExample( ’matlab/ResampleAndAggregateDataInTimetableExample ’ )3 openExample( ’matlab/CombineTimetablesAndSynchronizeTheirDataExample ’ )4 openExample( ’matlab/SubscriptIntoTimesOfTimetableExample ’ )5

我们的示例仍然采用 MATLAB 自带的数据,我们采用 indoors.csv 和 outdoors.mat 两个数据集进行示例。

1、创建 timetable1 indoors = readtable ( f u l l f i l e (matlabroot , ’ examples ’ , ’matlab ’ , ’ indoors . csv ’ ) ) ;2 indoors = table2t imetable ( indoors ) ;%数据类型转换3 load ( f u l l f i l e (matlabroot , ’ examples ’ , ’matlab ’ , ’ outdoors ’ ) ) ;4 TF = i s r egu l a r ( outdoors )5 dt = unique ( d i f f ( outdoors .Time) )6 TT = retime ( outdoors , ’ da i ly ’ , ’mean ’ ) ;%’ hourly ’ , ’ nearest ’ / ’ spl ine ’7 tv = datetime (2015 ,11 ,15) : hours (6) : datetime (2015 ,11 ,18) ;8 tv . Format = ’dd−MMM−yyyy HH:mm: ss ’ ;9 TT = retime ( outdoors , tv , ’mean ’ ) ;

10 TT(1 : 5 , : )11

2、索引ºhttp://cn.mathworks.com/help/matlab/timetables.html

http://www.ma-xy.com 65 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

1 t t = synchronize ( indoors , outdoors ) ;%合并2 %索引 : http :// cn .mathworks . com/help/matlab/matlab_prog/access−data−in−a−table . html3 summary( tt )4 t t .Time(1 :5 )%行列索引5 TR = timerange ( ’2015−11−16 ’ , ’2015−12−31 ’ ) ;6 TT2 = tt (TR, : ) ;%时间索引7 TT2(end−4:end , : )8 t t ({ ’2015−11−16 12:18:00 ’ , ’2015−12−31 21:15:00 ’ } , : )%时间索引9 rowTimes = { ’2002−02−01 ’ , ’2003−02−07 ’ } ;

10 S = withtol (rowTimes , days (1) ) ;11 t t (S , : )12 S = vartype ( ’ numeric ’ ) ;13 TT2 = tt ( : , S) ;14 A = TT2. Variables ;15 A(1 : 5 , : )16 A = tt ( : , vartype ( ’ numeric ’ ) ) . Variables ;17 A(1 : 5 , : )18

3、合并及绘图1 ttLinear = synchronize ( indoors , outdoors , ’ union ’ , ’ l i n ea r ’ ) ;2 ttHourly = retime ( ttLinear , tv , ’mean ’ ) ;3 ttHourly = rmmissing ( ttHourly ) ;4 ttMeanVars = ttHourly . Variables ./mean( ttHourly . Variables ) ;5 plot ( ttHourly .Time , ttMeanVars ) ;6 legend ( ttHourly . Propert ies . VariableNames , ’ Interpreter ’ , ’ none ’ ) ;7 xlabe l ( ’Time ’ ) ;8 ylabe l ( ’Normalized Weather Measurements ’ ) ;9 t i t l e ( ’Mean Daily Weather Trends ’ ) ;

10

2.2.12 向量化操作函数

matlab 向量化操作函数

wikipedia中的向量化操作的定义是:Vectorization is the more limited process of convertinga computer program from a scalar implementation, which processes a single pair of operands ata time, to a vector implementation which processes one operation on multiple pairs of operandsat once。向量化计算是一种特殊的并行计算的方式,相比于一般程序在同一时间只执行一个操作的方式,它可以在同一时间执行多次操作,通常是对不同的数据执行同样的一个或一批指令,或

者说把指令应用于一个数组/向量»。

从 MATLAB7.0 开始,陆续增加了一些向量化函数,使用这些函数可以减少很多循环的使用,在保证代码运行效率的前提下,使代码更加简洁。需要说明的是,很多情况下,使用这些函

数的运行效率并不比恰当使用循环快多少,使用它们主要是为了提高开发效率,使代码更加简

洁。对于 MATLAB向量化操作函数,我们将介绍以下九个函数:1.arrayfun;2.bsxfun;3.cellfun;4.structfun;5.spfun;6.splitapply;7.varfun;8.rowfun;9.accumarray。

»http://blog.itpub.net/7768182/viewspace-1121259/

http://www.ma-xy.com 66 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

1 %% arrayfun2 %对 array中的每个分量进行操作3 s (1) . f1 = rand (3 , 6) ;4 s (2) . f1 = magic (12) ;5 s (3) . f1 = ones (5 , 10) ;6 counts = arrayfun (@(x) numel(x . f1 ) , s ) %计算个数7 [ nrows , ncols ] = arrayfun (@(x) s i z e (x . f1 ) , s ) %把 s中的每个分量作为x输入到@(x) s i z e (x .

f1 )8 averages = arrayfun (@(x) mean(x . f1 ) , s , ’UniformOutput ’ , f a l s e )%因为输出字符向量是

nonscalar,故设置 UniformOutput 为 f a l s e。9 [ J , I ] = meshgrid (1 :10) ;

10 a = arrayfun (@( i i , j j ) dblquad (@(u , v) s in (u)* sqrt (v) , 0 , i i , 0 , j j ) , I , J) ;11 %% bsxfun Introduced in R2007a12 %对矩阵的列/行进行操作13 A = [1 2 10; 3 4 20; 9 6 15 ] ;14 C = bsxfun (@minus , A, mean(A) ) ;%A的每一列减去mean(A)15 D = bsxfun (@rdivide , C, std (A) ) ;%等价于 (A − mean(A) ) ./ std (A)16 fun = @(a , b) a − exp(b) ;17 a = 1 : 7 ;18 b = pi *[0 1/4 1/3 1/2 2/3 3/4 1 ] . ’ ;19 C = bsxfun ( fun , a , b)20 %% ce l l f un21 %对 c e l l中的每个元素进行操作22 C = {1:10 , [ 2 ; 4 ; 6 ] , [ ] } ;23 [ nrows , ncols ] = ce l l f un (@size , C)24 days = { ’Monday ’ , ’Tuesday ’ , ’Wednesday ’ , ’Thursday ’ , ’ Friday ’ } ;25 abbrev = ce l l f un (@(x) x (1 :3 ) , days , ’UniformOutput ’ , f a l s e )%因为输出字符向量是

nonscalar,故设置 UniformOutput 为 f a l s e。26 c1 = rand (5 ,1) ; c2 = rand (10 ,1) ; c3 = rand (15 ,1) ;27 d1 = rand (5 ,1) ; d2 = rand (10 ,1) ; d3 = rand (15 ,1) ;28 C = {c1 , c2 , c3 } ;29 D = {d1 , d2 , d3} ;30 covCD = ce l l f un (@cov , C, D, ’UniformOutput ’ , f a l s e )31 %% struct fun32 %对 s t ruct中的每个元素进行操作,可以将每个元素看作x,带入@(x)33 s . f1 = ’Sunday ’ ;34 s . f2 = ’Monday ’ ;35 s . f3 = ’Tuesday ’ ;36 s . f4 = ’Wednesday ’ ;37 s . f5 = ’Thursday ’ ;38 s . f6 = ’ Friday ’ ;39 s . f7 = ’ Saturday ’ ;40 lengths = struct fun (@numel , s )41 shortNames = struct fun (@(x) ( x (1 :3 ) ) , s , ’UniformOutput ’ , f a l s e )42 %% spfun43 %对稀疏矩阵的每个元素进行操作44 S = spdiags ( [ 1 : 4 ] ’ , 0 , 4 , 4)45 f = spfun (@exp , S)46 %% spl i tapp ly 分组统计

47 %将 X 划分为 G 指定的组,并向每个组应用函数 func。48 load pat ients49 G = findgroups (Gender) ;50 sp l i tapp ly (@mean, Height , G)

http://www.ma-xy.com 67 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

51 func = @(x , y) var (x−y) ;52 [G, smokers ] = findgroups (Smoker) ;53 varBP = spl i tapp ly ( func , Systo l i c , Diasto l ic , G)54 T = table ( smokers , numPatients , varBP)55 mystats = @(x) [min(x) median(x) max(x) ] ;56 G = findgroups (Gender , Smoker) ;57 Y = spl i tapp ly (mystats , Weight , G)58 DT = table (Height , Weight) ;59 GT = table (Gender , Smoker) ;60 meanBMIFcn = @(h ,w)mean((w ./ (h .^2) ) * 703) ;61 [G, r e su l t s ] = findgroups (GT) ;62 meanBMI = spl i tapp ly (meanBMIFcn, DT, G) ;63 r e su l t s .meanBMI = meanBMI64 %% varfun Introduced in R2013b65 %向表 A 的每个变量应用函数 func,并在表 B 中返回值。66 A = table ( [0.71;−2.05;−0.35;−0.82;1.57] , [ 0 . 23 ; 0 . 12 ; −0 . 18 ; 0 . 23 ; 0 . 41 ] )67 func = @(x) x .^2 ;68 B = varfun ( func , A)%列操作69 A = table ({ ’ test2 ’ ; ’ tes t1 ’ ; ’ tes t2 ’ ; ’ tes t3 ’ ; ’ tes t1 ’ } , . . .70 [ 0 .71 ;−2 .05 ;−0 .35 ;−0 .82 ;1 .57 ] , [0 .23 ;0 .12 ;−0 .18 ;0 .23 ;0 .41 ] )71 func = @mean;72 B = varfun ( func , A, ’ GroupingVariables ’ , ’Var1 ’ )73 %% rowfun Introduced in R2013b74 %将函数 func 应用于表 A 的每行并在表 B 中返回结果75 x = ga l l e ry ( ’ integerdata ’ , 10 , [ 5 , 1 ] , 2) ;76 y = ga l l e ry ( ’ integerdata ’ , 10 , [ 5 , 1 ] , 8) ;77 A = table (x , y)78 B = rowfun (@hypot , A, ’OutputVariableNames ’ , ’ z ’ )79 g = ga l l e ry ( ’ integerdata ’ , 3 , [ 15 , 1 ] , 1 ) ;80 x = ga l l e ry ( ’ uniformdata ’ , [ 15 , 1 ] , 9 ) ;81 y = ga l l e ry ( ’ uniformdata ’ , [ 15 , 1 ] , 2 ) ;82 A = table (g , x , y)83 func = @(x , y) mean(x−y) ;84 B = rowfun ( func , A, . . .85 ’ GroupingVariable ’ , ’ g ’ , . . .86 ’OutputVariableName ’ , ’MeanDiff ’ )87 %% accumarray88 %使用下标 subs 累积矢量 val 的元素来返回数组 A89 %生成一个100000×1的向量,找出哪些元素出现 (各元素及其频数 )90 c = unique ( unidrnd (200000 , 100000 , 1) ) ;91 d = accumarry (( unidrnd (200000 , 100000 , 1) , 1 , [200000 , 1 ] ) ;92 e = f ind (a)93 %在1000×1000的正方形区域随机生成100000个点,计算每个坐标点上生成点的个数94 P = unidrnd (1000 , 100000 , 2) ;95 a = accumarry ((p , 1 , [1000 , 1000]) ;96 %1000人,身高分布在170−180,体重在110−200,年龄在20−50,计算身高体重相同的人的平均年

97 Height = unidrnd (10 , 1000 ,1) + 170;98 Weight = unidrnd (90 , 1000 , 1) + 110;99 Age = unidrnd (30 , 1000 , 1) + 20;

100 m0 = accumarray ( [ height , weight ] , age , [ ] , @mean)101

http://www.ma-xy.com 68 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

引入 - Python 和 R 中的向量化函数

R 中的向量化函数 我们将简单介绍 R 中的向量化函数 apply 族函数以及 plyr 包和 reshape包。

(1)applay 函数族包括了 apply、sapply、lappy、tapply、mapply、sweep、aggregate, by 等函数:

1、apply:是处理矩阵/数组的,并逐行或逐列进行操作,内置 (底层) 为循环计算。Eg:apply(matrix, 1, mean) # 计算 matrix 每行 (dim = 1) 的均值# 注:对于矩阵还可以用 colMeans、rowMeans、colSums,、rowSums 做行列运算2、lapply:是处理向量/列表/其它对象,返回列表形式 list。Eg:lapply(data.frame, FUN = function(x) list(median = median(x), sd = sd(x)))#计算 data.frame每列的中位数和标准差

3、sapply:类似于 lapply,但其返回为矩阵,等价于 unlist(lapply())。Eg:sapply(data.frame, FUN = function(x) list(median = median(x), sd = sd(x)))4、tapply:是专门用来处理分组数据的 (属性数据)。Eg:tapply(Sepal.Width, index = Species, FUN = mean) # 计算三种花瓣萼片宽度的均值5、aggreate:与 tapply 功能非常相似,其输出是更为友好的数据框格式。6、by 和上面两个函数 aggreate 与 tapply 是出于一处的。7、replicate:将某个函数重复运行 N 次,常用来生成较复杂的随机数。8、vectorize:能将一个不能进行向量化运算的函数进行转化,使之具备向量化运算功能。9、maaply:是 sapply 的变形,将 fun 依次依次应用于每一个参数的第一个元素、第二个元素…Eg:mapply(fun = rep, times = 1:4, x = 4:10, moreArgs = Null, simplify = true, rse.names =true)10、aaply:plyr 包函数。Eg:a = matrix(1:21, nrow = 3, ncol = 7) b = aaply(a, .margins = 2, .fun = mean)# 对 a 的每列求均值

(2)plyr 包¼:

plyr 包的作者是 RICE 大学统计学的助理教授 Hadley Wickham,至今为止,他已经研发了17 个 R 包,包括 ggplot2、rggobi、profr 和 plyr。作者对于 plyr 包的描述为“plyr,a packagethat generalises and standardises the apply family of functions for problems that require you tosplit up a large data structure into multiple pieces, apply a function to each piece and then jointhe pieces back together”(把一个庞大的数据结构拆分成多个片段,然后分别对这些片段应用函数,然后再把片段函数结构组合起来½)。需要指出的是,当数据量比较大时,plyr 包的运算效率不理想。

上面介绍的 aaply() 是 plyr 包中处理 array 的函数,还有处理 list、data.frame 的函数,汇总起来如下表 (2.9),所有的函数具有 xyply 的形式,其中 x 表示数据数据类型,y 表示输出数

¼http://plyr.had.co.nz/09-user/½http://plyr.had.co.nz/09-user

http://www.ma-xy.com 69 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

据类型¾。

表 2.9: plyr 包处理函数

arrary data.frame list discarded

arrary aaply adply alply a_plydata.frame daply ddply dlply d_plylist laply ldply llply l_ply

Python 中的向量化操作函数 map和 reduce是 Google三驾马车之一,我们可以将 apply视为map,将矢量相乘视为 reduce。下面,我们来介绍 python 的向量化编程函数 map 和 reduce(可以参考《Python 核心编程 (第二版)》宋吉广译 P286-P292)。

1、map的格式为 map( func, seq1[, seq2...] )。Python函数式编程中的 map()函数是将 func作用于 seq 中的每一个元素,并用一个列表给出返回值。如果 func 为 None,作用同 zip()。当seq只有一个时,将 func函数作用于这个 seq的每个元素上,得到一个新的 seq。下图 (2.1)说明了只有一个 seq 的时候 map() 函数是如何工作的 (本文图片来源:《Python 核心编程 (第二版)》宋吉广译)。

图 2.1: map 函数加工过程

可以看出,seq 中的每个元素都经过了 func 函数的作用,得到了 func(seq[n]) 组成的列表。1 print map( lambda x : x%3, range (6) ) #返回 [ 0 , 1 , 2 , 0 , 1 , 2 ] #得到一个列表中数字%3

的余数

2

并且当 seq 多于一个时,map 可以并行地对每个 seq 执行,如下图 (2.2) 所示的过程¾http://www.jianshu.com/p/bfddfe29aa39

http://www.ma-xy.com 70 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

图 2.2: map 对每个 seq 的执行过程

也就是说每个 seq 的同一位置的元素在执行过一个多元的 func 函数之后,得到一个返回值,这些返回值放在一个结果列表中。

1 print map( lambda x , y : x * y , [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ) #返回 [ 4 , 10 , 18]#求两个列表对应元素的积

2

上面的返回值是一个值的情况,实际上也可以是一个元组。下面的代码不仅实现了乘法,也

实现了加法,并把积与和放在一个元组中。

1 print map( lambda x , y : ( x * y , x + y) , [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ) # 返回 [ ( 4 , 5) , (10 ,7) , (18 , 9) ]

2

下面再列举 3 个例子进行说明示例 1:对可迭代函数’iterable’ 中的每一个元素应用‘function’方法,将结果作为 list 返回。

1 def add100(x) :2 return x+1003 hh = [11 ,22 ,33 ]4 map(add100 , hh)5 #返回: [111 , 122 , 133]6

示例 2:如果给出了额外的可迭代参数,则对每个可迭代参数中的元素‘并行’的应用‘function’1 def abc (a , b , c ) :2 return a*10000 + b*100 + c3 l i s t 1 = [11 ,22 ,33 ]4 l i s t 2 = [44 ,55 ,66 ]5 l i s t 3 = [77 ,88 ,99 ]6 map(abc , l i s t 1 , l i s t 2 , l i s t 3 )7 #返回: [114477 , 225588 , 336699]8

示例 3:如果’function’ 给出的是‘None’,自动假定一个‘identity’函数 (相当于压缩)1 l i s t 1 = [11 ,22 ,33 ]2 l i s t 2 = [44 ,55 ,66 ]3 l i s t 3 = [77 ,88 ,99 ]

http://www.ma-xy.com 71 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

4 map(None , l i s t 1 , l i s t 2 , l i s t 3 )5 #返回: [ ( 11 , 44 , 77) , (22 , 55 , 88) , (33 , 66 , 99) ]6

2、reduce 的格式为:reduce( func, seq[, init] )。reduce 函数即为递归,它是这样一个过程:每次迭代将上一次的迭代结果 (第一次时为 init 的元素,如没有 init 则为 seq 的第一个元素) 与下一个元素一同执行一个二元的 func 函数。在 reduce 函数中,init 是可选的,如果使用,则作为第一次迭代的第一个元素使用。下图 (2.3) 展现了 reduce 函数的工作过程

图 2.3: reduce 函数的工作过程

示例 1:阶乘1 print reduce (( lambda x , y : x * y) , range (1 , 5 + 1) ) #返回120是5的阶乘, (1) *2) *3) *4)*52

示例 2:连加1 print reduce (( lambda x , y : x + y) , range (5) ) #返回10,是 (0)+1)+2)+3)+4)+52

2.2.13 引入 - R 和 Python 的基本数据结构

表 (2.10) 给出了 R 和 Python 的基本数据结构,读者可将未列举的数据结构填补在表中。

http://www.ma-xy.com 72 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二章 MATALB 数据结构 2.2 MATLAB 数据类型/对象

表 2.10: R 和 Python 的基本数据结构

R Python

矩阵 matrix 字符串 str/””数组 array 列表 list/[]列表 list 元组 tuple/()数据框 data.frame 字典 dict/{}因子 factor 集合 setfrozenset时间序列 ts 数组 ndarray类 class 时间序列 series因子对象的连续性泛化 single 数据表 DataFrame字符串 ”” 数据集 Panel

2.2.14 dataset

可参见网址http://cn.mathworks.com/help/stats/dataset.html?s_tid=gn_loc_drop。不过,在高版本的 matlab 中,这个数据结构将被抛弃。

http://www.ma-xy.com 73 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om2.2 MATLAB 数据类型/对象 第二章 MATALB 数据结构

http://www.ma-xy.com 74 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第三章 MATLAB 控制与函数

3.1 MATLAB 函数

3.1.1 函数变量及一些有用的函数

1 nargin %在函数内,用于获取实际输入总量2 nargout %在函数内,用于获取实际输出总量3 nargin ( ’ fun ’ ) %返回 fun函数输入参数的数量4 nargout ( ’ fun ’ ) %返回 fun函数输出参数的数量5 inputname(n) %在函数内使用,给出第n个输入总量的实际调用变量名6 Nargchk () %检查输入的参数个数是否符合指定的范围7 msgstr = nargchk (minargs , maxargs , numargs , ’ s t r ing ’ ) %minargs和maxargs分别为参数个数的

最小值最大值,numargs为求得的输入项的项数,可直接为函数 nargin如果输入变量个数超出范围,则返回错误信息;如果变量个数在范围内则返回空矩阵。

8 %% 函数可变参数的输入/输出: varargin/varargout9 function y = myfunction vararg ( varargin )

10 temp = 011 f o r i = 1: length ( varargin )12 temp = temp+mean( varargin{ i } ( : ) ) ;13 end14 y = temp/ length15 end16 % 基本语法: function [ y1 , y2 ] = func (a , b , varargin )17

3.1.2 匿名函数 (anonymous function)

匿名函数的格式:函数 = @(指定的自变量) 函数表达式,例如1 f = @(x) x^2 %表示 f (x)=x^22 f = @(x) x .^23 fx = f (1 :10) %批量赋值,x为向量的形式,需要点乘4 f = @(x , y)x .^2 + y .^2 ; %需要点乘5

多层嵌套匿名函数

1 f=@(a , b) @(x) a*x^2+b*x+1 %当参数a,b为未知数时,则需要用多层嵌套的匿名函数来表示。2 syms x ; %定义符号变量3 f=(x+tan (x) ) ^( s in (x) ) ; %定义表达式

75

http:/

/www.m

a-xy.c

om3.1 MATLAB 函数 第三章 MATLAB 控制与函数

4 c=d i f f ( f , s ) %求 f的3阶导数的表达式 >> f3=eval ( [ ’@(x) ’ vector i ze ( c ) ] ) ; %vector i ze函数的功能是使内联函 数适合数组运算的法则。

5

3.1.3 私有函数

private 函数是具有访问限制的函数,对应的 M 文件保存在名为“private”的文件下。因为一般的 matlab 函数是全局可见的,而 private 函数只能被 private 文件夹所在文件夹中的函数调用。

1 help private /myprivfun2

3.1.4 重载函数

一种情况下输入的几个参数为双精度浮点型,一种情况下为整型。编写两个同名函数,MAT-LAB 会根据实际输入数据类型选择函数,但要求将函数放在不同文件夹下,文件夹名称以 @ 开头,然后写数字类型,例如:@double、@int32 matlab 的函数重载是通过检查函数调用时输入输出的项数来实现。nargin 和 nargout 分别返回它所在函数当前被调用时实际输入的项数。

3.1.5 内联函数 - inline

inline 用于创建 inline 对象,在 matlab 中创建局部函数时,可用 inline。在运用中有几点限制:不能调用另一个 inline 函数,只能由一个 matlab 表达式组成,并且只能返回一个变量 (显然不允许 [u, v] 这种形式)。因而,任何要求逻辑运算或乘法运算以求得最终结果的场合,都不能应用 inline。inline 调用格式如下:

1 i n l i n e ( ’ express ion ’ , ’ arg1 ’ , ’ arg2 ’ , . . . , ’ argn ’ );2 char ( inc l ine func ) %转化为字符串3 argnames ( inc l ine func ) %转化为字符串4 formula (_func) %返回计算公式 express ion5 vector i ze (_func) %在函数中引入向量操作,需为点乘6

3.1.6 MATLAB 函数句柄 - Function handle

包含了函数的路径、函数名、类型以及可能存在的重载方法;创建函数句柄的语法:fhandle= @function_filename。例如

1 fhandle = @sin %创建了 s in的句柄2 y = fhandle ( pi ) %调用函数句柄, fhandle ( pi )其实就是 s in ( pi )。3

feval函数的最通常的应用是以下形式:feval(’functionname’, parameter)。例如:计算 sin(2),可直接用命令 y = sin(2);还可以用的方式有:y = feval(’sin’,pi/4);或者 h = @sin;y=feval(h,pi/4);或者直接写成 y = feval(@sin, pi/4)。

http://www.ma-xy.com 76 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第三章 MATLAB 控制与函数 3.2 控制语句

3.1.7 M 文件一般结构

MATLAB 中 M 文件有两种类型,脚本 M 文件和函数 M 文件。对于函数文件,一个 M 文件只能定义一个总函数,即第一句 function 所定义的函数,而且整个 M 文件在外部使用时表现出来的也只有这一个函数。如果需要多个函数嵌套,与其定义顺序无关。

3.1.8 伪码文件—P 文件 (M 文件保护文件)

当第一次执行 M 文件时,函数中的命令将被翻译成内部伪码格式储存在内存中,以提高后续的调用速度。伪码文件后缀为 *.P,命名同 *.M 文件。

1 pcode . f i lename %在当前目录下创建 f i lename . p文件2 pcode ( fun , ’−inplace ’ ) %在当前目录下创建 f i lename . p文件3 c l ea r f i lename %清除内存中的 f i lename . p文件4 c l ea r funct ions %清除内存中的p文件5

3.1.9 引入 - Python 和 R 中的函数

待补充。。。

3.2 控制语句

3.2.1 MATLAB 控制语句

分支判断语句 (if-else-end 结构)

(1) 如果是…那么…1 i f express ion %逻辑表达式2 commands %命令/程序3 end4

(2) 如果是…那么…,否则…1 i f express ion2 commands1 %如果条件为真则执行commands13 e l s e4 commands2 %如果条件为假则执行commands25 end6

(3) 如果可选择的执行命令组有多组,则调用下面结构1 i f expression12 commands1 %如果条件 expression1为真则执行commands13 e l s e i f expression24 commands2 %如果条件 expression2为真则执行commands25 . . .

http://www.ma-xy.com 77 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om3.2 控制语句 第三章 MATLAB 控制与函数

6 e l s e7 commandsn %如果前面的所有条件都不满足就执行最后一条8 end9

分支选择语句 (switch - case)

计算 expression,如果结果为 case* 后的 value* 时,则执行对应的 commands1 switch express ion2 case test13 commands14 case test25 commands26 . . .7 otherwise8 commandsn %如果所有的条件都不满足就执行这条命令9 end

10

循环控制语句

第一种循环-for 循环1 f o r . . .2 end3

第二种循环-while 循环1 while express ion %直到逻辑否时,退出循环2 end3

尝试控制 (try - catch)

1 try2 command1 %尝试执行command1,若正确,则 catch下的命令组将不会被执行3 catch4 command2 %如果command1命令组执行出错了,该命令组将被执行5 end6

如果在 catch 下的 command2 的命令组的执行过程也出错了,那么 Matlab 将停止运行。1 try2 command1 %尝试执行command1,若出错end后的信息仍然可以执行3 end4 try5 command1 %尝试执行command1,若正确,则 catch下的命令组将不会被执行6 catch error %如果command1命令组执行出错了,记录错误到 error,并执行command27 command2

http://www.ma-xy.com 78 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第三章 MATLAB 控制与函数 3.2 控制语句

8 end9

其它命令

1 pause %暂停2 pause %暂停执行文件,等待用户按任意键继续3 pause (n) %在继续执行文件之前,暂停n秒4 pause on/ o f f%允许/不允许后面程序暂停5 l a s t e r r %可以显示matlab系统判断的最新出错原因。6 lastwarn %可以显示matlab系统给出的最新警告程序并继续运行。7 break %跳出循环体,执行end后面的语句。如果是多层循环 ( fo r fo r fo r ),break只能跳

出其所在的\\循环,如果break在最外层循环,则跳出所有循环。用在分支中 ( switch . . . case )即不执行此分支\\块的下面的语句。但执行end后的语句。

8 return %终止 (就是直接退出程序或函数返回了 )9 error using %调用某函数出错 (函数本身没错 ),如参数不对,格式错等

10 error in %某函数内部出错11 error ( ’message ’ ) ; %显示错误信息并终止程序12 warning ( ’message ’ ) ; %显示错误信息,继续程序13

留白以补充:

input 命令将 Matlab 的控制权暂时交给用户,等待用户通过键盘输入数值、字符串或表达式等并经回车键将输入内容传递到工作空间后,收回控制权。

keyboard 命令将控制权交给键盘,用户可以由键盘输入各种合法的 matlab 命令,只有当用户输入完成,并键入 return 命令后,才收回控制权。

input 命令和 keyboard 命令的不同之处在于:keyboard 命令允许输入任意多个 Matlab 命令,而 input 命令只允许用户输入赋值给变量的数组、字符串或元胞数组等。

3.2.2 Python 控制语句

1、分支判断语句 (if:else 结构)

(1) 如果是…那么…(注意 Python 的控制语句要有空格,以及 : 提示符)1 i f express ion :2 command3

(2) 如果是…那么…,否则…1 i f express ion :2 command13 e l s e :4 command25

(3) 如果可选择的执行命令组有多 (n) 组,则调用下面结构

http://www.ma-xy.com 79 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om3.2 控制语句 第三章 MATLAB 控制与函数

1 i f express ion :2 command13 e l i f express ion :4 command25 . . .6 e l s e :7 command8

2、循环控制语句

第一种循环 - while 循环1 while express ion : #直到逻辑否时,退出循环。2 command3 while express ion :4 command5 e l s e :6 command7

注:与本文后面介绍的 for循环一样,while支持三种附加语句:continue、break和 pass。Python中没有 switch case 循环。在循环完成后执行 else,当有 break 时,会跳过 else。

第二种循环 - for 循环1 f o r i t e rvar in inte rab le :2 command3 f o r i t e rvar in inte rab le :4 command5 e l s e :6 command7

注:interable 是 range(start, end, step ),可迭代类。Python2.3 新增 enumerate,通过项和索引进行迭代,例如:

1 f o r i , eachlee in enumerate ( l i s t ) :2 print “%d %s l e e” %(i+1, eachlee )3

3. 异常捕获 try

(1)try:except:else:1 try :2 command13 except :4 command25 . . . . . .6 e l s e :7 command38

http://www.ma-xy.com 80 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第三章 MATLAB 控制与函数 3.2 控制语句

注:当开始一个 try 语句后,python 就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try 子句先执行,接下来会发生什么依赖于执行时是否出现异常。如果 command1 出现异常,执行 command2,如果不存在异常执行 command3。

1、如果当 try 后的语句执行时发生异常,python 就跳回到 try 并执行第一个匹配该异常的except 子句,异常处理完毕,控制流就通过整个 try 语句 (除非在处理异常时又引发新的异常)。

2、如果在 try 后的语句里发生了异常,却没有匹配的 except 子句,异常将被递交到上层的try,或者到程序的最上层 (这样将结束程序,并打印缺省的出错信息)。

3、如果在 try 子句执行时没有发生异常,python 将执行 else 语句后的语句 (如果有 else 的话),然后控制流通过整个 try 语句。

(2)try:finally:1 try :2 command13 f i n a l l y :4 command25

注:python总会执行 finally子句,无论 try子句执行时是否发异常。¬如果没有发生异常,python运行 try 子句,然后是 finally 子句,然后继续。­如果在 try 子句发生了异常,python 就会回来执行 finally 子句,然后把异常递交给上层 try,控制流不会通过整个 try 语句。

(3)try:else:1 try :2 command13 except Exception [ , reason1 ] : #例 valueError4 command25 except Exception [ , reason2 ] : #例TypeError6 command37 e l s e :8 commandn9

注:1、如果 command1 没有异常,忽略所有的 except 继续执行;如果 command2 出现异常,在所有 except 子句中寻找匹配异常,并执行其后的 command。

2、expect 可选项如下:

• except: 捕获所有异常;

• except name: 只捕获特定的异常;

• except name, value: 捕获异常和它的附加数据 (将异常的信息保存到 value);

• except (valueError, TypeError): 捕获任何列出的异常;

4、其他命令

http://www.ma-xy.com 81 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om3.2 控制语句 第三章 MATLAB 控制与函数

1 break # 跳出逐层循环体。

2 continue # continue语句会让当前的迭代结束,忽略其后语句 (command),直接开始下一轮的循环。如果是条件循环 ( while ),验证条件表达式 express ion;如果是迭代循环 ( fo r ),验证是否还有元素可以迭代,如果验证有,则进行迭代。

3 pass # 代码中的占位符 : pass语句在Python代码中充当占位符使用。在不要执行任何东西时可以暂时使用 pass语句来填充。

4

留白以补充:

列表推导式 (list comprehension) 是利用其它列表创建新列表的一种方法;使用 exec 语句可以执行存储在字符串中的 Python 代码;通过使用 eval 语句可以计算以字符串形式书写的 Python 表达式。

3.2.3 R 控制语句

1、分支判断语句

(1) 如果是…那么…1 i f ( express ion ){2 commands3 }4

(2) 如果是…那么…,否则…1 i f ( express ion ) command1 e l s e command22 i f ( express ion ) {command1} e l s e {command2}3 i f ( express ion ) {4 commdan15 } e l s e {6 commdan27 }8

(3) 如果可选择的执行命令组有多组,则调用下面结构1 i f ( expression1 ) {2 commands13 } e l s e i f ( expression2 ) {4 commands25 . . .6 } e l s e {7 commandsn8 }9

注:1. 将 { 放在当前行,而非单独一行¬。

2. ifelse(expression, a, b) # 当 expression[i] 为真时,返回 a[i],否则返回 b[i]。

¬Google 内部 R 程序规范

http://www.ma-xy.com 82 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第三章 MATLAB 控制与函数 3.2 控制语句

2、分支选择语句

3、循环语句

(1) 第一种循环 - while 循环1 while ( express ion ) {2 commands3 }4

(2) 第二种循环 - for 循环1 f o r ( I in express ion ) {2 commands3 }4

(3) 第三种循环 - repeat 循环1 repeat express ion2 #示例: i <−53 repeat { i f ( I > 25) break e l s e {pr int ( i ) ; i <− i +5;}}4

(4) 第四种循环 - foreach 循环。foreach 来自于 foreach 包,能够遍历向量、矩阵、数据框或者迭代器。其命令格式为:

1 foreach ( . . . , . combine , . in i t ,2 . f i n a l l = NULL,3 . inorder = TURE,4 . multicombine = FALSE,5 .maxcombine = i f ( . multicombine ) 100 e l s e 2 ,6 . errorhandl ing = c (‘ stop’ , ‘ remove’ , ‘ pass’ ) ,7 . packages = NULL,8 . export = NULL,9 . noexport= NULL,

10 . berbose = FALSE)11 # 示例:

12 foreach (a = 1:3 , b = rep (10 , 3) ) %do%{13 a + b14 } #可用%dopar%实现并行操作15

4、异常捕获语句

1 trycatch (2 {express ion } ,3 warning = function (w) {warning−handle−code } ,4 error = function ( e ) {error−handle−code } ,5 f i n a l l y = {clean up−code}6 )7

http://www.ma-xy.com 83 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om3.2 控制语句 第三章 MATLAB 控制与函数

注:如果有 warning发生,执行 warning-handle-code,如果有 error发生,执行 error-handle-code,如果有 finally,无论是否发生,都执行 clean up-code。try (expression, silent) #expression 为要尝试的内容,silent = T/F,表示是否将错误信息返回控制台。

5、其他命令

1 i t e r #存在于 i t e r a t o r s包中,用nextElem查看迭代项。2 i t e r ( obj , chechFunc = function () TRUE, recyc l e = FALSE, … )3

其中:obj 是迭代目标,checkFunc 指定一个过滤迭代器返回值的函数,recycle 指定当对象元素迭代结束后是否对迭代进行重置。示例:

1 myfirst <− i t e r (1 :5 )2 nextElem(myfirst )3 break4 next5 stop6 warning7

留白以补充:

ls、ls.str、edit

http://www.ma-xy.com 84 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK

4.1 matlab link word/excel

4.1.1 com/activex

缘结 COM

2015 年底,准确的说是 2015 年下学期期末,我们收到了来自计量经济学老师 (同时也传授我们 stata 神语) 的深深的“祝福”:一大波考试题,没错,是一大波。我手贱的打开了第一份试题,结果承包了所有人的答案。在解第一份试题的时候,我就悄悄地发现:咦?测试数据 1.xls 的工作表是以学号命名的,如下图 (4.1),只是每位同学的数据都不相同。我心中不由起疑:难道数据和 sheet 是批量生产的?再一想,这么多同学的答案,如果是人工批阅的话,那岂不要等到明年 (2016 猴年马月),这样,计量老师的“作案手法”(出题和批题) 已尽在我掌握之中:用程序批量生产数据,同时记录答案,再将答案抹去形成答题卡。这样,无论批多少试卷都不成问题了。

图 4.1: 计量经济学作业一的数据

85

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

想到这里,我欣然 (屁颠屁颠) 的把老师的试题给“解”了,恩对,用程序解的,恩对,批量解的,每个人都有。题型如下图 (4.2) 所示 (题目居然要求一步步手工计算,呵呵),我在后面给出了程序,这个程序用来练习 MATLAB 读取写入 excel 和 MATLAB 矩阵操作再合适不过了。

图 4.2: 计量经济学作业一

下面是用于解决《计量经济学》测试题 1 的程序:ans_econom.m。程序给出了所有试卷的答案,但问题也刚刚开始,可以考虑一下:如何批量生成样本数据,以及如何生成满足不同关系

式的样本数据。

1 %ans_econom .m程序用于解决计量经济学试题12 clc , c l ea r3 %先用 x l s i n f o确定有多少个 sheet要读

http://www.ma-xy.com 86 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

4 [Type , Sheet , Format]= x l s f i n f o ( ’测试数据1 . x l s ’ ) ;5 n=length ( Sheet ) ;6 f o r i =1:n7 [ ~ , txt ]=xlsread ( ’C:\ Users\yanyisong\Documents\MATLAB\测试数据1 . x l s ’ , Sheet{ i } , ’B3:

D12 ’ ) ;8 data =[ ] ;9 f o r j=1: s i z e ( txt , 2 )

10 data=[data , str2num( cell2mat ( txt ( : , j ) ) ) ] ;11 end12 X=data ( : , 1 : 2 ) ;13 X=[X, ones ( s i z e (data , 1 ) ,1) ] ;14 Y=data ( : , end) ;15 T{1}=round(X’*X) ;%四舍五入取整16 T{2}=roundn( inv (T{1}) ,−4) ;17 T{3}=roundn(X’*Y,−2) ;18 T{4}=roundn(T{2}*T{3},−4) ;19 T{5}=roundn(mean(Y) ,−4) ;20 T{6}=roundn(sum((Y−T{5}) .^2) ,−4) ;%TSS21 T{7}=roundn(X*T{4},−4) ;%Yhat22 T{8}=roundn(mean(T{7}) ,−4) ;23 T{9}=roundn(sum((T{7}−T{8}) .^2) ,−4) ;%ESS24 T{10}=roundn(Y−T{7},−4) ;%error25 T{11}=roundn(sum((T{10}) .^2) ,−4) ;%RSS26 T{12}=roundn(T{11}/( s i z e (data , 1 )−s i z e (X,2 ) ) ,−4) ;27 T{13}=roundn(T{12}*T{2},−4) ;28 T{14}=roundn( sqrt ( diag (T{13}) ) ,−4) ;29 T{15}=roundn(T{4}./T{14},−4) ;%H0: beta=030 T{16}=roundn(T{9}/T{6},−4) ;31 T{17}=roundn(1−(1−T{16}) *( s i z e (data , 1 )−1)/( s i z e (data , 1 )−s i z e (X,2 ) ) ,−4) ;32 T{18}=roundn(T{9}/( s i z e (X,2 )−1)*( s i z e (data , 1 )−s i z e (X,2 ) )/T{11},−4) ;33 T{19}=round( s i z e (X,2 )−1) ;34 T{20}=round( s i z e (data , 1 )−s i z e (X,2 ) ) ;35 height=0;36 f o r j=1: length (T)37 x l swr i te ( ’ 20130000. x l s ’ ,T{ j } , Sheet{ i } , [ ’C’ , num2str(2+height ) ] )38 height=height+s i z e (T{ j } ,1) ;39 end40 end41

我将上述程序求解的答案放在了 20130000.xls 中,每个 sheet(学号) 对应着该学号的答案,结果如下图 (4.3) 所示。

http://www.ma-xy.com 87 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

图 4.3: 计量经济学作业 1 解答

解决测试 1 之后,我意犹未尽:老师是如何批量生产试卷的呢?每个同学的数据和试题都不一样 (这是后面第二份第三份试卷所表现出来的特点),当时,我只解了部分试卷,因为如果要批量解决的话,时间是明显不够的。于是,我决定寒假回家时将问题解决并把试卷也造出来。也就

是在造试卷的过程中,我才有幸的结识了 COM,COM 技术 (思想 or 模式) 使得 MATLAB 能够作为客户来操纵 word和 excel等 COM对象。后来,又在 MATLAB link R 中再次接触 COM和 DCOM,RDCOM使得我们能够在 MATLAB中调用 R(这是令统计人兴奋不已的)。下面,我将简单 (真的是很简单) 的介绍 COM 以及 ActiveX 技术。com 介绍

COM(Component Object Model) 组件对象模型,COM 不是编程语言,他更像是一种规范,一种模式,正如其名“组件对象模型”,他将对象像零件一样的组合在一起,从而形成某些大器件

(软件),其所有操作皆是基于对象,流行的组件模型有 COM(Component Object Model,对象组件模型)/DCOM(Distributed COM,分布式对象组件模型)和 CORBA(Common Object RequestBroker Architecture,公共对象请求代理体系结构) 。那么,什么是对象呢?MATLAB(R) 中一切皆对象 (某矩阵,符号以及某图形等等),对象就是现实中的实体 (比如我现在用的这台电脑),我们可以对其进行操作,而容易与对象混淆的是类,类是对象的抽象,是一种抽象的数据类型

(MATLAB 中用 classdef 来定义类,《MATLAB 面向对象的编程从入门到设计模式》),其实对于类和对象的理解,就像我们汉语所理解的那样,比如“人类”就是一个类,具体的某个人就是

“人类”这个类的对象,而“名字、年龄”等就是对象的属性,“宋焱燚、21”就是属性值,人的动作比如“吃饭、穿衣”等就是对象的方法。总之类是对象的模板,对象是类的实例 (类就是有相同特征的事物的集合,而对象就是类的一个具体实例)。同时类有多态和继承,例如“人类”可

http://www.ma-xy.com 88 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

以分为“男人、女人”,“老人、小孩”,那么“男人、女人”就是“人类”的子类。

COM 对象 (组件对象) 区别于对象的地方在于“组件”,这些对象能够像零件一样进行组装拼凑,COM 对象将其对象的程序进行了封装,我们不需要去读程序然后修改其值,而是直接访问封装后的接口 (这个接口也就代表了 COM 对象),这也是我们访问 COM 对象 (对象的属性、方法和事件) 的唯一方法。我们用一个 EXCEL 来进行举例说明:打开一个 EXCEL,下面有工作簿 workbook,工作簿下有表 sheet,表中有单元格 range,一个单元格由 4 条边框 border 构成 (边框实际上就是线条 line),上述的 EXCEL、workbook、sheet、range、border 均是 COM对象,例如,我们可以通过将 border 对象和其他的底层对象组装,形成单元格 range 对象;我们可以通过 border 接口来访问 border 对象的属性、方法和事件。下面,我们来简单的介绍一下COM 对象的属性、方法和时间。

¬COM 对象/接口的属性 properts:就底层对象边框 border 而言,我们需要考虑边框的线性、颜色和粗细等,这些就是边框对象的属性,相应的,如果边框对象的属性 color 是 red,那么red 就是属性 color 的属性值。表 (4.1) 给出了常用的处理对象的属性函数,其中,如果我们想要查看 border 对象的线性属性 linestyle 的可选择的属性值,可以用 set 函数。

表 4.1: 常用的处理对象的属性函数

函数 描述

get 一个或多个属性列表和它们的值

set 设置一个或多个属性的值

isprop 确定一个项目是一个 COM 对象的属性addproperty 添加一个自定义属性 COM 对象deleteproperty 删除一个 COM 对象的自定义属性inspect 打开属性检查器来显示和修改属性值

propedit 内置的显示属性页的控制

­COM 对象/接口的方法 methods:对于 workbook 对象,我们都可以进行哪些操作?关闭close、打开 open、添加 add 等等,这些操作即为对象的方法 method。表 (4.2) 给出了常用的处理对象方法函数,如果我们想要调用对象的某种方法,可以使用 obj.methodname(arg1,arg2,…)或者是 obj.invoke(‘methodname’,arg1,arg2,…)。注:参数 arg 应采用枚举法。

表 4.2: 常用的处理对象的方法函数

函数 描述

methodsview 图形显示的函数名称和签名

invoke 细胞的功能名称和签名, 按字母顺序排序methods 单元阵列的函数名, 按照字母顺序排列的, 大写的名字首先列出来ismethod 细胞的功能名称和签名

http://www.ma-xy.com 89 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

®COM 对象/接口的事件 events:在 COM 中,事件一般是用户启动的某种行为,对于事件,我们应该考虑“某事件发生后,如何处理事件,以及事件带来的后果”。例如:我们单击 EXCEL服务器窗口右上角的”X” 图标,会关闭 EXCEL。单击 EXCEL 是我们发出的事件,事件发生后触动了事件处理程序 (可以想象有一个函数,当时间发生时,就关闭 EXCEL),而事件带来的结果就是 QUIT EXCEL。表 (4.3) 给出了常用的处理对象的事件函数,另外,我们可以编写事件处理程序 (event handler functions,可以编写为 m 函数),并将事件和事件处理程序进行注册/关联 (事件 event 发生时采用该事件处理程序)。

表 4.3: 常用的处理对象的事件函数

函数 描述

isevent 判断是否为事件

events 列出所有的事件

eventlisteners List event handler functionsregisterevent Associate event handlerunregisterallevents Unregister all event handlersunregisterevent Unregister event handler

另外,当我们不再需要某 COM对象/事件时,可以将其删除 (delete)或释放 (release),delete用于删除 COM 对象/事件,而 release 只能释放 COM 接口。当删除或关闭一个包含控件的图形窗口 figure 时,MATLAB 会自动释放所有接口。

COM 客户: 我们在使用 word 时,被视为客户,客户可以要求 word 服务器来为我们服务些什么 (写文档等)。如果我们通过 MATLAB 来操控 word,那么,MATLAB 记为 word 的客户。

COM 服务器: COM 服务器分为进程内和进程外服务器,以 dll 形式存在的组件对象,在实际调用时,组件代码被载入应用程序中,称为进程内组件 (服务器);以 exe 形式的组件,可以独立运行,称为进程外组件,可以通过 actxserver 来创建进程内和进程外服务器。MATLAB 支持COM 技术,也就是说 MATLAB 可以作为服务器来进行服务,我们可以在 excel 或 word 等程序中调用 MATLAB。activex 介绍前面我们说到,COM 不是一种编程语言而是一种模式,一种规范,它可以重复使用一种

COM 对象像零件一样用于不同的软件当中,而 ActiveX 技术是建立在 COM 之上的。ActiveX是一个开放的集成平台,使用 ActiveX,可轻松方便的在Web页中插入多媒体效果、交互式对象、以及复杂程序。ActiveX 组件在 MATLAB 中可以分为 2 种情况:ActiveX 控件 (Active control)和 ActiveX 服务器 (Active server)。

1、ActiveX 控件以前称为 OLE 控件或 OCX 控件,用于打包别人编程功能,在 Web 页或在其它程序中插入。例如,通过 FLASH 控件可以使 InternetExplorer 具有播放动画的能力。在MATLAB 中,我们可以向 figure 窗口中添加 ActiveX 控件,这是一种可见可嵌入的组件,可以

http://www.ma-xy.com 90 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

通过 actxcontrol、actxcontrollist 和 actxcontrolselect 来创建。2、ActiveX 服务器有两类: 进程内服务器 (dll 动态链接库) 和进程外服务器 (exe 可执行

文件),在 MATLAB 中,我们可以通过 actxserver 来创建进程内和进程外服务器,例如:用actxserver(‘WMplayer.OCX.8’) 来创建一个进程内服务器 (组件)Windows Media Player;用actxserver(’Excel.Application’) 来创建一个进程外服务器 Excel 对象。

4.1.2 com 基本命令及例子

一个简短的例子

1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 %%%%%%%下面,我们用一个简短的例子来熟悉一下COM的基本操作命令。%%%%%%%%3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 Excel = actxserver ( ’ Excel . Application ’ )%创建一个Excel对象。5 iscom(Excel )%判断是否为com对象。Excel . iscom。 ans=1。6 i s i n t e r f a c e (Excel )%判断是否为com接口。Excel . i s i n t e r f a c e。 ans=0。7 i sprop (Excel , ’ ActiveSheet ’ )%判断是否为对象/接口的属性8 ismethod (Excel , ’ Calculate ’ ) %判断是否为对象/接口的方法9 i sevent (Excel , ’ NewWorkbook ’ ) %判断是否为对象/接口的事件。Excel . i sevent

10 Excel . inspect %具体显示接口 ( or COM对象 )的属性值和次级接口 inspect ( e )如下图所示。11

图 4.4: 接口/COM 对象的属性值和次级接口 inspect

Excel.get 可以得到接口 (or COM 对象) 的属性值 get(e)1 >> Excel . get %得到接口 ( or COM对象 )的属性值 get ( e )2 Application : [1 x1 Inte r face . Microsoft_Excel_14 .0_Object_Library . _Application ]

http://www.ma-xy.com 91 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

3 Creator : ’ xlCreatorCode ’4 Parent : [1 x1 Inte r face . Microsoft_Excel_14 .0_Object_Library . _Application ]5 ActiveCell : [ ]6

Excel.invoke 可得到接口 (or COM 对象) 的方法1 >> Excel . invoke2 Calculate = void Calculate ( handle )3 DDEExecute = void DDEExecute( handle , int32 , s t r ing )4 DDEInitiate = int32 DDEInitiate ( handle , str ing , s t r ing )5

Excel.methods 可得到接口 (or COM 对象) 的方法1 >> Excel . methods2 ActivateMicrosoftApp NextLetter3 AddCustomList OnKey4 Calculate OnRepeat5 CalculateFul l OnTime6 CalculateFullRebuild OnUndo7 CalculateUntilAsyncQueriesDone Quit8

Excel.methodsview 可得到接口 (or COM 对象) 的方法 methodsview(e),如下图 (4.5) 所示。

图 4.5: 接口/COM 对象的方法 methodsview

Excel.events 可得到接口 (or COM 对象) 的事件列表1 >> Excel . events %得到接口 ( or COM对象 )的事件列表2 NewWorkbook = void NewWorkbook( handle Wb)

http://www.ma-xy.com 92 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

3 SheetSelectionChange = void SheetSelectionChange ( handle Sh , handle Target )4 SheetBeforeDoubleClick = void SheetBeforeDoubleClick ( handle Sh , handle Target ,

bool Cancel )5 SheetBeforeRightClick = void SheetBeforeRightClick ( handle Sh , handle Target , bool

Cancel )6

1 %查看属性Cursor的所有可选属性值。Excel . set ( ’属性 ’ , ’属性值 ’ )2 set (Excel , ’ Cursor ’ )3 ans =4 ’ xlIBeam ’5 ’ x lDefault ’6 ’ xlNorthwestArrow ’7 ’ xlWait ’8 Excel . Cursor = ’ xlDefault ’ ; %重置光标。9 Excel . Vi s ib l e = 1; % 设置Excel属性为可见。 set (Excel , ’ Vis ible ’ , 1) ;

10 %wdata = Open(Excel , ’ c :\work\weekly_log . xlsx ’ ) ; % 连接到现有Excel应用程序11 eWorkbook = Excel .Workbooks .Add; %添加一个工作簿。Add(Excel .Workbooks) ;12 eSheets = Excel . ActiveWorkbook . Sheets ;%活动的工作簿的表13 eSheet1 = eSheets . get ( ’ Item ’ ,1) ;%活动的工作簿的第一张表 eSheet1 = Item( eSheets , 1 ) ;14 eSheet1 . Activate%使第一张工作表活跃15 eNewSheet = Add( eSheets , [ ] , eSheet1 ) ; %通过使用一个空数组 [ ] 。16

1 ws = Excel . Activesheet ;%正在活动的表2 ws . StandardHeight %显示工作表中的所有行的默认高度。 ans = 14.40003 methods(ws , ’−f u l l ’ ) %显示语法创建一个函数{}范围{}对象。 }4 wsRange = ws .Range( ’A1 ’ ) ;%得到A1单元格5 wsRange .RowHeight = 25; %增加行高。

http://www.ma-xy.com 93 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

6 %将MATLAB数据保存到工作表。7 A = [1 2 ; 3 4 ] ;8 eActivesheetRange = get (ws , ’Range ’ , ’A1:B2 ’ ) ;9 eActivesheetRange . Value = A;

10 %读取 exce l数据到MATLAB11 eRange = get ( e . Activesheet , ’Range ’ , ’A1:B2 ’ ) ;12 B = eRange . Value ;13 B = reshape ( [B{ : } ] , s i z e (B) ) ; %将数据转换成一个双矩阵。14 %% 为工作簿OnClose事件显示消息15 %{16 在当前文件夹 , 创建以下事件处理程序文件 : OnBeforeCloseWorkbook .m ,。17 function OnBeforeCloseWorkbook( varargin )18 disp ( ’ BeforeClose event occurred ’ )19 %}20 reg i s t e revent (hWorkbook,{ ’ BeforeClose ’ @OnBeforeCloseWorkbook})%注册函数为 OnClose 事

件。

21 SaveAs(eWorkbook , ’ myfi le . x l s ’ ) %保存工作簿文件中。22 eWorkbook . Saved = 1; %保存文件23 Close (eWorkbook) %关闭工作簿。24 BeforeClose event occurred25 Quit (Excel ) %退出Excel程序26 eWorkbook . r e l ea s e %释放接口27 Excel . de le te %删除接口 de lete (Excel )28 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29

4.1.3 操作案例

下面,我们将利用 COM 技术来实现一个稍微复杂一点的例子。在这个例子中,我们将用MATLAB 来批量生产试卷 (没错啦,就是我寒假回家做的),试卷的样式仿照《计量经济学测试2》(具体内容在相关文件夹下): 有一个总的压缩文件“计量经济学 2.rar”,里面每一个学号对应一个压缩文件 (20135064.rar),每个学号的压缩文件夹下有相应的数据、试卷以及答题卡 (企业数据.dta 、20130436.pdf 和 20130436.xlsx),试卷的内容如图 (4.6) 所示。

图 4.6: 试卷的内容

http://www.ma-xy.com 94 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

首先,我们来想象一下,如果是人工设计试卷的话都有哪些过程。由于每份试卷的题目都不

相同,可以猜到,试卷应该是从题库中抽取出来的 (题库应该具有可变性)。我们就某位同学的试卷而言:1、需要把试卷的通用格式 (例如:标题、前言、版面和注意事项等等) 设定好。2、对于试卷的试题内容,我们随机的从题库中抽取部分题目,复制粘贴到 WORD 试卷上,同时,我们还应该记录抽取题目的答案,以用于日后的批改工作。

然后,我们来捋一捋在设计程序时,应该做哪些内容。

1. 设计试卷 (doc 格式) 的通用格式。由于从整体上看,每个同学的试卷的通用格式是相似的,只是试题的内容不同,所以我们先来设定试卷的通用格式。

2. 设计答案和答题卡 (xls 格式) 的通用格式。由于我们并不知道每张试卷的题目数量,所以我们并不能标注具体的题号以及题号对应的答案,只有从题库抽取题目的时候,我们才能

标记答案,因此,我们先设定答案和答题卡的通用格式 (例如:某单元格的格式)。

3. 读取题库 (题库是自制的)。在读取题库时,我们要记录题库中有哪些题型,以及各题型的数量。同时,题库中应有每题的答案。

4. 设计试卷试题内容以及保存答案 (抽选题目)。从题库的各个题型中选取部分试题作为试卷的内容,并记录抽到的试题的答案,将答案抹去,作为答题卡。

5. 保存试卷、答案以及答题卡。将 doc 格式的试卷保存,并另存为 pdf 格式的试卷,保存 xls格式的答题卡。将 doc、pdf 和 xls 答题卡保存在对应的学号下的文件夹里 (不存在文件夹时要创建),并压缩文件夹。将 xls 格式的答案单独保存到某文件夹,以备后用。

最后,我们写一写上面过程的注意事项以及后续工作 (待完成)。

1. 答案和答题卡的 xls 有两种方式。一种方式是一个学号一个 xls,另一种方式是只有一个 xls而每个学号对应一个 sheet。

2. 复制答案和答题卡。如果所有人的数据以及试题是一样的,那么在设置第一位同学的答案和答题卡之后,后面同学的可以复制而来。

3. 有不同题型的答案,如何保存答案可以使后面的批题工作更简单?

4. 模拟批题的过程,假设有一份答案,我们如何进行批题工作?写出相应的程序。

5. 能否设置多选题的批题方式,使得可以存在两种情况:一种情况是错选不得分,另一种情况是多选不得分?(如果你对试卷还有其他的要求,请自行补充)。

下面,给出试卷的程序 examinationpape.m。examinationpape.m 是用于生产某学号的试卷、答案以及答题卡,并保存。如果想要批量生产,可以运行 manypaper.m 函数。

http://www.ma-xy.com 95 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

1、函数 examinationpape.m 的输入

1 function examinationpaper ( Vis ib le , Margin , t i t l e , classname , classnumber , name,studentnumber , annomcement , . . .

2 selectnumber , cancopy , cardtype , pwd)3 % 此函数用于从已有题库中抽取部分题目生成word or pdf文档4 % 输入参数 nargin说明:5 % v i s i b l e : 文档是否显示出来 1显示 ( bool )。默认: 06 % margin : 页面边距 (margin为4值向量 array )。默认: [ 60 , 45 , 45 , 45 ] ;7 % t i t l e : 文档标题 ( s t r ing )。默认: [ ’2015~2016学年第一学期课程测试试卷 (第2次测试 ) ’ ] ;8 % classname : 课程名称 ( s t r ing )。默认: ’计量经济学 ’ ;9 % classnumber :课程号 ( s t r ing )。默认: ’0140801 ’ ;

10 % name : 学生姓名 ( s t r ing )。默认: ’宋焱燚 ’ ;11 % studentnumber : 学号 ( s t r ing )。默认: ’20135064 ’ ;12 % annomcement : 注意事项 ( s t r ing )。默认:13 % selectnumber : 各题选择个题数 (4 array )。默认: [ 3 , 5 , 5 , 5 ]14 % cancopy : 答题卡能否复制 ( bool )1能。默认: 015 % cardtype:答题卡的类型 ( int )。默认: 0为一个学号一张答题卡 ( . x l s ),1表示所有答题卡在一

个 . x l s中16 % pwd:试卷路径 ( s t r ing )。默认: ’D:\Program Fi l e s \MATLAB\R2014a\work\20计量经济作业解

\生成的试卷 ’ ;17

2、设置默认参数

1 %%%%%%%%%%%%%%%%%设置默认参数%%%%%%%%%%%%%%%%%2 i f nargin < 13 Vis ib l e = 0;4 end5 i f nargin < 26 Margin = [60 , 45 , 45 , 4 5 ] ;7 end8 i f nargin < 39 t i t l e = [ ’ 2015~2016学年第一学期课程测试试卷 (第2次测试 ) ’ ] ;

10 end11 i f nargin < 412 classname = ’计量经济学 ’ ;13 end14 i f nargin < 515 classnumber = ’ 0140801 ’ ;16 end17 i f nargin < 618 name = ’宋焱燚 ’ ;19 end20 i f nargin < 721 studentnumber = ’ 20135064 ’ ;22 end23 i f nargin < 824 annomcement = [ ’【注意事项】各位同学,请根据自己的学号来完成本次测试题 (见以学号

命名的压缩包中,包括试卷、数据和答案表 ),将答案 (数值题保留四位小数、非数值题见各大题要求 )填写在EXCEL工作薄中相应的单元格中,并在规定的时间内提交以自己学号命名的EXCEL工作薄。在计算相关的统计量及其P值时均不采用连续性修正! ’ ] ;

http://www.ma-xy.com 96 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

25 end26 i f nargin < 927 selectnumber = [3 , 5 , 5 , 5 ] ;%选题数量28 end29 i f nargin < 1030 cancopy = 0;31 end32 i f nargin <1133 cardtype = 0;34 end35 i f nargin < 1236 pwd = ’D:\Program Fi l e s \MATLAB\R2014a\work\20计量经济作业解\生成的试卷 ’ ;37 end38

3、设置试卷通用格式.doc

此部分是用于设计试卷的通用格式,设计的格式如图 (4.7) 所示。1 %%%%%%%%%%%%%%%%%设置试卷通用格式 . doc%%%%%%%%%%%%%%%%2 % 设定测试Word文件名和路径3 %pwd = ’D:\Program Fi l e s \MATLAB\R2014a\work\20计量经济作业解\生成的试卷 ’ ;4 f i l e spec_user = [pwd ’\ ’ studentnumber ’\ ’ studentnumber ’ . doc ’ ] ;5 % 判断Word是否已经打开,若已打开,就在打开的Word中进行操作,否则就打开Word6 try7 Word = actxGetRunningServer ( ’Word. Application ’ ) ;% 若Word服务器已经打开,返回其句

柄Word8 catch9 Word = actxserver ( ’Word. Application ’ ) ; % 创建一个Microsoft Word服务器,返回句柄

Word10 end11 %Vis ib l e = 1;12 Word. Vis ib l e = Vis ib l e ; % 设置Word属性为可见。13 % 若测试文件存在,打开该测试文件,否则,新建一个文件,文件名为测试 . doc14 i f ex i s t ( f i l espec_user , ’ f i l e ’ ) == 215 %f i l e :文件16 Document = Word.Documents .Open( f i l e spec_user ) ;% Document = invoke (Word.Documents

, ’Open’ , f i l e spec_user ) ;17 e l s e18 Document = Word.Documents .Add; % Document = invoke (Word.Documents , ’Add’ ) ;19 end20 Paragraph = Document . Paragraphs ; %返回段落接口句柄21 Content = Document . Content ; % 返回Content接口句柄22 Se lect ion = Word. Se lect ion ; % 返回 Se lect ion接口句柄23 Paragraphformat = Se lect ion . ParagraphFormat ; % 返回ParagraphFormat接口句柄24 % 页面设置

25 %Margin = [60 , 45 , 45 , 45 ] ;26 Document . PageSetup .TopMargin = Margin (1) ; %上边距60磅27 Document . PageSetup . BottomMargin = Margin (2) ; %下边距45磅28 Document . PageSetup . LeftMargin = Margin (3) ; %左边距45磅29 Document . PageSetup . RightMargin = Margin (4) ; %右边距45磅30 %

http://www.ma-xy.com 97 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

31 % 设定文档内容的起始位置和标题

32 Content . Start = 0; % 设置文档内容的起始位置

33 %t i t l e = [ ’2015~2016学年第一学期课程测试试卷 (第2次测试 ) ’ ] ;34 Content . Text = t i t l e ; % 输入文字内容

35 Content . Font . Size = 16 ; % 设置字号为16(3号字体 )36 Content . Font . Bold = 4 ; % 字体加粗

37 Content . Paragraphs . Alignment = ’wdAlignParagraphCenter ’ ; % 居中对齐

38 Content . Paragraphs . SpaceBefore = 12; %文档内容 .段落 .段前间距 =12磅39 Content . Paragraphs . SpaceAfter = 12; %文档内容 .段落 .段后间距 =12磅40 %41 Se lect ion . Start = Content . end ; % 设定下面内容的起始位置

42 Se lect ion . TypeParagraph ; % 回车,另起一段

43 %Select ion . TypeParagraph ;44 Content . Start = Se lect ion . end ;45 classname1 = [ ’ ’ , classname , ’ ’ ] ;46 classnumber1 =[ ’ ’ , classnumber , ’ ’ ] ;47 name1 = [ ’ ’ , name, ’ ’ ] ;48 studentnumber1 = [ ’ ’ , studentnumber , ’ ’ ] ;49 information1 = [ ’ 课程名称: ’ , classname1 , ’ 课程号: ’ , classnumber1 ] ;50 Content . Text = information1 ;51 Content . Font . Size = 12; % 设置字号为12(小四号字体 )52 Content . Font . Bold = 0; % 字体不加粗

53 Content . Paragraphs . Alignment = ’wdAlignParagraphCenter ’ ; % 居中对齐

54 Content . Paragraphs . SpaceBefore = 0; %文档内容 .段落 .段前间距 =0磅55 Content . Paragraphs . SpaceAfter = 0; %文档内容 .段落 .段后间距 =0磅56 %57 Se lect ion . Start = Content . end ;58 Se lect ion . TypeParagraph ;59 Content . Start = Se lect ion . end ;60 information2=[ ’ 学生姓名: ’ ,name1 , ’ 学号: ’ , studentnumber1 ] ;61 Content . Text = information2 ;62 Content . Paragraphs . SpaceBefore = 0; %文档内容 .段落 .段前间距 =0磅63 Content . Paragraphs . SpaceAfter = 0; %文档内容 .段落 .段后间距 =0磅64 %65 Se lect ion . Start = Content . end ;66 Se lect ion . TypeParagraph ;67 %Select ion . TypeParagraph ;68 Content . Start = Se lect ion . end ;69 %annomcement = [ ’【注意事项】各位同学,请根据自己的学号来完成本次测试题 (见以学号命名

的压缩包中,包括试卷、数据和答案表 ),将答案 (数值题保留四位小数、非数值题见各大题要求 )填写在EXCEL工作薄中相应的单元格中,并在规定的时间内提交以自己学号命名的EXCEL工作薄。在计算相关的统计量及其P值时均不采用连续性修正! ’ ] ;

70 Content . Text = annomcement ;71 Content . Font . ColorIndex = ’wdRed ’ ;72 Content . Font . Size = 10 .5 ; % 设置字号为10 .5(5号字体 )73 Content . Paragraphs . Alignment = ’wdAlignParagraphLeft ’ ;74 Content . Paragraphs . FirstLineIndent = 0;75 Content . Paragraphs . SpaceBefore = 12; %文档内容 .段落 .段前间距 =12磅76 Content . Paragraphs . SpaceAfter = 12; %文档内容 .段落 .段后间距 =12磅77 Se lect ion . Start = Content . end ;78 Se lect ion . TypeParagraph ;79

http://www.ma-xy.com 98 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

图 4.7: 试卷的通用格式

4、答案和答题卡

此部分是用于生成答案和答题卡的通用格式。

1 %%%%%%%%%%%%%%%%%创建EXCEL :答案和答题卡%%%%%%%%%%%%%%%%%%%%2 %%%%%%%%%%%%1、答题卡 x l s%%%%%%%%%%%3 i f cardtype == 14 f i l e spec_user2 = [pwd, ’ \答题卡和答案\答题卡 . x l s ’ ] ;% 设定测试Excel文件名和路径5 %如果答题卡 (EXCEL)是类型1(所有答题卡只在一个 * . x l s中,只是 sheet的名称为学号 )6 %打开EXCEL7 Excel = actxserver ( ’ Excel . Application ’ ) ;8 %{9 %不能够用下面方法,因为我们打开了两个EXCEL对象

10 try11 Excel = actxGetRunningServer ( ’ Excel . Application ’ ) ;12 catch13 Excel = actxserver ( ’ Excel . Application ’ ) ;14 end15 %}16 e l s e17 f i l e spec_user2 = [pwd, ’ \ ’ , studentnumber , ’ \ ’ , studentnumber ’ . x l s ’ ] ;18 Excel = actxserver ( ’ Excel . Application ’ ) ;19 end20 Excel . Vi s ib l e = Vis ib le ;21 % 创建工作簿workbook22 i f ex i s t ( f i lespec_user2 , ’ f i l e ’ ) == 223 Workbook = Excel .Workbooks .Open( f i l espec_user2 ) ;24 e l s e25 Workbook = Excel .Workbooks .Add;26 end27 %创建工作表

http://www.ma-xy.com 99 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

28 i f strcmp(Workbook . Sheets . Item(1) .Name, ’ Sheet1 ’ )29 Sheet = Workbook . Sheets . Item(1) ;30 Workbook . Sheets . Item(2) . Delete ;31 Workbook . Sheets . Item(2) . Delete ;32 %Sheet . Active ;33 Sheet .Name = studentnumber ;34 e l s e i f cancopy ==135 sheetnum = Workbook . Sheets . Count ;36 Sheet = Workbook . ActiveSheet .Copy ( [ ] , Workbook . Sheets . Item(sheetnum) ) ;37 Sheet .Name = studentnumber ;38 e l s e39 sheetnum = Workbook . Sheets . Count ;40 Sheet = Workbook . Sheets .Add( [ ] , Workbook . Sheets . Item(sheetnum) , 1 , [ ] ) ;41 Sheet .Name = studentnumber ;42 end43 %单元格设置44 i f cancopy == 045 Sheet .Range( ’B2:C2 ’ ) . Border .Weight = 2;46 Sheet .Range( ’B2:C2 ’ ) . Border . ColorIndex = 23;47 Sheet .Range( ’B2:C2 ’ ) . Border . LineStyle = 9;48 Sheet .Range( ’B2:C2 ’ ) . Font . Size = 12;49 Sheet .Range( ’B2:C2 ’ ) . Font . bold = 2;50 Sheet .Range( ’B2:C2 ’ ) . Font .Name = ’黑体 ’ ;51 Sheet .Range( ’B2:C2 ’ ) . HorizontalAlignment = 3;52 Sheet .Range( ’B2:C2 ’ ) . VerticalAlignment = 2;53 Sheet .Range( ’B2 ’ ) . Value = ’题号 ’ ;54 Sheet .Range( ’C2 ’ ) . Value = ’答案 ’ ;55 end56 %%%%%%%%%%%%2、答案 x l s%%%%%%%%%%%%%%57 i f cardtype == 158 %如果答题卡 (EXCEL)是类型1(所有答题卡只在一个 * . x l s中,只是 sheet的名称为学号 )59 f i l e spec_user3 = [pwd, ’ \答题卡和答案\答案 . x l s ’ ] ;60 Excel2 = actxserver ( ’ Excel . Application ’ ) ;%打开EXCEL61 %{62 try63 Excel2 = actxGetRunningServer ( ’ Excel . Application ’ ) ;64 catch65 Excel2 = actxserver ( ’ Excel . Application ’ ) ;66 end67 %}68 e l s e69 f i l e spec_user3 = [pwd, ’ \答案\ ’ , studentnumber , ’ . x l s ’ ] ;70 Excel2 = actxserver ( ’ Excel . Application ’ ) ;71 end72 Excel2 . Vi s ib l e = Vis ib l e ; % 设置Excel服务器为可见状态73 % 创建工作簿workbook74 i f ex i s t ( f i lespec_user3 , ’ f i l e ’ ) == 275 Workbook2 = Excel2 .Workbooks .Open( f i l e spec_user3 ) ;76 e l s e77 Workbook2 = Excel2 .Workbooks .Add;78 end79 %创建工作表80 i f strcmp(Workbook2 . Sheets . Item(1) .Name, ’ Sheet1 ’ )

http://www.ma-xy.com 100 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

81 Sheet2 = Workbook2 . Sheets . Item(1) ;82 Workbook2 . Sheets . Item (2) . Delete ;83 Workbook2 . Sheets . Item (2) . Delete ;84 %Sheet2 . Active ;85 Sheet2 .Name = studentnumber ;86 e l s e i f cancopy ==187 sheetnum2 = Workbook2 . Sheets . Count ;88 Sheet2 = Workbook2 . ActiveSheet .Copy ( [ ] , Workbook2 . Sheets . Item(sheetnum2) ) ;89 Sheet2 .Name = studentnumber ;90 e l s e91 sheetnum2 = Workbook2 . Sheets . Count ;92 Sheet2 = Workbook2 . Sheets .Add( [ ] , Workbook2 . Sheets . Item(sheetnum2) , 1 , [ ] ) ;93 Sheet2 .Name = studentnumber ;94 end95 %单元格设置96 i f cancopy == 097 Sheet2 .Range( ’B2:C2 ’ ) . Border .Weight = 2;98 Sheet2 .Range( ’B2:C2 ’ ) . Border . ColorIndex = 23;99 Sheet2 .Range( ’B2:C2 ’ ) . Border . LineStyle = 9;

100 Sheet2 .Range( ’B2:C2 ’ ) . Font . Size = 12;101 Sheet2 .Range( ’B2:C2 ’ ) . Font . bold = 2;102 Sheet2 .Range( ’B2:C2 ’ ) . Font .Name = ’黑体 ’ ;103 Sheet2 .Range( ’B2:C2 ’ ) . HorizontalAlignment = 3;104 Sheet2 .Range( ’B2:C2 ’ ) . VerticalAlignment = 2;105 Sheet2 .Range( ’B2 ’ ) . Value = ’题号 ’ ;106 Sheet2 .Range( ’C2 ’ ) . Value = ’答案 ’ ;107 end108

5、读取题库

题库是我们仿照《计量经济学测试 2》里面的试题给出的,题库的样式如图 (4.8) 所示,题库中应该存在题型、题号、题目和答案 4 个部分,允许添加和删除题目,允许添加和删除题型。

http://www.ma-xy.com 101 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

图 4.8: 题库

1 %%%%%%%%%%%%%%%读取题库 (可以写到函数外面 )%%%%%%%%%%%%%%%%%%%%%%2 i f ~ ex i s t ( ’ a l ldata ’ ) %如果不存在变量 a l ldata3 [num, txt , a l ldata ] = xlsread ( ’D:\Program Fi l e s \MATLAB\R2014a\work\20计量经济作

业解\题库 . x lsx ’ , 1) ;%应该将题库一直打开4 txt (1 , : ) = [ ] ;5 count = f ind (num == 1) ;6 typeoftopic = txt ( count , 1) ;%题型7 end8

9 f o r i =1: length ( count )10 i f i ~= length ( count )11 numoftopic ( i ) = count ( i+1) − count ( i ) ;%各题型数量12 e l s e13 numoftopic ( i ) = length (num) − count ( i ) + 1;14 end15 end16

6、设计试卷试题内容并记录答案

此部分用于从题库中抽取部分试题作为试卷的内容,并记录题目对应的题号和答案。

1 %%%%%%%%%%%%%%%设计试卷试题内容并记录答案%%%%%%%%%%%%%%%%%%%%%%2 %selectnumber = [3 5 5 5 ] ;%选题数量3 ind = 0;4 f o r i = 1: length ( count )5 Tit le=[num2str ( i ) , ’、 ’ , typeoftopic { i } , ’ 将正确答案填写在EXCEL工作簿中与题号对应

的单元格中。 ’ ] ;6 Content . Start = Se lect ion . end ;7 Content . Text = Tit le ;

http://www.ma-xy.com 102 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

8 Content . Font . ColorIndex = ’wdBlack ’ ;9 Content . Font . Size = 11 ; % 设置字号为11(3号字体 )

10 Content . Font . Bold = 4; % 字体加粗

11 Content . Font .NameFarEast = ’黑体 ’ ;12 Content . Paragraphs . Alignment = ’wdAlignParagraphLeft ’ ;13 Content . Paragraphs . FirstLineIndent = 0;%首行缩进14 Content . Paragraphs . SpaceBefore = 6;15 Content . Paragraphs . SpaceAfter = 6;16 Se lect ion . Start = Content . end ;17 Se lect ion . TypeParagraph ;18 %19 %从题库中抽取内容20 i f i == 121 indexoftopic = randperm(numoftopic ( i ) , selectnumber ( i ) ) ;%选题序号22 e l s e23 indexoftopic = randperm(numoftopic ( i ) , selectnumber ( i ) ) − 1+count ( i ) ;24 end25 %26 f o r j = 1: length ( indexoftopic )27 ind = ind+1;28 T = [ num2str ( ind ) , txt{ indexoftopic ( j ) , 3 } ] ;%第 i题的字符串29 Content . Start = Se lect ion . end ;30 Content . Text = T;31 Content . Font .NameFarEast = ’宋体 ’ ;32 Content . Font . ColorIndex = ’wdBlack ’ ; %颜色33 Content . Font . Size = 10.5 ; % 设置字号为11(3号字体 )34 Content . Font . Bold =0; % 字体加粗

35 Content . Paragraphs . Alignment = ’wdAlignParagraphLeft ’ ; % 左端对齐

36 Content . Paragraphs . FirstLineIndent = 25; %首行缩进25磅37 Content . Paragraphs . SpaceBefore = 0;38 Content . Paragraphs . SpaceAfter = 0;39 Se lect ion . Start = Content . end ; % 设定下面内容的起始位置

40 Se lect ion . TypeParagraph ;41 %题目序号的单元格设置42 i f cancopy == 043 Sheet .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Borders . ColorIndex = 11;44 Sheet .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Borders . LineStyle = 1;45 Sheet .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Borders .Weight = 3;46 Sheet .Range ( [ ’B ’ , num2str(2+ind ) ] ) . HorizontalAlignment = 1;47 Sheet .Range ( [ ’B ’ , num2str(2+ind ) ] ) . VerticalAlignment = 1;48 Sheet .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Font . Size = 10 .5 ;49 Sheet .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Font . bold = 0;50 Sheet .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Font .Name = ’宋体 ’ ;51 Sheet .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Value = num2str ( ind ) ;52 %53 Sheet2 .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Borders . ColorIndex = 11;54 Sheet2 .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Borders . LineStyle = 1;55 Sheet2 .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Borders .Weight = 3;56 Sheet2 .Range ( [ ’B ’ , num2str(2+ind ) ] ) . HorizontalAlignment = 1;57 Sheet2 .Range ( [ ’B ’ , num2str(2+ind ) ] ) . VerticalAlignment = 1;58 Sheet2 .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Font . Size = 10 .5 ;59 Sheet2 .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Font . bold = 0;60 Sheet2 .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Font .Name = ’宋体 ’ ;

http://www.ma-xy.com 103 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

61 Sheet2 .Range ( [ ’B ’ , num2str(2+ind ) ] ) . Value = num2str ( ind ) ;62 %63 %题目答案的单元格设置64 f o r co l = 4: s i z e ( txt , 2)65 i f ~isempty ( txt ( indexoftopic ( j ) , co l ) )66 co l sheet = char ( ’B’ + co l − 3) ;%ASCII转码,还可用 s e t s t r命令,并

且,字符串比较大小时,是比较的ASCII码67 Sheet .Range ( [ colsheet , num2str(2+ind ) ] ) . Borders . ColorIndex = 11;68 Sheet .Range ( [ colsheet , num2str(2+ind ) ] ) . Borders . LineStyle = 1;69 Sheet .Range ( [ colsheet , num2str(2+ind ) ] ) . Borders .Weight = 3;70 Sheet .Range ( [ colsheet , num2str(2+ind ) ] ) . HorizontalAlignment = 1;71 Sheet .Range ( [ colsheet , num2str(2+ind ) ] ) . VerticalAlignment = 1;72 Sheet .Range ( [ colsheet , num2str(2+ind ) ] ) . Font . Size = 10 .5 ;73 Sheet .Range ( [ colsheet , num2str(2+ind ) ] ) . Font . bold = 0;74 Sheet .Range ( [ colsheet , num2str(2+ind ) ] ) . Font .Name = ’宋体 ’ ;75 %76 Sheet2 .Range ( [ colsheet , num2str(2+ind ) ] ) . Borders . ColorIndex = 11;77 Sheet2 .Range ( [ colsheet , num2str(2+ind ) ] ) . Borders . LineStyle = 1;78 Sheet2 .Range ( [ colsheet , num2str(2+ind ) ] ) . Borders .Weight = 3;79 Sheet2 .Range ( [ colsheet , num2str(2+ind ) ] ) . HorizontalAlignment = 1;80 Sheet2 .Range ( [ colsheet , num2str(2+ind ) ] ) . VerticalAlignment = 1;81 Sheet2 .Range ( [ colsheet , num2str(2+ind ) ] ) . Font . Size = 10 .5 ;82 Sheet2 .Range ( [ colsheet , num2str(2+ind ) ] ) . Font . bold = 0;83 Sheet2 .Range ( [ colsheet , num2str(2+ind ) ] ) . Font .Name = ’宋体 ’ ;84 Sheet2 .Range ( [ colsheet , num2str(2+ind ) ] ) . Value = txt{ indexoftopic

( j ) , co l } ; %答案85 end86 end87 end88 end89 end90 %91 Document .ActiveWindow . ActivePane .View .Type = ’wdPrintView ’ ; % 设置视图方式为页面

92

7、保存试卷与答题卡以及答案

1 %%%%%%%%%%%%% 保存试卷与答题卡以及答案%%%%%%%%%%%%%%2 i f cardtype ~= 13 %设置路径4 myfolder = [pwd ’\ ’ studentnumber ] ;5 i f ~ ex i s t (myfolder , ’ d i r ’ )6 %如果不存在文件夹7 mkdir (myfolder )8 end9 i f ~ ex i s t ( [pwd, ’ \答案 ’ ] , ’ d i r ’ )

10 mkdir ( [pwd, ’ \答案 ’ ] )11 end12 i f ~ ex i s t ( [pwd, ’ \ zip ’ ] , ’ d i r ’ )13 mkdir ( [pwd, ’ \ zip ’ ] )14 end15

http://www.ma-xy.com 104 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.1 MATLAB LINK WORD/EXCEL

16 e l s e17 %设置路径18 myfolder = [pwd, ’ \答题卡和答案 ’ ] ;19 i f ~ ex i s t (myfolder , ’ d i r ’ )20 mkdir (myfolder )21 end22 end23 %24 %保存文档Save&SaveAs25 Document . SaveAs2( f i l e spec_user ) ; % 保存doc文档26 Document .methods27 Document . SaveAs2 ( [pwd, ’ \ ’ , studentnumber , ’ \ ’ , studentnumber , ’ . pdf ’ ] ) ; % 保存

pdf文档28 Workbook . SaveAs( f i l espec_user2 ) ; % 保存 x l s文档29 Workbook2 . SaveAs( f i l espec_user3 ) ; % 保存 x l s文档 (含答案 )30 %31 %关闭文档32 Word. Quit33 Excel . Quit34 Excel2 . Quit35 %36 %压缩文件的命令为: zip和 tar37 Word. r e l ea s e38 %Excel . r e l ea s e39 %Excel2 . r e l ea s e40 zip ( [pwd, ’ \ zip\ ’ , studentnumber , ’ . z ip ’ ] , [pwd, ’ \ ’ , studentnumber ] )%压缩一个文件

夹。 f u l l f i l e 函数是值得一用的41 %zip ( [pwd, ’\ zip \ ’ , studentnumber , ’ . zip ’ ] , { [ studentnumber , ’ . doc ’ ] , [ studentnumber ,

’ . pdf ’ ] , [ studentnumber , ’ . xls ’ ] } , myfolder )%压缩文件,不含文件夹42 end43

下面是生成的具体的试卷、答案和答题卡,以及压缩文件。生成的试卷如图 (4.9) 所示。生成的答案如图 (4.10a) 所示,答题卡如图 (4.10b) 所示,压缩文件内容如图 (4.10c) 图所示。

http://www.ma-xy.com 105 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.1 MATLAB LINK WORD/EXCEL 第四章 MATALB LINK

(a) (b)

(c)图 4.10: 答案、答题卡和压缩文件

图 4.9: 生成的试卷

答案、答题卡和压缩文件

通过 matlab 将试卷 or 答案发送到邮箱

http://www.ma-xy.com 106 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.2 MATLAB LINK R

4.2 matlab link R

这里我们使用 R-link 工具包来实现 MATLAB 链接 R。首先,我们需要安装一些工具,安装过程如下:

(1). 安装 R,这当然是必须的了¬­。

(2). 下载并安装 Rcom server(这一步是至关重要的)®¯°±。R (D)COM Server and RExcel介绍如下:

This package contains a DCOM server used to connect a client application (e.g. MicrosoftExcel) with R.

R (D)COM Server provides a COM-Interface to R as well as various COM objects andActive X controls for your applications. Additionally, an Add-In for Microsoft Excel is providedto easily use R in Excel and create statistical applications with Excel as the main GUI. The mainfeatures of this package are:

COM server for local and remote use of R transfer of data into/from R, including NA,NaN,... Active X Controls for text and graphics output Installation/Uninstallation Repositoryfor R instances for shared and exclusive access Many Samples Excel Add-In

For more information see the documentation installed with the R (D)COM Server and visitthe project’s home page at http://sunsite.univie.ac.at/rcom. Author(s)

Thomas Baier and Erich Neuwirth1 # 用管理员身份运行R or Rstudio2 options ( i n s t a l l . packages . check . source = ”no” )3 i n s t a l l . packages ( c ( ” rscproxy” , ”rcom”) , repos=”http : //rcom . univie . ac . at/download” , l i b=.Library ,

type=”win . binary” )4 l i b ra ry (rcom)5 comRegisterRegistry ()6

程辑包‘rscproxy’是用 R 版本 3.2.2(这里一定要注意 R 版本的要求)² 来建造的;

(3). 下载 MATLAB R-link³ 并把里面的 m 文件复制到 MATLAB 的工作目录下;(4). 加载 rcom 包,注意,在 MATLAB 中调用 R 时,一定要打开 R 加载 rcom(r-GUI 下,

程序包-安装程序包,从里面找到 rcom);(5). 用 MATLAB R-link 里面的 m 文件试验一下

1 %% Connecting MATLAB to R2 % The s t a t i s t i c a l programming language R has a COM inte r f a c e . We can use3 % thi s to execute R commands from within MATLAB.

¬http://cran.r-project.org/­https://www.rstudio.com/products/rstudio/download-server-2/®https://cran.r-project.org/contrib/extra/dcom/00ReadMe.html¯http://homepage.univie.ac.at/erich.neuwirth/php/rcomwiki/doku.php?id=wiki:how_to_install#further_remarks°http://www.statconn.com/±http://rcom.univie.ac.at/download.html#RPackages_rcom²https://cran.r-project.org/src/base/R-3/³http://cn.mathworks.com/matlabcentral/fileexchange/5051-matlab-r-link?s_tid=srchtitle

http://www.ma-xy.com 107 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.2 MATLAB LINK R 第四章 MATALB LINK

4 %% Connect to an R Session5 openR6 %% Push data into R7 a = 1 :10 ;8 putRdata( ’a ’ , a )9 %% Run a simple R command

10 b = evalR ( ’a^2 ’ )11 %% Run a s e r i e s of commands and grab the r e su l t12 evalR ( ’b <− a^2 ’ ) ;13 evalR ( ’ c <− b + 1 ’ ) ;14 c = getRdata ( ’ c ’ )15 %% Close the connection16 closeR17

MATLAB R - link 基于 COM 接口,允许我们在 MATLAB 中调用 R 函数,可调用的函数如表 (4.4) 所示

表 4.4: R-link 函数命令

命令 说明

openR 连接到一 R 个服务器进程evalR 运行 R 命令

getRdata R 变量复制到 MATLABputRdata MATLAB 数据复制到一个 R 变量中

closeR 关闭 R 进程服务器Rdemo 在 MATLAB 里利用 R 的一个例子

MATALB R - link 中使用了 R 的 COM 接口 StatConnectorSrv.StatConnector,如下1 R_lInK_hANdle = actxserver ( ’ StatConnectorSrv . StatConnector ’ ) ;2 R_lInK_hANdle . In i t ( ’R’ ) ;3

我们将 R 的 COM 打开,如图 (4.11) 所示,由此我们可以据此来设计其它的 link 方法。

http://www.ma-xy.com 108 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.3 MATLAB LINK PYTHON

图 4.11: R COM 接口

4.3 matlab link python

MATLAB 从 R2014b 开始就可以调用 Python 了´。Python 的某些库比 MATLAB 要好用,因此,MATLAB 和 Python 的互相调用是必不可少的事情。下面,我们来介绍用 MATLAB 调用 Python。

4.3.1 系统配置需求

在 MATALB 中调用 Python 时需要特定的 Python 版本,MATLAB(2014) 支持的 Python版本有 2.7、3.3、3.4(这里不仅要注意 Python的版本,还要注意 Python是 32位还是 64位)。高版本的 MATLAB应该已经支持所有 Python版本了。如果有版本限制,我们可以使用 pyversion函数确定系统的版本。我们不能在一个 MATLAB 会话时切换 Python 的版本。如果你想改变版本,重启 MATLAB,然后运行 pyversion version 或 pyversion executable(for Windows)。注意: 如果你下载一个 Python 解释器,但没有在 Windows 注册表中登记它,要使用 pyversionexecutable来设置 Python的版本。pyversion查看和改变 python解释器,其语法 (Syntax)如下

1 pyversion %查看Python的信息,返回结果如下:2 >>> vers ion : ’ 2.7 ’3 executable : ’C:\Python27\python . exe ’4 l i b ra ry : ’C:\windows\system32\python27 . d l l ’5 home : ’C:\Python27 ’6 i s loaded : 07 [ version , executable (可执行的 ) , i s loaded ] = pyversion% 返回Python的信息8 [ version , executable , i s loaded ] = pyversion vers ion % 设置Python的路径9 [ version , executable , i s loaded ] = pyversion executable %设置Python的路径

10

´http://cn.mathworks.com/help/matlab/getting-started_buik_wp-3.html

http://www.ma-xy.com 109 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.3 MATLAB LINK PYTHON 第四章 MATALB LINK

4.3.2 Python 的基本使用

Python 的帮助函数

查看 Python 的帮助1 % 包的帮助

2 py . help ( ’ textwrap ’ )3 % 类的帮助

4 py . help ( ’ textwrap .TextWrapper ’5 % 类的方法的帮助

6 py . help ( ’ textwrap .TextWrapper .wrap ’ )7 % 函数的帮助

8 py . help ( ’ textwrap . f i l l ’ )9

调用用户定义的 Python 模块

复制下面这些命令并保存文件 mymod.py1 # mymod. py2 ”””Python module demonstrates passing MATLAB types to Python funct ions ”””3 def search (words ) :4 ”””Return l i s t of words containing ’ son ’ ”””5 newl ist = [w for w in words i f ’ son ’ in w]6 return newl ist7 def theend (words ) :8 ”””Append ’The End ’ to l i s t of words”””9 words . append( ’The End ’ )

10 return words11

添加当前文件夹于 Python 搜索路径1 f count (py . sys . path , ’ ’ ) == 02 i n s e r t (py . sys . path , int32 (0) , ’ ’ ) ;3 end4 N = py . l i s t ({ ’ Jones ’ , ’ Johnson ’ , ’James ’ })5 names = py .mymod. search (N)6

重新加载修改用户定义的 Python 模块,拷贝 myfunc 函数并保存文件 mymod.py 。1 def myfunc () :2 ”””Display message . ”””3 return ’ vers ion 1 ’4

重新加载修改用户定义的 Python 模块1 py .mymod.myfunc %调用 myfunc2 c l ea r c l a s s e s %卸载模块3 mod = py . importl ib . import_module( ’mymod’ ) ; %导入修改模块4 py . reload (mod) ; %重新加载模块 (在Python 2.7版本 )5 py . imp . reload (mod) ; %重新加载模块 (在Python 3.3版本 )

http://www.ma-xy.com 110 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.3 MATLAB LINK PYTHON

6 py . importl ib . re load (mod) ; % 重新加载模块 (在Python 3.4版本 )7 py .mymod.myfunc %在更新模块中调用函数(如果模块中的函数被修改)8

Python import and MATLAB import Commands

1 import x . y % from x import y2 %例如,导入Python textwrap 模块 wrap的文本块。3 S = py . textwrap .wrap( ’This i s a s t r ing ’ ) ;4 % 等价于

5 import py . textwrap .wrap6 S = wrap( ’This i s a s t r ing ’ ) ;7 c l ea r import8

捕获的 Python 异常错误信息 matlab.exception.PyException

捕获错误和异常的命令如下

e = matlab.exception.PyException(msgID,errMsg,excObj)其中:msgID - Message identifier(character vector); errMsg - Error message(character vector);excObj - Exception object(pythonclass); e - Exception object(exception object)。示例如下面程序所示,更多的关于捕获异常的例子参见µ。

1 try2 py . l i s t ( ’x ’ , ’y ’ ,1)3 catch e4 e . message5 i f ( i s a ( e , ’matlab . exception . PyException ’ ) )6 e . ExceptionObject7 end8 end9 %ans = Python Error : TypeError : l i s t ( ) takes at most 1 argument (3 given )

10 ans = Python tuple with no propert i e s .11 (<type ’ exceptions . TypeError ’>, TypeError ( ’ l i s t ( ) takes at most 1 argument (3 given )

’ , ) , None)12

未定义的变量或函数“py”

当你输入 py 发生失败:Undefined variable ”py” or function ”py.command” 时,可以进行如下的故障排查:

1、Python 没有安装。从 https://www.python.org/downloads 下载并安装 Python 。如果你运行一个 64 位版本的 MATLAB, 下载一个 64 位版本的 Python, 被命名为“窗口 x86 - 64 MSI安装程序”。

2、你安装了一个 32 位版本的 Python 64 位版本 MATLAB。µhttp://cn.mathworks.com/help/matlab/matlab_prog/capture-information-about-errors.html

http://www.ma-xy.com 111 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.3 MATLAB LINK PYTHON 第四章 MATALB LINK

3、MATLAB 无法找到 Python。可以使用 pyversion 函数来指定 Python 的路径。例如1 pyversion C:\ Users\uname\WinPython−64bit −3.3.2.1\python−3.3.2.amd64\python . exe2

如果你下载一个 Python 解释器,但没有在 Windows 注册表中登记它,使用命令:pyversionexecutable 指定 Python 的位置。

4、有一个错误的用户定义的 Python 模块。py.importlib.import_module(’mymod’) 用来测试你的模块 mymod 包含错误类型。如果 Python 模块检测到一个错误,MATLAB 显示器显示Python 的错误消息。另外,Python 命令执行的命令 Python 错误消息提示。修正错误后,访问更新模块,重启 MATLAB,并将其添加到搜索路径。

5、Python 模块不是 Python 搜索路径。如果命令是一个有效的 Python 命令,我们要确保Python模块在 Python搜索路径。为了测试模块mymod在搜索路径上,使用 py.importlib.import_module(’mymod’)。如果 Python 没有找到模块,MATLAB 显示器 Python 的错误消息。在文件夹中添加 mymodmodpath :

1 P = py . sys . path ;2 i f count (P, ’modpath ’ ) == 03 i n s e r t (P, int32 (0) , ’modpath ’ ) ;4 end5

6、模块名称冲突。Python 试图在错误的模块执行命令。如果命令在一个用户定义的模块,确保模块名称与 Python 标准模块并不冲突。

Unsupported MATLAB Types

下面是一些 Python 不支持的 MATLAB 数据结构:1.Multidimensional(多维的) arrays(数组) (numeric(数), char, or cell);2.Structure arrays;3.Complex, scalar integers or arrays;4.Sparsearrays;5.Logical vectors;6.categorical;7.table;8.containers.Map;9.datetime types;10.MATLABobjects;11.meta.class (py.class).

Call Methods on Python Variables

1 P = py . sys . path ;2 % 显示Python l i s t 的方法:3 methods(P)4 >>> Methods fo r c l a s s py . l i s t :5 append count display ge in s e r t l t plus reverse6 c e l l d e t a i l s eq gt l e mtimes pop sort7 char disp extend index l i s t ne remove8 py . help ( ’ l i s t . append ’ ) % 阅读append的文档9 >>> l i s t . append = append ( . . . )

10 L. append( object ) −− append object to end11 append(P, pwd) % 添加当前文件夹的路径

12 py . len (P)13 >>> ans =14 Python int with propert i e s :

http://www.ma-xy.com 112 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.3 MATLAB LINK PYTHON

15 r ea l : [1 x1 py . int ]16 denominator : [1 x1 py . int ]17 imag : [1 x1 py . int ]18 numerator : [1 x1 py . int ]19 1120 % 11 是这条路经下的文件夹的数量。21

Call Python eval Function

1 py . help ( ’ eval ’ ) %阅读的帮助2 >>> Help on bui l t−in function eval in module __builtin__ :3 eval ( . . . )4 eval ( source [ , g loba l s [ , l o c a l s ] ] ) −> value5

6 Evaluate the source in the context of g loba l s and l o ca l s .7 The source may be a s t r ing represent ing a Python express ion8 or a code object as returned by compile ( ) .9 The globa l s must be a dict ionary and l o ca l s can be any mapping ,

10 defaul t ing to the current g loba l s and l o ca l s .11 I f only g loba l s i s given , l o c a l s de fau l t s to i t .12 % 创建一个Python dict 变量。13 workspace = py . d ict ( pyargs ( ’x ’ ,1 , ’y ’ ,6) )14 >>> workspace =15 Python dict with no propert i e s .16 { ’y ’ : 6 .0 , ’x ’ : 1.0}17 % 对表达式求值。

18 res = py . eval ( ’x+y ’ ,workspace )19 >>> res = 720 % 添加两个数字没有分配变量。 通过一个空 dict 价值 为 全局变量 参数。

21 res = py . eval ( ’1+6 ’ ,py . d ict )22 >>> res = 723

4.3.3 Python 和 Matlab 的数据结构

字符串

在 Python method 中输入 MATLAB 的向量 (变量)1 f o lde r = f u l l f i l e (matlabroot , ’ help ’ , ’ examples ’ ) ; % Create a MATLAB var iable (变量 ) .2 F = py . os . l i s t d i r ( f o lde r )% MATLAB automatical ly (自动的 ) converts (转换 ) f o lde r to the

Python s t r type .3 >>> F =4 Python l i s t with no propert i e s .5 [ ’ graphics ’ , ’ graphics2 ’ , ’matlab ’ ]6

在 MATLAB 中使用 Python str 类型 (这个例子说明 matlab 和 python 的 str 不是同一 class)1 p = py . os . path . pathsep

http://www.ma-xy.com 113 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.3 MATLAB LINK PYTHON 第四章 MATALB LINK

2 c = pathsep3 c = ;4 i s equa l ( c l a s s (p) , c l a s s ( c ) ) % Compare the MATLAB var iable (变量的 ) type to the Python

type .5 ans = 0 %A py . s t r type i s not equivalent (等价的 ) to a MATLAB char type .6 f = [ ’ myfi le ’ char (p) ] %Convert p to a MATLAB type and append(附加 ) the character to

a f i l e name .7 f = myfi le ;8

Python 字符串的索引1 s t r = ’ myfi le ’ ;% Create a MATLAB character vector and display the f i r s t character .2 s t r (1)3 ans = m4 pstr = py . s t r ( s t r ) ; %Convert (转变 ) the character vector to a Python s t r type and

display the f i r s t character .5 pstr (1)6 ans = Python s t r with no propert i e s .7 m8

通过 MATLAB 反斜杠控制字符1 py . s t r ( sp r in t f ( ’The rain\nin Spain . ’ ) )% Python rep laces \n with a new l i n e .2 >>> ans =3 Python s t r with no propert i e s .4 The rain5 in Spain .6 py . s t r ( ’The rain\nin Spain . ’ )% Without the sp r in t f function , both MATLAB and Python

interpre t (说明 ) \ as a l i t e r a l (文字的 ) backslash (反斜杠 ) .7 >>> ans =8 Python s t r with no propert i e s .9 The rain\nin Spain .

10 s p l i t (py . s t r ( ’The rain\nin Spain . ’ ) )% Pass th i s s t r ing to a Python st r ing method ,s p l i t .

11 >>> ans =12 Python l i s t with no propert i e s .13 [ ’The ’ , ’ ra in \\nin ’ , ’ Spain . ’ ]14

列表

创建 Python 列表变量1 students = py . l i s t ({ ’Robert ’ , ’Mary ’ , ’ Joseph ’ }) % 创建python列表变量2 >>> students =3 Python l i s t with no propert i e s .4 [ ’Robert ’ , ’Mary ’ , ’ Joseph ’ ]5 n = py . len ( students )# Display number of students in the l i s t .6 >>> n = 37

在 MATLAB 中使用 Python 列表类型

http://www.ma-xy.com 114 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.3 MATLAB LINK PYTHON

1 P = py . sys . path ;% Create a Python l i s t2 c l a s s (P)3 >>> ans = py . l i s t4 cP = c e l l (P) ; %Convert l i s t P to a MATLAB type . The f i r s t step i s to convert (转变 )

the l i s t to a c e l l array (数组 ) of f o lde r names , cP .5 c l a s s (cP)6 >>> ans =c e l l7 c l a s s (cP{1}) % Each fo lde r name i s a Python st r ing .8 >>> ans =py . s t r9 ce l lP = ce l l f un (@char , c e l l (P) , ’UniformOutput ’ , f a l s e ) ; %create ce l lP using the c e l l f un

function to combine the conversion (转换 ) funct ions .10 % Display the fo lde r names .11 f o r n=1:py . len (P)12 disp ( ce l lP{n})13 end14

将 Python数值类型列表转化为MATLAB double数组。Suppose that you have a Python functionthat returns the following list of integers, P.

1 >>> P =2 Python l i s t with no propert i e s .3 [ 1 , 2 , 3 , 4 ]4 % Display the numeric (数 ) type of the values .5 c l a s s (P{1})6 ans = int647 cP = c e l l (P) ;% Convert P to a MATLAB c e l l array (数组 ) .8 A = ce l l f un (@double , cP) % Convert (转变 ) the c e l l array to a MATLAB array of double .9 >>> A = 1 2 3 4

10

Python 列表的索引1 C = {1 ,2 ,3 ,4};2 n = C(end)3 n = [ 4 ] %MATLAB returns a c e l l array .4 n = C{end}% Display the contents of the l a s t element .5 >>> n = 46 l i = py . l i s t (C) %Convert (转变 ) the c e l l array to a Python l i s t .7 >>> l i =8 Python l i s t with no propert i e s .9 [ 1 . 0 , 2 .0 , 3 .0 , 4 . 0 ]

10 n = l i (end) %Display the l a s t element . returns a l i s t .11 >>> n =12 Python l i s t with no propert i e s .13 [ 4 . 0 ]14 n = l i {end}% Display the contents of the l a s t element .15 >>> n = 416

在 for 循环中 display Python 列表值1 l i = py . l i s t ({1 ,2 ,3 ,4}) ;2 f o r n = l i

http://www.ma-xy.com 115 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.3 MATLAB LINK PYTHON 第四章 MATALB LINK

3 disp (n{1})4 end5

This example shows how to pass a MATLAB cell array to a Python function. 将下面的程序保存为 mymod.py

1 # mymod. py2 ”””Python module demonstrates passing MATLAB types to Python funct ions ”””3 def search (words ) :4 ”””Return l i s t of words containing ’ son ’ ”””5 newl ist = [w for w in words i f ’ son ’ in w]6 return newl ist7 def theend (words ) :8 ”””Append ’The End ’ to l i s t of words”””9 words . append( ’The End ’ )

10 return words11

1 P = py . sys . path ;2 append(P, pre fd i r ) ;% Add the fo lde r containing mymod. py to the Python search path

using the append method of the l i s t type .3 load pat ients .mat4 L = py . l i s t (LastName ’ ) ; %Convert (转变 ) the c e l l array to a 1−by−N py . l i s t array .5 c l a s s (L)6 >>> ans = py . l i s t7 py .mymod. theend (L) ; %Call mymod. theend on the l i s t .8 L{end}9 >>> ans =

10 Python s t r with no propert i e s .11 The End12

读取嵌套列表类型的元素

1 matrix = py . l i s t ({{1 , 2 , 3 , 4} ,{ ’ he l l o ’ , ’ world ’ } ,{9 , 10}}) ;2 disp ( char (matrix{2}{2}) )% Display element ’world ’ , at index (2 ,2) .3 %% 显示元素的范围

4 l i = py . l i s t ({ ’a ’ , ’ bc ’ ,1 ,2 , ’ def ’ }) ;5 l i ( 1 : 2 : end)6

元组 tuple

1 % 1.创建Python tuple变量2 student = py . tuple ({ ’Robert ’ ,19 , ’ Biology ’ })3 % 2.在MATLAB中使用Python tuple类型4 pn = py . os . path . s p l i t ( ’C:\Program Fi l e s \MATLAB\R2014a\help\examples ’ )5 head = char (pn{1})6 t a i l = char (pn{end})7 head =C:\Program Fi l e s \MATLAB\R2014a\help8 t a i l = examples9 % 3.Python Tuple索引

http://www.ma-xy.com 116 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.3 MATLAB LINK PYTHON

10 t = py . tuple ({ ’a ’ , ’ bc ’ ,1 ,2 , ’ def ’ }) ;11 t (1 :2 )12 % 4.创建单个Python tuple变量 (只包含一个元素的 tuple)13 subject = py . tuple ({ ’ Biology ’ })14

字典 dict

1 % 1.创建Python dict类型变量2 studentID = py . d ict ( pyargs ( ’Robert ’ ,357 , ’Mary ’ ,229 , ’ Jack ’ ,391) )3 % 2.在MATLAB中使用Python dict类型4 keys ( studentID ) % Use the Python keys function to display the menu items .5 values ( studentID ) % Use the Python values function to display the pr i ce s .6 p = c e l l ( values ( studentID ) )% Use the c e l l function to convert the Python l i s t to a

MATLAB var iable .7 pr i ce s = ce l l f un (@double , p)%Convert the pr i ce s to a MATLAB array .8 to ta l = sum( pr i ce s )%Calculate the to ta l .9 % 3.索引Python dict类型

10 customers = py . d ict %Create a dict ionary var iab le (变量 ) .11 customers{ ’Smith ’} = int32 (2112) ;12 customers{ ’Anderson ’} = int32 (3010) ;13 customers{ ’Audrey ’} = int32 (4444) ;14 customers{ ’Megan ’} = int32 (5000) ;15 acct = customers{ ’Anderson ’}16 acct = 301017 c l a s s ( acct )18 >>> ans = double19 % 4. change a value in a dict var iab le using the Python update method .20 menu = py . d ict ( pyargs ( ’ soup ’ ,3 .57 , ’ bread ’ ,2 .29 , ’ bacon ’ ,3 .91 , ’ salad ’ ,5 .00) ) ;21 update (menu, py . d ict ( pyargs ( ’ bread ’ ,2 .50) ) ) %Update the pr ice fo r bread using the

Python dict type update method .22 % 5.Python dict类型转换为MATLAB结构23 patient % Suppose a Python function returns a variable , patient , with the fo l lowing

values .24 >>> patient =25 Python dict with no propert i e s .26 { ’ test1 ’ : array ( ’d ’ , [ 79 . 0 , 75.0 , 73 . 0 ] ) ,27 ’ t e s t3 ’ : array ( ’d ’ , [ 220 .0 , 210.0 , 205 .0 ] ) ,28 ’ t e s t2 ’ : array ( ’d ’ , [ 180 .0 , 178.0 , 177 .5 ] ) ,29 ’name ’ : ’John Doe ’}30 P = struct ( patient ) %Convert patient to a MATLAB structure .31 >>> P =32 test1 : [1 x1 py . array . array ]33 test3 : [1 x1 py . array . array ]34 test2 : [1 x1 py . array . array ]35 name : [1 x8 py . s t r ]36

numbers

http://www.ma-xy.com 117 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.3 MATLAB LINK PYTHON 第四章 MATALB LINK

1 % 1.在MATLAB使用Python数值类型2 pynum = py .math . radians (90)3 c l a s s (pynum)% MATLAB automatical ly (自动的 ) converts (转化 ) Python f l o a t type to double

.4 % 2.调用Python方法与数值参数5 load pat ients .mat6 c l a s s (Height )7 >>> ans =double8 s i z e (Height )9 >>> ans = 100 1

10 py .math . fsum(Height ’ )% Transform Height to a 1−by−N matrix before ca l l i n g fsum .11 >>> ans =670712 % 3.在MATLAB中使用Python数组类型13 P = %Suppose(假设) that you have a Python function that returns the fo l lowing array

, P14 Python array with propert i e s :15 i temsize : 816 typecode : [1 x1 py . s t r ]17 array ( ’d ’ , [ 1 . 0 , 2 .0 , 3 .0 , 4 .0 , 5 . 0 ] )18 A = double (P) ; %Convert P to a MATLAB array of type double .19 sum(A) % Sum the elements of A.20 >>> ans =521

关键字

1 %% The Python bui lt−in pr int function has keyword arguments , sep , end , and f i l e .2 print (* objects , sep=’ ’ , end=’\n ’ , f i l e=sys . stdout )3 % The fo l lowing examples use the default value fo r f i l e .4 % Create some text var iab le s (变量 ) .5 x1 = py . s t r ( ’ c : ’ ) ;6 x2 = py . os . curdir ;7 x3 = py . os . getenv ( ’ foo ’ ) ;8 py . pr int (x1 , x2 , x3)9 >>> c : . None

10 % To display the values on separate l ines , use newline , \n , as a separator (分离器 ) .11 py . pr int (x1 , x2 , x3 , pyargs ( ’ sep ’ , sp r i n t f ( ’ \n ’ ) ) )12 >>> c :13 .14 None15 % Use the fo l lowing statement (声明 ) to change sep to an empty st r ing and change the

end value to display THE END.16 py . pr int (x1 , x2 , x3 , pyargs ( ’ end ’ , sp r i n t f ( ’ THE END\n ’ ) , ’ sep ’ ,py . s t r ) )17 >>> c : . None THE END18

函数

This example shows how to display the length of each word in a list.

http://www.ma-xy.com 118 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.3 MATLAB LINK PYTHON

1 days = py . l i s t ({ ’Monday ’ , ’Tuesday ’ , ’Wednesday ’ , ’Thursday ’ , ’ Friday ’ }) ; %Create a l i s tof days of the work week .

2 % Apply the Python len function to the py .map function to display the length of eachword . Use the MATLAB function handle notation (符号 ) , @, to ind icate py . len i s a function .

3 py .map(@py. len , days )4 >>> ans =5 Python l i s t with no propert i e s .6 [ 6 , 7 , 9 , 8 , 6 ]7 % Python vers ion 2.7 returns a l i s t .8 % Python vers ions 3 . x return a map object . To display the contents , type :9 py . l i s t (py .map(@py. len , days ) )

10 >>> ans =11 Python l i s t with no propert i e s .12 [ 6 , 7 , 9 , 8 , 6 ]13

4.3.4 MATLAB 和 Python 之间的转换

MATLAB 与 Python 在创建列表、元组、字典之间的差异

The following table(4.5) shows the commands for creating list, tuple, and dict types. Thecommands on the left are run from the Python interpreter(解释者). The commands on the rightare MATLAB commands.

表 4.5: the commands for creating list, tuple, and dict types

Python Matlab

Python list - [] MATLAB py.list[′Robert′,′Mary′,′ Joseph′] py.list({′Robert′,′Mary′,′ Joseph′})[[1, 2], [3, 4]] py.list({py.list([1, 2]), py.list([3, 4])})Python tuple - () MATLAB py.tuple(′Robert′, 19,′Biology′) py.tuple({′Robert′, 19,′Biology′})Python dict - {} MATLAB py.dict{′Robert′ : 357,′ Joe′ : 391,′Mary′ : 229} py.dict(pyargs(′Robert′, 357,′Mary′, 229,′ Joe′, 391))

MATLAB Type to Python Type Mapping

When you pass MATLAB data as arguments to Python, MATLAB converts the data intotypes that best represent the data to the Python language 表 (4.6).

处理从 Python 回来的数据

Automatic(自动的) Python Type to MATLAB Type Mapping The following table showshow MATLAB converts data returned from Python into MATLAB types 表 (4.7).

http://www.ma-xy.com 119 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.3 MATLAB LINK PYTHON 第四章 MATALB LINK

表 4.6: MATLAB Type to Python Type Mapping

MATLAB Input Argument Type - Scalar Values Only Resulting Python Type

double single floatComplex single Complex double complexint8 uint8 int16 uint16 int32 intuint32 int64 uint64 int long(onlyversion2.7)NaN float(nan)Inf float(inf)logical boolStructure dictPython object - py.type typefunction handle @py.module.function, to Python functions only module.function

表 4.7: 处理从 Python 回来的数据

Python Return Type, as Displayed in Python Resulting MATLAB Type - Scalar

bool logicalint (version 2.7 only) int64float doublecomplex Complex doubleAll other Python types - type Python object - py.type

MATLAB provides the following functions to convert Python data types to MATLAB typesmanually(手动地) 表 (4.8).

http://www.ma-xy.com 120 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第四章 MATALB LINK 4.4 MATLAB LINK SQL

表 4.8: 处理从 Python 回来的数据 2

Python Return Type or Protocol, as Displayed in MATLAB MATLAB ConversionFunction

py.str (version 2.7) char uint8py.str (version 3.x) charpy.unicode charObject with _str_ method charpy.bytes uint8py.int double or int64py.long double or int64py.array.array numeric double single int8py.array.array uint8 int16 uint16 int32py.array.array uint32 int64 uint64Sequence protocol; for example, py.list and py.tuple cellMapping protocol; for example, py.dict struct

4.4 matlab link SQL

4.5 matlab link C java

http://www.ma-xy.com 121 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om4.5 MATLAB LINK C JAVA 第四章 MATALB LINK

http://www.ma-xy.com 122 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较

5.1 背景

整本书都少有介绍时间序列模型,这是一个非常大的遗憾,因此,我们利用这章来简单的介

绍一些时间序列模型¬。在这一部分中,我们比较了 ARMA 和 GARCH 族模型在股票收益率上的建模效果。文中所有模型均为 p = 1 和 q = 1 的状态,所有模型均在正态分布下进行。利用

FB 收益率作为样本收益率进行分析,采用模型信息、残差检验以及模型拟合指标等方法评价各模型,并得到相应的结论。

对股票收益率的建模一直以来都是统计与金融经济研究的重点。如果我们能够很好的描述收

益率预估收益率,这将对我们今后的投资产生巨大的帮助,例如:我们可以在收益率模型的基础

上建立组合投资模型,收益率的方差就是投资中的风险所在 (这里,我们直接对收益率进行建模,因此说收益率即为误差项)。但不幸的是:收益率具有随机性、波动聚集性、杠杆效应和厚尾特征等特性,这使得我们很难建立好的模型来拟合收益率。经过前人们的不断努力,人们对收益率的

认知越来越丰富,可以说每一个收益率都是一个独特的个体,每个个体有其自身的特性,而众多

的收益率在一起,则表现出一些共性 (随机性、杠杆效应、厚尾特征等等),因此,对收益率的建模会多种多样。既然对某个收益率而言,我们有如此多的模型可以选择,那么问题来了:就单一

收益率而言,哪个模型更为合适?哪个模型适合大多数收益率?接下来的内容主要解决这第一个

问题。我们选取某一收益率 (FB 收益率) 进行分析,首先介绍 ARMA 和 GARCH 族模型,然后将模型应用到 FB 上,最后进行模型的评价。值得一提的是:我们此次是在单一的 FB 时间序列上进行分析,后期,我们会扩展到一些多元时间序列模型。

5.2 FB 收益率序列基本分析

5.2.1 FB 收益率的描述统计

在进行收益率描述与建模之前,我们有必要设置一下符号。从 yahoo财经上获取 2014/05/22至 2015/12/01 的 FB 闭市股票数据,设 Pt 为 t 时刻的股票值,时长为 T,设收益率为 xt

xt = ln(

PtPt−1

)¬此部分主要是为了介绍各种 GARCH 模型

123

http:/

/www.m

a-xy.c

om5.2 FB 收益率序列基本分析 第五章 证券收益率的 GARCH 族模型比较

将收益率序列记为 {xt}Tt=1,因为文中建立的是时间序列模型,所以,我们设定单一的 xt 为随机

变量,而 {xt} 为随机过程,具体的 {xt} 的值为随机过程的一次样本实现。我们先来描述一下 {xt} 的统计特征,值得一提的是:本应该先对其进行平稳性分析,只有

当 {xt}为平稳过程时,统计分析与建模才有意义。这里,我们将平稳性等检验放在后面进行。从2014/05/22 开始,由于进行了差分运算,所以 {xt} 从 2014/05/23 开始,对其进行基本统计分析,发现 {xt} 最小收益率为-0.062716,最大收益率为 0.050465,平均收益率为 0.001483,绘制{xt} 的序列图如图 (5.1) 所示

图 5.1: FB 收益率序列图

发现收益率序列围绕 0 上下波动,并且具有一定的波动聚集性,表现为大的波动后面紧接大的波动。绘制 {xt} 的序列直方图并进行非参数密度估计如图 (5.2) 所示。

图 5.2: 收益率序列直方图及核密度估计

发现收益率序列具有一定的对称性,并且结合图 (5.2) 和图 (5.3),我们可看到收益率序列相对正态分布而言具有厚尾的特点,并且在 K-S 检验下,收益率非正态。

http://www.ma-xy.com 124 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.2 FB 收益率序列基本分析

图 5.3: 收益率序列 QQ 图

5.2.2 FB 收益率的基本分析

平稳性检验

序列具有平稳性是我们建立模型的前提 (ARMA/GARCH 均是在平稳序列上建立的模型),在平稳的条件下,我们才可以利用时间遍历性对序列进行分析,为此,我们先对 {xt} (为便于书写,下面将 {xt} 写为 xt ) 进行平稳性检验。平稳性检验有许多方法,例如:非参数的游程检验法,ADF 单位根检验法,PP(Phillips-Perron) 检验法 (R-uroot-pp.test) 等。我们利用 ADF 单位根检验来检验 xt 的平稳性,ADF 有三种检验类型:无常数无趋势 1、有常数无趋势 2、有常

数有趋势 3。具体内容可参见一般时间序列教材 (如:《应用时间序列分析》王黎明 P232)。三种ADF 检验的结果如表 (5.1) 所示。

表 5.1: 收益率序列的三种 ADF 检验

Test regression none1 p-value: < 2.2e-16 Value of test-statistic is: -14.745Test regression drift2 p-value: < 2.2e-16 Value of test-statistic is: -14.872Test regression trend3 p-value: < 2.2e-16 Value of test-statistic is: -14.851

经过 ADF 检验后,发现其 P 值 < 0.05,在 0.05 的显著水平下拒绝原假设,原假设为有一个单位根 (非平稳),可以说明 xt 为平稳时间序列。

相关性检验

相关性检验是重要的。如果序列不具有相关性,或者说序列为纯随机序列,那么我们也就没

有建模的必要,接下来进行的相关性检验是线性相关性检验。利用 Ljung-Box 和 Box-Pierce 进行相关性检验,原假设假设序列为纯随机序列,检验后发现在 0.05 的显著水平下拒绝原假设,序列 xt 具有一定相关性。绘制收益率序列的自相关和偏自相关图,如图 (5.4) 所示。

http://www.ma-xy.com 125 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.2 FB 收益率序列基本分析 第五章 证券收益率的 GARCH 族模型比较

图 5.4: 收益率自相关偏自相关图

ARCH 检验

下面,我们将进行收益率序列的 ARCH 效应检验。ARCH 效应的检验方法有许多,例如:LM(拉格朗日乘数检验)、McLead-Li-Test 等,ARCH 说明收益率具有波动聚集的特点,我们先来绘制 x2t 的序列图及其自相关偏自相关图,如图 (5.5) 所示。可以发现,相对于 xt 而言,其平

方序列 x2t 具有更强的相关性,并且波动聚集明显。

图 5.5: 收益率序列平方的自相关偏自相关图

我们对 xt 序列进行 ARCH 效应检验,先进行 LMtest 检验,检验原假设为 xt 无 ARCH 效应,检验的滞后期为 4、8 和 12(这是时间序列可能存在的周期),得到的检验结果如表 (5.2) 所示。

http://www.ma-xy.com 126 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.3 FB 收益率的 GARCH 族模型建模

表 5.2: 收益率序列的 ARCH 效应检验

ARCH LM-test, Null hypothesis: no ARCH effects

Chi-squared = 16.44 df = 4 p-value = 0.00248Chi-squared = 18.21 df = 8 p-value = 0.01971Chi-squared = 22.444 df = 12 p-value = 0.03283

利用 McLead-Li-Test 进行检验,检验原假设为 xt 无 ARCH 效应,得到的检验结果如图(5.6) 所示。二者的结果说明收益率序列 xt 具有 ARCH 效应。

图 5.6: 少收益率序列的 McLead-Li ARCH 效应检验结果图

5.3 FB 收益率的 GARCH 族模型建模

在收益率序列平稳的基础上对其进行建模,建立的模型主要是 ARMA 和 GARCH 族,为简单,将所有模型统一建立为 (p, q) = (1, 1),模型扰动项 εt 服从条件正态分布,为

ηt ∼ N(0, 1), εt|Φt ∼ N(0, σ2t )

当然,扰动项可以服从其它分布,例如:t 分布,学生 t 以及广义误差分布 GED 等。分布不同,估计的极大似然不同,模型结果也就不同,因此,我们可以比较不同分布下的模型优良,但此问

题并非我们所要讨论的。由于有不同的分布,我们在下面的模型介绍中,将其统一记为

ηt ∼ f, εt|Φt ∼ f(σ2t )

http://www.ma-xy.com 127 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.3 FB 收益率的 GARCH 族模型建模 第五章 证券收益率的 GARCH 族模型比较

5.3.1 ARMA

Box and Jenkins 于 1970 年撰写的《Time Series Analysis:Forecasting and Control》是时间序列发展的里程碑。ARMA 的一般模型如下:

xt = c+

p∑i=1

ϕixt−i + εt −q∑j=1

φjεt−j

εt ∼WN(0, σ2)

我们在文中对 xt 建立了 ARMA(1,1) 模型,ARMA(1,1) 为xt = c+ ϕ1xt−1 + εt − φ1εt−1

εt ∼WN(0, σ2)

E(Xs, εt) = 0,∀s < t

5.3.2 GARCH

收益率序列存在厚尾现象、波动聚集现象以及变方差 (异方差) 现象,Engle 于 1982 年首先构建了 ARCH 模型用于刻画英国通货膨胀率中存在的异方差,他假设模型的残差 εt 的平方 ε2t

服从 AR(p) 过程,并且提出了检验序列是否具有 ARCH 效应的 LM 检验 (Lagrange 乘数法),具体内容可参见一般时间序列教材 (如:《应用时间序列分析》王黎明 P199)。Bollerslev 于 1986年将 ARCH 推广到一般的 GARCH,GARCH 与 ARMA 有类似的结构。

GARCH 模型的条件方差 σ2t 取决于残差 ε(t−i) 的大小而与符号无关,但研究表明,收益率

序列存在一定的杠杆效应,坏消息导致的价格波动要比好消息强烈。为了保证 σ2t 非负,要求模

型系数为非负。GARCH 一般比较小,很难判断方差波动源的持续性。GARCH 的一般模型如下:

xt = L(x) + εt

εt = σtηt

σ2t = w +

q∑i=1

αiε2t−i +

p∑j=1

βjσ2t−j

ηt ∼ f, εt|Φt ∼ f(σ2t )

其中,L(x) 表示对序列 xt 的任意模型,由于我们这里考虑的是单一时间序列建模,因此,也要

求 L(x) 不受其他因素影响。

我们在文中对 xt 建立了 GARCH(1,1) 模型,GARCH(1,1) 为

xt = c+ εt

εt = σtηt

σ2t = w + α1ε

2t−1 + β1σ

2t−1

ηt ∼ f, εt|Φt ∼ f(σ2t )

http://www.ma-xy.com 128 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.3 FB 收益率的 GARCH 族模型建模

5.3.3 IGARCH

Bollerslev 于 1986 年给出 εt 满足 garch(p, q) 的充要条件:

εt ∼ garch(p, q)⇔q∑i=1

αi +

p∑j=1

βj < 1

IGARCH 是单位根 GARCH,其在普通 GARCH 模型后面引入了约束,要求q∑i=1

αi +

p∑j=1

βj = 1

这表明收益率具有强的持续的波动,这种情况下,条件方差函数具有单位根和单整性,任何对条

件方差 σ2t 的影响都将持续下去。Bollerslev 和 Engle 在 1986 年直接使用了 IGARCH,但这种

约束会使得真实的动态相依性变得有些强加的味道。IGARCH 的一般模型如下

xt = L(x) + εt

εt = σtηt

σ2t = w +

q∑i=1

αiε2t−i +

p∑j=1

βjσ2t−j

q∑i=1

αi +

p∑j=1

βj = 1

我们在论文中对 xt 建立了 IGARCH(1,1) 模型,IGARCH(1,1) 为

xt = c+ εt

εt = σtηt

σ2t = w + α1ε

2t−1 + β1σ

2t−1

α1 + β1 = 1

5.3.4 GARCHM

收益和波动率关系的非对称性归因于波动率的反馈效应,Engle、Lilien 和 Robin 于 1987 年提出 GARCHM 模型来刻画这种非对称性,在模型中,条件均值显性的依赖于条件方差 σ2

t,表

明当风险越大时,期望得到的收益也就越大。GARCHM 的一般模型如下

xt = L(x) + εt + γσ2t

εt = σtηt

σ2t = w +

q∑i=1

αiε2t−i +

p∑j=1

βjσ2t−j

ηt ∼ f, εt|Φt ∼ f(σ2t )

其中,γ 称为风险溢价参数,γ 为正时,表明高风险带来高收益。也有文献将风险标记为 log (σ2t )。

http://www.ma-xy.com 129 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.3 FB 收益率的 GARCH 族模型建模 第五章 证券收益率的 GARCH 族模型比较

我们在论文中对 xt 建立了 GARCHM(1,1) 模型,GARCHM(1,1) 为

xt = c+ εt + γσ2t

εt = σtηt

σ2t = w + α1ε

2t−1 + β1σ

2t−1

α1 + β1 = 1

ηt ∼ f, εt|Φt ∼ f(σ2t )

5.3.5 EGARCH

前面,我们提到过 GARCH模型可以刻画收益率的异方差性,但其不能很好的表达收益率的杠杆效应,GARCH模型的干扰因素 ηt 对条件方差的影响是对称的,不适合描述干扰对收益率的

非对称影响,为了反应波动的非对称性,Nelson于 1991年提出了指数 GARCH模型 (EGARCH),在模型中考虑了加权信息。

g(ηt) = θηt + γ[|ηt| − E(|ηt|)]

其中:θ 和 γ 是实常数,ηt 是均值为 0 的独立同分布序列 (过程),一般为正态白噪声,如果是正态白噪声,那么有 E (|ηt|) =

√2⁄π,并且:

E [g (ηt)] = 0

g(ηt) 的非对称性表现为

g (ηt) =

{(θ + γ) ηt − γE (|ηt|) , ηt ≥ 0

(θ − γ) ηt − γE (|ηt|) , ηt ≤ 0

一般的 EGARCH 模型如下:

xt = L(x) + εt

εt = σtηt

logσ2t = w +

q∑i=1

αig(ηt−i) +

p∑j=1

βj logσ2t−j

g(ηt) = θηt + γ[|ηt| − E(|ηt|)]

我们在论文中对 xt 建立了 EGARCH (1,1) 模型,EGARCH (1,1) 为

xt = c+ εt

εt = σtηt

logσ2t = w + α1

(θεt−1

σt−1

+ γ

[∣∣∣∣ εt−1

σt−1

∣∣∣∣− E (∣∣∣∣ εt−1

σt−1

∣∣∣∣)])+ β1 logσ2t−1

E

(∣∣∣∣ εt−1

σt−1

∣∣∣∣) =√2/π, if ηt ∼ N(0, 1)

http://www.ma-xy.com 130 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.3 FB 收益率的 GARCH 族模型建模

5.3.6 GJRGARCH

另一个经常用来处理杠杆效应的模型是门限 GARCH 模型,这里,我们先来介绍 GJR-GARCH模型,然后介绍 TGARCH模型,二者本质上是一样的。Glosten、Jagannathan和 Runkle于 1993 年构建了 GJRGARCH,他们在模型中引入了特征变量:

It−i = 1(εt−i < 0)

当 ε(t−i) < 0 时,I(t−i) = 1,否则为 0。GJRGARCH 的一般模型如下:

xt = L(x) + εt

εt = σtηt

σ2t = w +

q∑i=1

(αi + γiIt−i) ε2t−i +

p∑j=1

βjσ2t−j

It−i = 1(εt−i < 0)

其中:αi,βi 和 γi 为非负参数,可以看到,正的 ε(t−i) 对 σt 的贡献为 αiε2(t−i),而负的 ε(t−i) 对

σt 的贡献为 (αi + γi) ε2(t−i)。

我们在文中对 xt 建立了 GJRGARCH (1,1) 模型,GJRGARCH (1,1) 为:

xt = c+ εt

εt = σtηt

σ2t = w + (α1 + γ1It−1) ε

2t−1 + β1σ

2t−1

It−i = 1(εt−i < 0)

5.3.7 TGARCH

Zakian 于 1994 年提出门限 GARCH 模型,和 GJRGARCH 模型具有异曲同工之妙,不过,相对于 GJRGARCH 而言 TGARCH 有更少的参数。一般的 TGARCH 模型如下:

xt = L(x) + εt

εt = σtηt

σ2t = w +

q∑i=1

αiε2t−i + γIt−iε

2t−i +

p∑j=1

βjσ2t−j

It−i = 1(εt−i < 0)

我们在文中对 xt 建立了 TGARCH (1,1) 模型,TGARCH (1,1) 为:

xt = c+ εt

εt = σtηt

σ2t = w + α1ε

2t−1 + γIt−1ε

2t−1 + β1σ

2t−1

It−i = 1(εt−i < 0)

http://www.ma-xy.com 131 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.3 FB 收益率的 GARCH 族模型建模 第五章 证券收益率的 GARCH 族模型比较

5.3.8 AGARCH and avGARCH

另一个用来刻画杠杆效应的有效模型是 AGARCH(an asymeetric GARCH),AGARCH 模型中引入了控制参数 b,具体的 AGARCH 模型如下:

xt = L(x) + εt

εt = σtηt

σ2t = w +

q∑i=1

αi|εt−i + b|2 +p∑j=1

βjσ2t−j

ηt ∼ f, εt|Φt ∼ f(σ2t )

可以看到,当控制参数 b < 0 时,负的 ε(t−i) 对条件方差的贡献增大,正的 ε(t−i) 对条件方差的

贡献减小。

一个扩展后的模型是 avGARCH(absolute value GARCH),一般的 avGARCH 模型如下:

xt = L(x) + εt

εt = σtηt

σ2t = w +

q∑i=1

αi(|εt−i + b| − c (εt−i + b))2+

p∑j=1

βjσ2t−j

ηt ∼ f, εt|Φt ∼ f(σ2t )

5.3.9 nGARCH

Duan 于 1995 年构建了 NGARCH 模型,用于刻画收益率的杠杆效应,同时反应了波动率的非线性性。一般的 NGARCH 模型如下:

xt = L(x) + λσt − 1/2σ2t + εt

εt = σtηt

σ2t = w +

q∑i=1

αi(εt−i − λσt−j)2 +p∑j=1

βjσ2t−j

ηt ∼ f, εt|Φt ∼ f(σ2t )

其中:参数 λ 用于刻画杠杆效应,如果其估计值非负,则说明具有杠杆效应。模型中的其他系数

保持非负特点。

我们在文中对 xt 建立了 NGARCH (1,1) 模型,NGARCH (1,1) 为:

xt = c+ λσt − 1/2σ2t + εt

εt = σtηt

σ2t = w + α1(εt−1 − λσt−1)

2+ β1σ

2t−1

ηt ∼ f, εt|Φt ∼ f(σ2t )

http://www.ma-xy.com 132 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.4 模型估计与模型信息

5.3.10 apARCH

Ding Z, G ranger C W J和 Engle R F于 1993年提出非对称幂GARCH(apARCH),apARCH仍然是用来刻画收益率的杠杆效应,并且,许多其他的模型可以从 apARCH模型中演化形成,一般的 apARCH 模型如下:

xt = L(x) + εt

εt = σtηt

σ2t = w +

q∑i=1

αi(|εt−i| − γiεt−i)δ +p∑j=1

βjσδt−j

ηt ∼ f, εt|Φt ∼ f(σ2t )

其中:γi 用于刻画杠杆效应,当其为正时,表明具有杠杆效应。δ 为幂参数,当 δ = 1 时,模型

变为 TGARCH。我们在文中对 xt 建立了 apARCH (1,1) 模型,apARCH (1,1) 为:

xt = c+ εt

εt = σtηt

σ2t = w + α1(|εt−1| − γ1εt−1)

δ+ β1σ

δt−1

ηt ∼ f, εt|Φt ∼ f(σ2t )

5.4 模型估计与模型信息

在展示模型估计结果之前,要说明的是我们使用的是 ruGARCH 和 bayesGARCH 等 R 包,包中的模型和上面给出的标准模型可能会有一定的差异,具体的模型可以参考 ruGARCH 包的说明文档。一个普遍存在的差异是,ruGARCH 包中的 GARCH 族模型的异方差模型为:

σ2t =

(w +

m∑j=1

ζjνjt

)+

q∑i=1

αif1 (εt−i) +

p∑j=1

βjf2 (σt−j)

其常数项已经不再是常数项,在估计结果中,将 ζj 记为 omega。接下来我们直接给出模型的估计结果及模型的信息,不写出详细模型,最后给出各个模型的

比较。

1、ARMA 模型参数估计结果如表 (5.3) 所示

http://www.ma-xy.com 133 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.4 模型估计与模型信息 第五章 证券收益率的 GARCH 族模型比较

表 5.3: ARMA 模型参数估计结果

Coefficient(s) Estimate Std.Error t value Pr(>|t|)

ar1 -0.6374947 0.1377807 -4.627 3.71e-06***ma1 0.7517159 0.1162311 6.467 9.97e-11***mu 0.0014866 0.0008898 1.671 0.0948.

note: Signif. codes: 0 ‘***’0.001 ‘**’0.01 ‘*’0.05 ‘.’0.1 ‘’1;

log likelihood: 1038.66 Distribution is:norm AIC Criterion: -2069.31

2、GARCH 模型参数估计结果如表 (5.4) 所示

表 5.4: GARCH 模型参数估计结果

Coefficient(s) Estimate Std.Error t value Pr(>|t|)

omega 0.0002188 0.0001091 2.005 0.0450*alpha1 0.1265543 0.0633417 1.998 0.0457*beta1 0.0703620 0.4113794 0.171 0.8642

Log Likelihood:1037.195; normalized: 2.694013 Conditional Distribution is:norm.

AIC:-5.372442; BIC:-5.341637; SIC:-5.372562; HQIC: -5.360225

3、bayesGARCH 轨迹如图 (5.7) 所示

图 5.7: bayesgarch 轨迹图

设置参数向量 α = (α0, α1) 的先验分布中的初值为 0,Σα = diag(1000, 1000),这里方差取

1000 是利用了扩散先验的思想,参数 β 的先验分布中的初值为 0,Σβ = 1000。为了确保收敛,

http://www.ma-xy.com 134 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.4 模型估计与模型信息

我们模拟两条马氏链,每条迭代 1000 次,上图左边为迭代路径图,右边为后验分布的核密度估计。bayesGARCH 模型参数估计结果如表 (5.5) 所示

表 5.5: bayesGARCH 模型参数估计结果

Coefficient(s) Mean SD Naive SE Time-series SE

alpha0 0.009656 0.007253 0.0003244 0.002069alpha1 9.363032 8.590657 0.3841858 2.216542beta 0.225654 0.166916 0.0074647 0.032367nu 2.034682 0.034131 0.0015264 0.014910

模型残差分析

在构建模型之前,我们对残差有一定的假设,我们假设残差为正态白噪声过程,因此,在建

立模型之后,要对残差进行分析,进行正态性检验、平稳性检验、相关性 (独立性)检验和 ARCH效应检验。利用 Shapiro-Wilk.test进行正态性检验 (不过不满足样本要求 [50-80],后期修改),利用 Box-Ljung.test 进行独立性检验,利用 LM.test 进行 ARCH 效应检验。

Shapiro-Wilk.test Shapiro-Wilk.test 的详细内容可以参考:数理统计 P289 或者梁小筠《正态性检验》P58。检验统计量为:

T =W =

{∑[n2]

i=1 ai(W )[x(n+1−i) − x(i)]}2

∑ni=1 [x(i) − x]

2

其中:αi 参考相关文献 (梁小筠《正态性检验》P58)。

Box-Ljung.test 独立性检验可以看作滞后期小于 m 期的序列值之间相互独立。原假设 H0:

ρ1 = ρ2 = · · · = ρm = 0

其中:ρ1 为滞后 1 期的自相关系数。备择假设 H1:

∃i ∈ [1 : q], ρi = 0

一般情况下,我们只能得到样本的自相关函数值 ρi(即 ρi 的估计值),并且估计值一般不为 0。对ρi 有 Bartlett 公式:如果 ρi 在 r > M 时趋于 0,则在 n 足够大的情况下,其方差为:

D (ρi) ≈1

n

M∑m=−M

ρ2m

并且,r > M 时,ρi 近似服从正态分布:

ρi∼N(0,

1

n

)http://www.ma-xy.com 135 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.4 模型估计与模型信息 第五章 证券收益率的 GARCH 族模型比较

于是,有检验统计量 Box-Pierce 和 Box- Ljung:

TBP = nm∑i=1

ρ2i ∼ χ (m)

TBL = n (n+ 2)m∑i=1

ρ2in− k

∼ χ (m)

LM.test 检验误差项 εt 是否服从 ARCH(q) 过程,也就是检验方程 σ2t = w + Σqi=1αiε

2t−i 中,

所有回归系数 αi 是否同时为 0。原假设 H0:

α1 = α2 = · · · = αm = 0

备择假设 H1:∃i ∈ [1 : q], αi = 0

构建 LM 检验统计量为:

T = n

(∂L (θ)

∂θ

)′

I−1δ

(∂L (θ)

∂θ

)其中:θ = [α1, α2,…, αq]�L(θ) 为对数似然函数,I−1

δ 为在似然函数最大时计算的信息阵倒数。计

算公式如下:∂L (θ)

∂δ=

1

2

n∑t=1

{ε2tσ2t

− 1

}∂ logσ2

t

∂δ−

n∑t=1

1

2σ2t

∂ε2t∂δ

Iδ = −1

nE

{∂2L (θ)

∂δ∂δ′

∣∣∣∣xt}∂2L (θ)

∂δ∂δ′= −1

2

n∑t=1

ε2tσ2t

∂ logσ2t

∂δ

∂ logσ2t

∂δ′

信息矩阵的一致估计为:

Iδ =1

2n

n∑t=1

zt (θ) zt (θ)′

(σ2t )

2

模型评价 6 个指标

前面,我们对单一的 FB 收益率序列建立了诸多的模型,那么,接下来的问题很自然就是如何来评价这些模型,这是一个很重要的问题,这将指导我们对 FB 序列建立最适合的模型,从而进行最好的估计与预测。在线性回归中,我们利用 R2 来评价模型,虽然我们也可以用其来评价

模型,但此并非常用准则。下面,我们来构建模型的评价指标:

1、AIC 信息准则:AIC(Akaika information criterion) 信息准则由日本统计学家 Akaika 于1973 年提出,该准则不仅考虑了模型对数据的拟合程度,还考虑了模型参数的个数。AIC 的一般形式为:AIC = - 2ln(模型最大似然度) + 2(模型独立参数个数)

AIC = n

[log(RSS

n

)+ 1 + log(2π)

]+ 2(p+ 1)

http://www.ma-xy.com 136 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.4 模型估计与模型信息

其中:RSS 是拟合残差平方和,p 是选入模型的参数 (p = p+ q = 1 + 1),n 为样本量。

2、BIC 信息准则:由于 AIC 方法不能给出相容估计 (当样本量 n 趋近于无穷时,采用 AIC方法定出的模型阶数不能依概率收敛到真值,通常比真值要高),为此,Akaike 和 E.J.Haman 于1979 年又提出了 BIC 准则,BIC 的一般形式为:BIC = - 2ln(模型最大似然度) + 2(模型独立参数个数)

BIC = n

[log(RSS

n

)+ 1 + log(2π)

]+ (p+ 1) log(n)

3、模型残差结果: 汇总各模型残差的随机性检验 (LBtest)、ARCH 检验 (LMtest) 和正态性检验。

4、6 个误差指标:在 2002 年,Buhlmann 和 McNeil 定义了以下 6 个误差指标来评价模型:平均平方误差 (MSE1、MSE2)、平均绝对误差 (MAE1、MAE2)、高斯准极大似然损失函数误差(QLIKE) 及对数损失函数误差 (R2LN)。

MSE1 =1

n

n∑t=1

(σt − σt)2

MSE2 =1

n

n∑t=1

(σ2t − σ2

t

)2MAE1 =

1

n

n∑t=1

|σt − σt|

MAE2 =1

n

n∑t=1

∣∣σ2t − σ2

t

∣∣QLIKE =

1

n

n∑t=1

(ln σ2

t + σ2t

/σ2t

)R2LN =

1

n

n∑t=1

(lnσ2

t

/σ2t

)2其中,n 为样本大小,σt 为误差项 εt 的标准差,σt 为其估计值,σ

2t 为条件方差 (即误差项 εt 的

条件异方差)。MSE1、MSE 2、MAE1、MAE2 越小表示预测精度越高,QLIKE 和 R2LN 越大

表示预测精度越高。

值得一提的是,在 ruGARCH 包中,编者将 AIC 等信息编写为如下形式:

AIC =−2LLH

N+

2m

N

BIC =−2LLH

N+mloge (N)

N

HQIC =−2LLH

N+

2mloge (loge (N))

N

SIC =−2LLH

N+ loge

(N + 2m

N

)

http://www.ma-xy.com 137 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.4 模型估计与模型信息 第五章 证券收益率的 GARCH 族模型比较

5.4.1 GARCH 族模型结果分析

根据前面的 bayesGARCH模型的结果可以看到,bayesGARCH模型的估计结果并不令人满意。Gelman 和 Rubin 于 1992 年提出的方差比法:如果 R > 1,说明链收敛不好;如果 R = 1,

说明链达到静止状态。而上面 bayesGARCH 模型的方差大于 1,说明模型不理想。改进的方向有:1、调整初始值 2、增加迭代次数等。总之,bayesGARCH 建模失败了,这个模型我们以后再讨论。下面,我们分析一下其他的模型:

1. 就 AIC 和 BIC 信息而言,AIC 等准则越小越好 (但这仅就同模型而言,不同模型之间还未考虑),而 girGARCH 模型的 AIC 是最小的,IGARCH 模型仅次之,并且两个模型之间有一定的联系;就 BIC 而言 apARCH 模型是最优的,gjrGARCH 模型仅次之。

2. 就残差正态性检验而言,由于我们在上述建模过程中,均假设残差服从正态分布,因此,有必要进行正态性检验,在 SWtest 下,所有模型均在 0.05 的显著水平下拒绝正态原假设。不过这里使用的检验方法有一些问题,有待后续研究 (可以用不同的正态性检验方法进行比较)。

3. 就残差的独立性而言,仅有 ARMA 模型没有拒绝原假设 (原假设为独立随机),其他模型均在 0.05 的显著水平下拒绝原假设。

4. 残差的 ARCH 效应检验,仅有 ARMA 和 GARCHM 模型没有拒绝原假设 (原假设为无GARCH 效应),其他模型均在 0.05 的显著水平下拒绝原假设。

5. 就 6 个拟合指标而言,ARMA 模型在 MSE1、MSE2、MAE2 和 QLIKE 指标下均优于其他模型,而 apARCH 模型则占据了 MAE1 和 R2LE 指标的榜首。

综上而言,ARMA 模型较为适合 FB 收益率,其次是 apARCH 和 gjrGARCH(IGARCH)。一种更为有利的比较方法是在每个指标下,将模型排名,然后汇总最终的排名结果 (如取均值等方法)。

http://www.ma-xy.com 138 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.4 模型估计与模型信息

图 5.8: 模型结果汇总表

http://www.ma-xy.com 139 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.4 模型估计与模型信息 第五章 证券收益率的 GARCH 族模型比较

5.4.2 程序

由于各个模型的建模基本相似,这里我们仅给出部分模型的程序。以 IGARCH 模型为例,IGARCH 模型的建模程序如下

1 ############# rugarch package 介绍##2 #http : //unstarched . net/r/rugarch/ 原始路径

3 #http : //herbert12 . blog .163 .com/blog/ s t a t i c /304782320120184118846/4 #http : //www. b i o s t a t i s t i c . net/thread−78659−1−1.html 翻译

5 . l ibPaths ( ”D: /Program Fi l e s /R/R−3.1.3/ l ib ra ry ” )6 i n s t a l l . packages ( ”rugarch” , l i b = ”D: /Program Fi l e s /R/R−3.1.3/ l ib ra ry ” )7 l i b ra ry ( pa r a l l e l )8 #in s t a l l . packages (” truncnorm” , l i b = ”D: /Program Fi l e s /R/R−3.1.3/ l ib ra ry ”)9 i n s t a l l . packages ( ”misc3d” , l i b = ”D: /Program Fi l e s /R/R−3.1.3/ l ib ra ry ” )

10 i n s t a l l . packages ( ” rg l ” , l i b = ”D: /Program Fi l e s /R/R−3.1.3/ l ib ra ry ” )11 l i b ra ry ( rugarch )12 #该模型由三个部分构成,均值方程对应式(1),分布假设对应(2),方差方程对应式(3),13 # 对三个部分进行适当的变形后可以形成

14 # egarch模型, egarch−ged模型, egarch−t模型, Igarch模型, garch−m模型和Qgarch模型等15 # 因此,设定模型形式就是分别设定均值方程、方差方程和分布。

16 # spec=ugarchspec ( variance .model = l i s t (model = ”sGARCH” , garchOrder = c (1 , 1) ,17 # submodel = NULL,18 # external . r eg re s so r s = NULL,19 # variance . target ing = FALSE) ,20 # mean .model = l i s t (armaOrder = c (1 , 1) ,21 # include .mean = TRUE,22 # archm = FALSE,23 # archpow = 1 ,24 # arfima = FALSE,25 # external . r eg re s so r s = NULL,26 # archex = FALSE) ,27 # dis t r ibut ion .model = ”norm”)28 # ugarchf i t ( spec ,29 # data ,30 # out . sample = 0 ,31 # solver = ”solnp ” ,32 # solver . contro l = l i s t ( ) ,33 # f i t . contro l = l i s t ( s ta t i onar i ty = 1 , f ixed . se = 0 , sca l e = 0 , rec . i n i t = ’ a l l

’ ) ,34 # numderiv . contro l = l i s t ( grad . eps=1e−4, grad . d=0.0001 ,35 # grad . zero . t o l = sqrt ( .Machine$double . eps/7e−7) ,36 # hess . eps = 1e−4,37 # hess . d = 0.1 ,38 # hess . zero . t o l = sqrt ( .Machine$double . eps/7e−7) ,39 # r=4, v=2))40 # 通过 plot (myfit )可以对模型结果进行图形诊断:41 # plot (myfit ) # Make a plot s e l e c t i on ( or 0 to ex i t ) : 1 : Se r i e s with 2 Conditional SD42 ###################exapmle for rugarch package43 variance .model <− l i s t (model = ”eGARCH” , garchOrder = c (2 , 3) )44 # # model Valid models ( current ly implemented ) are “sGARCH” , “fGARCH” , “eGARCH” , “

gjrGARCH” , “apARCH” and “iGARCH” and “csGARCH” .45 # # garchOrder The ARCH (q) and GARCH (p) orders .46 # # submodel I f the model i s “fGARCH” , va l id submodels are “GARCH” , “TGARCH” , “

http://www.ma-xy.com 140 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.4 模型估计与模型信息

AVGARCH” , “NGARCH” , “NAGARCH” , “APARCH” ,“GJRGARCH” and “ALLGARCH” .47 mean .model <− l i s t (armaOrder = c (0 , 0) , include .mean = T, archm = F)48 spec <− ugarchspec ( variance .model = variance .model ,49 mean .model = mean .model ,50 d i s t r ibut ion .model = ”norm”)51 f i t <− ugarchf i t ( spec = spec ,52 data = xt ,53 out . sample = 0 ,54 so lver = ”solnp” ,55 so lver . contro l = l i s t ( trace = 0) )56 #57 #model four : Igarch#######################################################58 ##方法1:######59 source ( ” Igarch .R”)#Igarch .R在下面给出60 model4 . Igarch <− Igarch ( as . vector ( xt ) , include .mean = T)61 smodel4 . Igarch$model . information62 ##方法2: use rugarch package##63 variance .model <− l i s t (model = ”iGARCH” , garchOrder = c (1 , 1) )64 mean .model <− l i s t (armaOrder = c (0 , 0) , include .mean = T, archm = F)65 d i s t r ibut ion .model <− ”norm”66 spec . igarch <− ugarchspec ( variance .model = variance .model ,67 mean .model = mean .model ,68 d i s t r ibut ion .model = d i s t r ibut ion .model )69 model4 . Igarch . rugarch <− ugarchf i t ( spec = spec . igarch ,70 data = xt ,71 out . sample = 0 ,72 so lver = ”solnp” ,73 so lver . contro l = l i s t ( trace = 0) )74 #模型信息75 model4 . Igarch . rugarch76 #计算模型6个指标77 re . IgarchModel . rugarch <− model4 . Igarch . rugarch@fit$ r e s idua l s #res idua l s (model4 . Igarch .

rugarch )78 f i t . IgarchModel . rugarch <− model4 . Igarch . rugarch@fit$ f i t t e d . values #f i t t e d (model4 . Igarch

. rugarch )79 i f ( length ( xt ) == length ( f i t . IgarchModel . rugarch ) )80 a <− rbind (a , c r i t e r i on ( f i t . IgarchModel . rugarch , xt ) )81 #模型残差的分析82 shapiro . t e s t ( re . IgarchModel . rugarch )#正态性检验83 Box . t e s t ( re . IgarchModel . rugarch ,84 lag = c e i l i n g ( log ( length ( re . IgarchModel . rugarch ) ) ) ,85 type = ”Ljung−Box”)86 ArchTest ( re . IgarchModel . rugarch , lag = 12)87

上面用到的 Igarch 函数如下1 ” Igarch” <− function ( rtn , include .mean=F, volcnt=F){2 # Estimation of a Gaussian IGARCH(1 ,1) model .3 # rtn : return s e r i e s4 # include .mean : f l ag fo r the constant in the mean equation .5 # volcnt : f l ag fo r the constant term of the v o l a t i l i t y equation .6 #### default i s the RiskMetrics model7 #

http://www.ma-xy.com 141 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.4 模型估计与模型信息 第五章 证券收益率的 GARCH 族模型比较

8 Idata <<− rtn9 Flag <<− c ( include .mean, volcnt )

10 #11 Mean=mean( Idata ) ; Var = var ( Idata ) ; S = 1e−612 i f ( ( volcnt )&&( include .mean) ){13 params=c (mu = Mean, omega=0.1*Var , beta=0.85)14 lowerBounds = c (mu = −10*abs (Mean) , omega= S^2 , beta= S)15 upperBounds = c (mu = 10*abs (Mean) , omega = 100*Var , beta = 1−S)16 }17 i f ( ( volcnt )&&( ! include .mean) ){18 params=c (omega=0.1*Var , beta=0.85)19 lowerBounds=c (omega=S^2 , beta=S)20 upperBounds=c (omega=100*Var , beta=1−S)21 }22 #23 i f ( ( ! volcnt )&&( include .mean) ){24 params=c (mu = Mean, beta= 0.8)25 lowerBounds = c (mu = −10*abs (Mean) , beta= S)26 upperBounds = c (mu = 10*abs (Mean) , beta = 1−S)27 }28 i f ( ( ! volcnt )&&( ! include .mean) ){29 params=c ( beta=0.85)30 lowerBounds=c ( beta=S)31 upperBounds=c ( beta=1−S)32 }33 # Step 3: set condit ional d i s t r ibut ion function :34 igarchDist = function (z , hh){dnorm(x = z/hh)/hh}35 # Step 4: Compose log−l i k e l i hood function :36 igarchLLH = function (parm){37 include .mean=Flag [ 1 ]38 volcnt=Flag [ 2 ]39 mu=0; omega = 040 i f ( ( include .mean)&&( volcnt ) ){41 my=parm [ 1 ] ; omega=parm [ 2 ] ; beta=parm[3 ] }42 i f ( ( ! include .mean)&&( volcnt ) ){43 omega=parm [ 1 ] ; beta=parm[2 ] }44 i f ( ( ! include .mean)&&( ! volcnt ) ) beta=parm [ 1 ]45 i f ( ( include .mean)&&( ! volcnt ) ){mu=parm [ 1 ] ; beta=parm[2 ] }46 #47 z = ( Idata − mu) ; Meanz = mean( z^2)48 e= omega + (1−beta )* c (Meanz , z[− length ( Idata ) ]^2)49 h = f i l t e r ( e , beta , ” r ” , i n i t=Meanz)50 hh = sqrt ( abs (h) )51 l l h = −sum( log ( igarchDist ( z , hh) ) )52 l l h53 }54 # Step 5: Estimate Parameters and Compute Numerically Hessian :55 f i t = nlminb( s ta r t = params , object ive = igarchLLH ,56 lower = lowerBounds , upper = upperBounds)57 ##lower = lowerBounds , upper = upperBounds , contro l = l i s t ( trace=3))58 eps i lon = 0.0001 * f i t $par59 cat ( ”Estimates : ” , f i t $par , ”\n” )60 npar=length (params)

http://www.ma-xy.com 142 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.5 应用

61 Hessian = matrix (0 , ncol = npar , nrow = npar )62 f o r ( i in 1 : npar ) {63 f o r ( j in 1 : npar ) {64 x1 = x2 = x3 = x4 = f i t $par65 x1 [ i ] = x1 [ i ] + eps i lon [ i ] ; x1 [ j ] = x1 [ j ] + eps i lon [ j ]66 x2 [ i ] = x2 [ i ] + eps i lon [ i ] ; x2 [ j ] = x2 [ j ] − eps i lon [ j ]67 x3 [ i ] = x3 [ i ] − eps i lon [ i ] ; x3 [ j ] = x3 [ j ] + eps i lon [ j ]68 x4 [ i ] = x4 [ i ] − eps i lon [ i ] ; x4 [ j ] = x4 [ j ] − eps i lon [ j ]69 Hessian [ i , j ] = ( igarchLLH(x1)−igarchLLH(x2)−igarchLLH(x3)+igarchLLH(x4) )/70 (4* eps i lon [ i ] * eps i lon [ j ] )71 }72 }73 cat ( ”Maximized log−l ikehood : ” , igarchLLH( f i t $par ) , ”\n” )74 # Step 6: Create and Print Summary Report :75 se . coe f = sqrt ( diag ( so lve (Hessian ) ) )76 tval = f i t $par/se . coef77 matcoef = cbind ( f i t $par , se . coef , tval , 2*(1−pnorm(abs ( tval ) ) ) )78 dimnames(matcoef ) = l i s t (names( tval ) , c ( ” Estimate” ,79 ” Std . Error” , ” t value” , ”Pr(>| t | ) ” ) )80 cat ( ”\nCoef f i c i ent ( s ) :\n” )81 printCoefmat (matcoef , d i g i t s = 6 , s i g n i f . s ta r s = TRUE)82

83 i f ( ( include .mean)&&( volcnt ) ){84 mu=f i t $par [ 1 ] ; omega=f i t $par [ 2 ] ; beta = f i t $par [ 3 ]85 }86 i f ( ( include .mean)&&( ! volcnt ) ){87 mu = f i t $par [ 1 ] ; beta = f i t $par [ 2 ] ; omega = 088 }89 i f ( ( ! include .mean)&&( volcnt ) ){90 mu=0; omega=f i t $par [ 1 ] ; beta=f i t $par [ 2 ]91 }92 i f ( ( ! include .mean)&&( ! volcnt ) ){93 mu=0; omega=0; beta=f i t $par [ 1 ]94 }95 z=Idata−mu; Mz = mean( z^2)96 e= omega + (1−beta )*c (Mz, z[− length ( z ) ]^2)97 h = f i l t e r ( e , beta , ” r ” , i n i t=Mz)98 vol = sqrt ( abs (h) )99

100 Igarch <− l i s t ( par=f i t $par ,101 v o l a t i l i t y = vol ,102 model . information = matcoef ,103 model . logl ikehood = igarchLLH( f i t $par ) )104 }105

5.5 应用

对组合投资和期权定价的研究一直是金融领域的热点问题。随经济的发展和网络时代的到

来,投资渐渐成为人们的生活必需品,投资相对于存款而言,最大区别在于,投资的收益是与风

http://www.ma-xy.com 143 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.5 应用 第五章 证券收益率的 GARCH 族模型比较

险相伴的,而人们在对多种投资对象 (股票) 进行投资时,往往期望在一定投资期内,投资风险最小下,投资 (组合) 带来的利益最大。

1900 年 Louis Bachelier 在“The Theory of Speulation”中首次提出使用 Brown 运动来分析股票价格变换,但可惜的是,这种方法直到后来才被人们所接受。现代金融学发生过两场历史

性革命:第一次革命是由 1990 年诺贝尔经济学奖得主 Markowitz.H 引起的,1952 年 Markowitz在其博士论文中创造性的建立了均值-方差组合投资模型来定量计量组合的风险和收益后,数理工具在金融领域开始大放异彩,它突破了传统金融,渐渐在金融工程中占据主导地位。第二次革

命是由 1997 年诺贝尔经济学奖得主 Scholes 等引起的,Black.F 和 Scholes.M 运用随机微分方程对股票价格进行模拟,并提出了著名的欧式期权定价公式:Black - Scholes 定价公式。

Markowitz 的组合投资策略是基于均值 - 方差的,他用股票收益率的均值作为股票收益的度量,用收益率的方差作为风险的度量,投资的最终目标是使投资的收益最大风险最小。Markowitz用收益率的方差来定量计算投资风险的方法并非没有缺陷,方差只描述了收益率偏离期望的程

度,没有反应偏离方向,但人们通常关心负偏离带来的损失,方差也不能反应证券组合的损失由

多大。随着风险的不同度量方法的进化,均值-方差模型后续又进化为:均值 - 半方差、均值 - 绝对差、均值 - VaR、均值 - CVaR 等,然而,在传统的均值 - 方差模型族中,收益率的均值和方差是不随时间变化的,这与实际情况并不相符,人们对收益率的认识已经从正态白噪声中脱离出

来,已经有一系列描述收益率情况的模型,比如 ARCH 族、SV 族等。并且,对于股票收益率的建模,不仅仅局限于时间序列模型,还有前面介绍的随机微分方程等可以使用。

5.5.1 收益率模型

由于在下面的组合投资和期权定价问题中,收益率都占据着非常重要的地位,因此,我们先

建立收益率模型。由于不同市场的基数不同,我们设收益率为:

xt = ln PtPt−1

= lnPt − lnPt−1

其中:Pt 为 t时刻的股票价格,我们可以用前面介绍的 SDE(随机微分方程)进行模拟,这里,我们直接用 GARCH 模型族对其进行模拟。在平稳的前提下,我们对 {xt} 建立 GARCH 模型。

5.5.2 风险度量:条件风险价值 CVaR

在上面的收益率模型中,我们已经计算了收益率的均值和方差,然而,方差并不能很好的度

量风险。方差只描述了收益率偏离期望的程度,没有反应偏离方向,但人们通常关心负偏离带来

的损失,方差也不能反应证券组合的损失由多大,因此,我们采用基于风险价值 VaR 的条件风险价值来度量风险。

定义 (风险价值 VaR) 某项金融资产 (例如股票和股票的组合) 在一定时期内,在一定置信水平下,可能的最大损失

P{xt < V aRt} = α

其中:xt 为 t 时刻的收益率,α 为显著性水平 (百分位数),1− α 为置信水平。

http://www.ma-xy.com 144 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.5 应用

用 VaR 作为风险的度量有一定的缺陷,他没有考虑尾部风险,即损失超过 VaR 的风险,VaR 不满足其次可加性,为此,我们引入具有次其次可加特点的条件风险价值 CVaR 来度量风险。CVaR 是在一定置信水平下,发生损失超过 VaR 时的平均损失。计算公式如下

CV aRt = −E(xt|xt ⩽ −V aRt) =∫ V aRt

−∞ zf(z)dz1− α

其中:f(·) 为收益率的概率密度函数。计算 VaR 和 CVaR 的方法有许多,如历史模拟法、分析法、Monte Carlo 模拟法、极值法

等。下面的计算中,我们主要利用正态法进行求解。

(1)CF 展开法求 VaR 和 CVaR:Cornish - Fisher 展开式将标准化后的收益率的百分位数 α

近似表示为

q = c(α) +1

6[c(α)2 − 1]st +

1

24[c(α)3 − 3c(α)][kt − 3]− 1

36[c(α)3 − 5c(α)]s2t

其中:c(α) 为标准正态分布的 α 百分位数,st 为标准收益的偏度,kt 为标准收益的峰度。所以,

我们可以计算 CVaR 的近似展开式,收益率 xt 的百分位数 α 为

V aRt = ut + σtq

CVaR 为

CV aRt = −σt(M1 +

1

6(M2 − 1)st +

1

24(M3 − 3M1)(kt − 3− 1

36

)(2M3 − 5M1)s

2t

其中:Mi =1αi

=∫ c(α)−∞ xif(x)dx, i = 1, 2, 3,f(·) 为标准正态分布的密度函数。

(2) 基于正态分布的 VaR 和 CVaR:设各时点 t 上收益率 r 服从具有时变方差的条件正态

分布,所以有

xt|It−1 ∼ N(µt, σ2t )

所以正态分布下的 VaR 和 CVaR 为

V aRt = −µt + c(1− α)σtCV aRt = −µt − σtf(c(1− α))/(1− α)

5.5.3 组合投资 E-CVaR 模型

组合投资即为用有限的资金来投资不同的股票。当然,在投资后的一定时期,我们将会获得

投资的回报,虽然有时回报可能是负值,我们自然很希望我们的投资选择是最好的:风险最小,

收益最大。我们将股票数目确定,规定必须要投资也只能投资某些股票,我们用每个股票的收益

率均值 E 作为收益的度量,用每个股票收益率的条件风险价值 CVaR 作为风险的度量,我们可以依据每个股票的历史收益率序列来计算均值 E 和条件风险价值 CVaR,我们希望在我们投资过后,组合投资的收益最大,风险最小,这就使得我们需要确定我们的投资权重,也就是将固定

http://www.ma-xy.com 145 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.5 应用 第五章 证券收益率的 GARCH 族模型比较

资产的多少用于投资某个股票。当然,区别于传统的组合投资,组合投资 E-CVaR 的投资时间也是非常关键的,因为,我们的收益率均值 E 和收益率条件风险价值 CVaR 都是和时间有关的。这说明,在收益最大、风险最小这个多目标下,我们的投资权重和投资时间将是决定性变量 (所求)。下面,我们来建立与时间有关的 E-CVaR 模型。设有 n 个投资对象 (n 个股票),每个股票记为 i,t 时刻股票 i 的价格记为 P it,t 时刻股票

i 的收益率序列为 xit,股票 i 的投资权重为 wi,投资时间限制为 T 时间内,则 E-CVaR 模型为

minn∑i=1

CV aRit · wi

maxn∑i=1

E(xit) · wi

s.t.

n∑i=1

wi = 1

0 ⩽ wi ⩽ 1

0 ⩽ t ⩽ T

i = 1, 2, . . . , n

5.5.4 组合投资的数值模拟

数据:我们通过 MATLAB 链接 Yahoo 财经网,从而获取投资对象的信息(股票的历史价格),选取 IT行业的主要企业进行投资,他们分别是:’AAPL’、’GOOG’、’FB’、’AMZN’、’PCLN’、’BIDU’、’YHOO’、’JD’、’NFLX’、’LNKD’、’TWTR’和’TRIP’。经过简单的处理后,排除’GOOG’,’JD’ 和’TWTR’3 支股票,选取剩余 9 支股票的截至到 12/01/2015 的 889 个日期股票价格数据作为组合投资对象。

目标:我们首先对每只股票价格进行收益率处理,然后构建每只股票的收益率序列模型,并

计算每支股票的风险价值和条件风险价值序列,计算各个时点 t 的 E - VaR、E - CVaR 模型的有效前沿;最终计算最优的组合权重 wi。

对 9 支股票收益率序列建立 GARCH 模型。其中,均值模型建立 ARMA 模型,方差模型建立 GARCH 模型,收益率模型的部分信息如表 (5.6) 所示。在表 (5.6) 中,有收益率序列的平稳性检验、均值、均值模型 ARMA 的阶数 r 和 m、均值模型后的残差 ARCH 效应检验、方差模型 GARCH 的阶数 p 和 q、方差模型的模型信息 AIC 和 BIC 以及方差模型后的残差 ARCH 效应检验。

http://www.ma-xy.com 146 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.5 应用

表 5.6: 9 个收益率模型的信息

收益率 r1 r2 r3 r4 r5 r6 r7 r8 r9

平稳性 平稳 平稳 平稳 平稳 平稳 平稳 平稳 平稳 平稳

均值 0.0014 -0.0012 -0.0007 -0.0012 -0.0006 -0.0009 -0.0009 -0.0009 -0.0013r 6 1 1 0 1 1 0 2 0m 4 1 1 1 0 3 1 5 1异方差 TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSEp 1 0 2 0 0 1 0 1 0q 1 0 1 0 0 1 0 1 0aic -4714.30 -3924.17 -4427.40 -4417.54 -3993.14 -4598.48 -3191.88 -3700.50 -3874.82bic -4699.93 -3919.38 -4408.23 -4412.75 -3988.35 -4584.11 -3187.09 -3686.12 -3870.03异方差 FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE

下面,详细给出收益率序列 r6(AMZN) 的模型以及利用模型生成的收益率序列 r6(AMZN)的均值和方差。收益率序列 r6(AMZN) 的模型为xt = −0.0009 + 0.6355rt−1 + εt − 0.6312εt−1 − 0.001846εt−2 − 0.09839εt−3

σ2t = 0.823793σ2

t−1 + 0.1127ε2t−1

收益率序列图和收益率序列均值模拟图,方差模拟图如图 (5.9) 所示。

图 5.9: r6 均值方差模拟图

利用正态分布下的 VaR 和 CVaR 计算公式

V aRt = −µt + c(1− α)σtCV aRt = −µt − σtf(c(1− α))/(1− α)

得到的 9 支股票收益率序列的条件风险价值 CV aRt 如表 (5.7)­所示

­注:() 表示取负值。例如:(0.0101) 表示-0.0101

http://www.ma-xy.com 147 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.5 应用 第五章 证券收益率的 GARCH 族模型比较

表 5.7: 9 支股票收益率序列的条件风险价值

AAPL FB AMZN PCLN BIDU YHOO NFLX LNKD TPIP

0.0109 0.0108 0.0028 0.0097 (0.0078) (0.0597) 0.0028 (0.0462) (0.0075)(0.0101) (0.0107) 0.0025 (0.0005) (0.0008) 0.0041 (0.0010) (0.0039) (0.0007)(0.0159) 0.0082 0.0023 (0.0010) (0.0006) 0.0109 (0.0000) 0.0050 (0.0008)(0.0033) (0.0092) 0.0029 (0.0008) (0.0007) 0.0068 (0.0029) 0.0234 (0.0007)0.0068 0.0071 0.0025 (0.0003) (0.0007) 0.0043 (0.0006) 0.0226 0.0002

我们选取 t 时刻进行研究,观察 9 支股票的不同组合投资模型下的有效前沿 (不许买空)。其中,不同的组合投资模型包括:CVaR - E,VaR - E,sigma - E,分别是利用条件风险价值、风险价值、方差来度量风险。t 时刻的 9 支股票的均值、方差、风险价值、条件风险价值如表 (5.8)所示

表 5.8: t = 889 时刻的 9 支股票的均值、方差、风险价值、条件风险价值

股票 AAPL FB AMZN PCLN BIDU YHOO NFLX LNKD TPIP

E 2.74E-04 -2.45E-03 -5.93E-04 -1.58E-03 -7.91E-04 1.93E-03 3.43E-03 3.56E-03 -2.75E-03sigma 3.57E-04 7.07E-04 3.77E-04 4.06E-04 6.54E-04 3.53E-04 1.61E-03 1.44E-03 7.48E-04VaR 4.50E-02 6.32E-02 4.51E-02 4.72E-02 5.97E-02 4.09E-02 8.91E-02 8.38E-02 6.50E-02CVaR 6.04E-04 5.78E-04 -6.25E-04 -1.92E-04 -4.65E-04 -3.30E-03 -5.37E-03 -5.52E-03 6.80E-04

有效组合是指在同样风险水平下具有最高收益的组合,不同的收益及不同收益对应的最小风

险记为有效前沿。t(t = 889) 时刻 9 支股票的不同模型的有效前沿如图 (5.10) 所示,每一个收益ER 都会对应一个最小的风险,在大多数情况下,我们更加关心收益为正 (ER>0) 时的风险。

图 5.10: t = 889 各种组合模型的有效前沿

虽然在上面我们选取了时间 t = 889 作为观察对象,但 t = 889 可能不是最好的投资时间,

我们可以规定在某一风险值下 (即我们所能承受的最大风险),我们要获得最大收益 ERt,为此,

我们需要选取最佳投资时间 t:在 t 时刻下,在规定的风险值下,我们的收益 ER 最大。由于我

们的时间跨度很大: 从 1-889,我们没有必要所有时间点 t 都进行研究,那样的工作量将会很大,

我们以 5 为步长观察 1 到 889 时刻的每个时点的有效前沿,得到的结果如图 (5.11) 所示,从中

http://www.ma-xy.com 148 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第五章 证券收益率的 GARCH 族模型比较 5.5 应用

我们看到,在时间 t = 46 时,它的有效前沿异于其它时点,在同样的风险水平下,它的收益要明

显高于其它时点,所以可以大致判断最优投资时间在 t = 46 左右。

图 5.11: 各时点 t 的不同组合投资模型的有效前沿

在最终进行求解最优投资时间和投资权重时,我们仅仅是查看了不同时点的有效前沿,选取

了最优投资时间 t = 46,实际上,我们可以利用 IENSGAII 算法求出具体的最优时间 t 和最优

投资权重 wi,由于时间和篇幅原因,我们没有做相应的处理。文中模型的另一个不足之在于收益

率模型,从表 (5.6) 中我们可以看到,仍有部分模型产生的残差是具有 ARCH 效应的,这使得我们有必要考虑建立新的收益率模型。

http://www.ma-xy.com 149 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om5.5 应用 第五章 证券收益率的 GARCH 族模型比较

http://www.ma-xy.com 150 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第六章 血管重建

6.1 题目要求

A 题:血管的三维重建断面可用于了解生物组织、器官等的形态。例如,将样本染色后切成厚约 1µm 的切片,在

显微镜下观察该横断面的组织形态结构。如果用切片机连续不断地将样本切成数十、成百的平行

切片,可依次逐片观察。根据拍照并采样得到的平行切片数字图像,运用计算机可重建组织、器

官等准确的三维形态。

假设某些血管可视为一类特殊的管道,该管道的表面是由球心沿着某一曲线 (称为中轴线)的球滚动包络而成。例如圆柱就是这样一种管道,其中轴线为直线,由半径固定的球滚动包络形

成。

现有某管道的相继 100张平行切片图像,记录了管道与切片的交。图像文件名依次为 0.bmp、1.bmp、…、99.bmp,格式均为 BMP,宽、高均为 512 个象素 (pixel)。为简化起见,假设:管道中轴线与每张切片有且只有一个交点;球半径固定;切片间距以及图像象素的尺寸均为 1。取坐标系的 Z 轴垂直于切片,第 1 张切片为平面 Z = 0,第 100 张切片为平面 Z = 99。

Z = z 切片图像中象素的坐标依它们在文件中出现的前后次序为

(−256,−256, z), (−256,−255, z), . . . , (−256, 255, z),

(−255,−256, z), (−255,−255, z), . . . , (−255, 255, z),

. . .

(255,−256, z), (255,−255, z), . . . , (255, 255, z)

试计算管道的中轴线与半径,给出具体的算法,并绘制中轴线在 XY、Y Z、ZX 平面的投

影图。图 (6.1) 是 100 张平行切片图像中的 5 张,全部图像请从网上 (http://mcm.edu.cn) 下载。关于 BMP 图像格式可参考¬­

¬《Visual C++ 数字图像处理》第 12 页 2.3.1 节。何斌等编著,人民邮电出版社,2001 年 4 月。­http://www.dcs.ed.ac.uk/home/mxr/gfx/2d/BMP.txt

151

http:/

/www.m

a-xy.c

om6.2 血管重建 第六章 血管重建

图 6.1: 6 张切片示意图

6.2 血管重建

6.2.1 模型假设

1. 假设血管无严重扭曲;

2. 假设管道中轴线与每张切片有且只有一个交点;

3. 假设球半径固定;

4. 假设切片间距以及图像象素的尺寸均为 1;

5. 假设切片拍摄不存在误差,数据误差仅与切片数字图像的分辨率有关。

6.2.2 符号说明

6.2.3 问题的分析

计算管道的中轴线与半径,给出具体的算法,并绘制中轴线在 XY、Y Z、ZX 平面的投影

图。

6.2.4 模型的建立与求解

取坐标系的 z 轴垂直于切片,第 1 张切片为平面 z = 0,第 100 张切片为平面 z = 99,并

以切片左顶点为坐标原点 o,z = 0 切片面为 xoy 面建立坐标系 oxyz,如图 (6.2) 所示

图 6.2: 血管重建坐标系示意图

如果我们想重构三维空间中的血管,我们就必须要知道滚动球的大小以及中轴线。就单一切

面而言,我们需要求解球心坐标以及球半径,我们对单一切面进行分析,如图 (6.3) 所示

http://www.ma-xy.com 152 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第六章 血管重建 6.2 血管重建

图 6.3: 单一切面坐标系

我们共有 100 张切片,第 k 个切片的球中心为 (xk, yk),球半径为 rk。下面,我们的主要工

作就是求解 xk, yk, rk,即切片的最大内切圆。对切片内部任意一个点 (xi, yi),求出它到轮廓线

上所有点 (mj , nj) 的距离,并取其最小值,由于所有内点都对应一个最小值,在这些最小值中取

最大值,即为:最大内切圆的半径。假设切片内部有 p 个点,第 i 个点的坐标为 (xi, yi),切片轮

廓线上有 q 个点,第 j 个点的坐标为 (mj , nj),则切片内部第 i 点到轮廓线上第 j 点的距离为

di,j =√(xi −mj)2 + (yi − nj)2

第 i 个点对应的最小距离 ri 为

ri = minj

dij

其中:j = 1, 2, . . . , q。最大内切圆半径为

rk = maxi

ri

其中:k = 1, 2, . . . , 100 为切片序号。将 100 个切片所对应的最大内切圆半径求取平均值,即为:血管的半径

r =1

100

100∑k=1

rk

在求解出中轴线及球的大小之后,我们就可以重建血管了。我们用函数拟合的方法来求解中

轴线函数,并拟合中轴线在 3 个平面上的投影。这里我们不介绍函数拟合的方法。

6.2.5 程序

1 %%%%%%%%%%%%%%%%%%%%%血管重建主程序%%%%%%%%%%%%%%%%%%%%%%2 %%%%%%%%%%%%%%%%%%%%求解最大内切圆%%%%%%%%%%%%%%%%%%3 %[m, medg ] = read_qiepian ; %读取切片数据4 clc , c l ea r5 load ( ’ 100pic .mat ’ )6 %计算100张切片的圆心坐标,将其记录在 j i eguo中的前两列,半径记录在 j i eguo中的第三列7 j i eguo = zeros (100 , 3) ;8 f o r k = 1:1009 sect ion = m( : , : , k) ;

http://www.ma-xy.com 153 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om6.2 血管重建 第六章 血管重建

10 [ x , y , r ] = MaxInCircle ( sect ion ) ;% 求解每个切片的内切圆半径坐标x^k , y^k,及半径 r^k11 j i eguo (k , 1) = x ;12 j i eguo (k , 2) = y ;13 j i eguo (k , 3) = r ;14 end15 save ( ’ j i eguo .mat ’ , ’ j i eguo ’ )16 %%%%%%%%%%%%%%%%%%%%求中轴线的拟合曲线及其在三个坐标平面的投影%%%%%%%%%%%%%%%%%%17 % 1.绘制中轴线18 f i gu re19 z = (1:100) ;20 plot3 ( j ieguo ( : , 1) ’ , j i eguo ( : , 2) ’ , z , ’ ro ’ ) ;21 hold on22 % 拟合中轴线

23 p1 = po ly f i t ( ( 1 : 100) ’ , j i eguo ( : , 2) , 6) ;24 p2 = po ly f i t ( ( 1 : 100) ’ , j i eguo ( : , 1) , 8) ;25 x = p1(1)*z.^6+p1(2)*z.^5+p1(3)*z.^4+p1(4)*z.^3+p1(5)*z.^2+p1(6)*z+p1(7) ;26 y = p2(1)*z.^8+p2(2)*z.^7+p2(3)*z.^6+p2(4)*z.^5+p2(5)*z.^4+p2(6)*z.^3+p2(7)*z.^2+p2(8)*z+

p2(9) ;27 plot3 (y , x , z , ’b ’ )28 grid on29 xlabe l x , y labe l y , z l abe l z30 legend ( ’中轴线 ’ , ’拟合中轴线 ’ )31 t i t l e ( ’拟合中轴线 ’ )32 hold o f f33

34 % 2.中轴线在xoz面上的投影35 f i gu re36 plot ( j i eguo ( : , 2) ’ , z , ’ ro ’ ) ;37 hold on38 % 拟合中轴线在xoz面上的投影39 p = po ly f i t ( (1 :100) ’ , j i eguo ( : , 2) , 6) ; %以6次多项式拟合,横坐标是1到10040 x = p(1)*z.^6+p(2)*z.^5+p(3)*z.^4+p(4)*z.^3+p(5)*z.^2+p(6)*z+p(7) ;41 plot (x , z , ’b ’ )42 grid on43 xlabe l x , y labe l z44 legend ( ’ xoz上的投影 ’ , ’拟合xoz上投影 ’ )45 t i t l e ( ’拟合中轴线在xoz上投影 ’ )46 hold o f f47

48 % 3.中轴线在yoz面上的投影49 f i gu re50 plot ( j i eguo ( : , 1) ’ , z , ’ ro ’ ) ;51 hold on52 % 拟合中轴线在yoz面上的投影53 p = po ly f i t ( (1 :100) ’ , j i eguo ( : , 1) , 8) ; % 以8次多项式拟合,横坐标是1到10054 y = p(1)*z.^8+p(2)*z.^7+p(3)*z.^6+p(4)*z.^5+p(5)*z.^4+p(6)*z.^3+p(7)*z.^2+p(8)*z+p(9) ;55 plot (y , z , ’b ’ )56 xlabe l y , y labe l z57 legend ( ’ yoz面上的投影 ’ , ’拟合yoz面上的投影 ’ )58 grid on59 t i t l e ( ’拟合中轴线在yoz上投影 ’ )60 hold o f f61

http://www.ma-xy.com 154 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第六章 血管重建 6.2 血管重建

62 % 4.中轴线在xoy面上的投影63 f i gu re64 plot ( j i eguo ( : , 1) ’ , j i eguo ( : , 2) ’ , ’ ro ’ ) ;65 hold on66 % 拟合中轴线在xoy面上的投影67 p1 = po ly f i t ( (1 :100) ’ , j i eguo ( : , 2 ) ,6) ;68 p2 = po ly f i t ( (1 :100) ’ , j i eguo ( : , 1 ) ,8) ;69 x = p1(1)*z.^6+p1(2)*z.^5+p1(3)*z.^4+p1(4)*z.^3+p1(5)*z.^2+p1(6)*z+p1(7) ;70 y = p2(1)*z.^8+p2(2)*z.^7+p2(3)*z.^6+p2(4)*z.^5+p2(5)*z.^4+p2(6)*z.^3+p2(7)*z.^2+p2(8)*z+

p2(9) ;71 plot (y , x , ’b ’ )72 grid on73 xlabe l x , y labe l y74 legend ( ’xoy面上的投影 ’ , ’拟合xoy面上的投影 ’ )75 t i t l e ( ’拟合中轴线在xoy上投影 ’ )76 %%%%%%%%%%%%%%%%%%带有拟合中轴线的轮廓切面图空间效果图%%%%%%%%%%%%%%%%%%77 c l c ; c l ea r ; c l o se a l l ;78 load ( ’ 100pic .mat ’ ) ; load ( ’ j i eguo .mat ’ ) ;79 n=100;m1=s i z e (m,1 ) ;m2=s i z e (m,2 ) ;80 n=zeros (m1,m2, n) ;81 f o r k=0:9982 n ( : , : , k+1)=edge (m( : , : , k+1)) ;83 end84 f o r k=0:5:9985 f o r i =1:2:51286 f o r j =1:2:51287 i f (n( i , j , k+1)==1)88 plot3 ( i−257, j−257,k+1, ’b . ’ ) ; hold on89 end , end , end , end90 hold on91

92 p1=po ly f i t ( (1 :100) ’ , j i eguo ( : , 2 ) ,6) ;93 p2=po ly f i t ( (1 :100) ’ , j i eguo ( : , 1 ) ,8) ;94 z=(1:100) ;95 x=p1(1)*z.^6+p1(2)*z.^5+p1(3)*z.^4+p1(4)*z.^3+p1(5)*z.^2+p1(6)*z+p1(7) ;96 y=p2(1)*z.^8+p2(2)*z.^7+p2(3)*z.^6+p2(4)*z.^5+p2(5)*z.^4+p2(6)*z.^3+p2(7)*z.^2+p2(8)*z+p2

(9) ;97 plot3 (y , x , z , ’ r ’ )98 grid on99 t i t l e ( ’拟合中轴线的轮廓切面图 ’ )

100 hold o f f101 %%%%%%%%%%%%%%%%%%%计算平均半径%%%%%%%%%%%%%%%%%%102 load ( ’ j i eguo .mat ’ ) ;103 r = mean( j ieguo ( : , 3 ) ) ;104 %%%%%%%%%%%%%%%%%%函数对管道表面进行三维重建 (透明化处理 )%%%%%%%%%%%%%%%%%%105 c l c ; c l ea r ; c l o se a l l ;106 load ( ’ 100pic .mat ’ ) ; load ( ’ j i eguo .mat ’ ) ;107 n=100;m1=s i z e (m,1 ) ;m2=s i z e (m,2 ) ;108 p1=po ly f i t ( (1 :100) ’ , j i eguo ( : , 2 ) ,6) ;109 p2=po ly f i t ( (1 :100) ’ , j i eguo ( : , 1 ) ,8) ;110 z=(1:100) ;111 x=p1(1)*z.^6+p1(2)*z.^5+p1(3)*z.^4+p1(4)*z.^3+p1(5)*z.^2+p1(6)*z+p1(7) ;

http://www.ma-xy.com 155 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om6.2 血管重建 第六章 血管重建

112 y=p2(1)*z.^8+p2(2)*z.^7+p2(3)*z.^6+p2(4)*z.^5+p2(5)*z.^4+p2(6)*z.^3+p2(7)*z.^2+p2(8)*z+p2(9) ;

113 r=mean( j ieguo ( : , 3 ) ) ;114 X=[ ] ;Y=[ ] ;Z=[ ] ;115 f o r t =0:0.5:4* pi ;116 xx=cos ( t ) ;117 yy=sin ( t ) ;118 x1=r*xx+x ;119 y1=r*yy+y ;120 z1=z ;121 X=[X; x1 ] ;122 Y=[Y; y1 ] ;123 Z=[Z; z1 ] ;124 end125 f i gu re126 sur f (X,Y,Z)127 shading f l a t128 aa=0.5;129 alpha (aa ) ;130 hold on131 plot3 (x , y , z , ’ r ’ )132 hold o f f133 grid on134 t i t l e ( ’使用 sur f曲面函数按照拟合中轴线和半径模拟血管 ’ )135

求解切片圆心坐标及圆半径的程序 MaxInCircle 如下1 function [ x , y , r ] = MaxInCircle ( sect ion )2 % 此函数用与求解单一切片的最大内切圆圆心坐标x^k , y^k及半径 r^k3 %%%%%%输入%%%%%4 % sect ion:单一切片;5 %%%%%%输出%%%%%6 % x:圆心横坐标;7 % y:圆心纵坐标;8 % r:圆半径;9 sect ion = 1 − sect ion ;

10 BW = edge ( sect ion , ’ sobel ’ ) ;11 BW2 = bwmorph( sect ion , ’ ske l ’ , i n f ) ;12 [ x , y , ~ ] = f ind (BW2) ; %轮廓内点13 [m, n , ~ ] = f ind (BW) ; %轮廓边界点14 d = zeros ( length (x) , length (m) ) ;15 r = zeros ( length (m) , 1) ;16 f o r i = 1: length (x)17 f o r j = 1: length (m)18 d( i , j )=sqrt ((x( i )−m( j ) )^2+(y( i )−n( j ) ) ^2) ;19 end20 r ( i ) = min(d( i , : ) ) ; % 最小半径

21 end22 [ r , ind ] = max( r ) ; % 内切圆半径

23 x = x( ind ) − 256; % 内切圆横坐标

24 y = y( ind ) − 256; % 内切圆纵坐标

25

http://www.ma-xy.com 156 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第六章 血管重建 6.2 血管重建

6.2.6 结果

中轴线及其在 xoy, yoz, zox 面上的投影结果如图 (6.4) 所示

图 6.4: 中轴线及其二维投影

拟合中轴线的轮廓切面及最终重建的血管如图 (6.5) 所示

图 6.5: 重建血管

http://www.ma-xy.com 157 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om6.2 血管重建 第六章 血管重建

http://www.ma-xy.com 158 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第七章 超薄座椅

7.1 题目要求

Problem A(MCM): The slimline seats on the airplaneAn airline seat is a seat on an airliner in which passengers are accommodated for the dura-

tion of the journey. Some airlines are now introducing new ”slimline”seats in economy class.These seats,in addition to weighing less, theoretically allow airlines to increase capacity withoutsignificantly affecting passenger comfort. These seats may or may not feature moveable head-rests, and generally do not feature adjustable lumbar support. Slimline seats are being furtherrefined, liberating more passenger space. The common point of them is a thinner backplate andless padding. However, many passengers have expressed displeasure with these seats.

Without changing the structure of the premise, how to designseat back curve, in order tomake the seat more comfortable?

How to optimize the seat backplate curve and padding, in or-der to make the seat morecomfortable, without changing the main internal structure? Please write an advertising materialwith 2-3 pages for the airline, to describe your design features and advantages concisely.

7.2 超薄座椅的优化设计

7.2.1 模型假设

1. 假设人体背部曲线为以脊椎点为顶点的二次曲线;

2. 假设人体背部侧面轮廓为直线;

3. 只按照男性身高特征设计座椅。

159

http:/

/www.m

a-xy.c

om7.2 超薄座椅的优化设计 第七章 超薄座椅

7.2.2 符号说明

7.2.3 问题一的分析与求解

问题的分析

问题需要我们在保证不改变结构的前提下,设计座椅靠背曲线,以使所述座椅更加舒适。

题目并没有给出飞机座椅的其它信息,因此,我们要自行查找材料。我们找到有关人体脊柱

结构的数据,对这组数据进行插值与拟合,从中找出合理的脊柱曲线,并将脊柱曲线作为座椅的

中轴线。

模型的建立与求解

(1) 脊柱模型因为座椅设计的舒适度主要是靠人体脊椎感知的,为了设计舒适的座椅,我们筛选出人体脊

椎的相关数据,即脊椎的主要结构 (即尾骨、腰椎、胸椎、颈椎、后脑勺头肩宽,臀宽等) 的相对距离 (距离椅背的距离),如表 (7.1) 所示。

表 7.1: 人体脊椎数据

xi 0 50 200 240 290 330 400 500 550 610 670 705 790 847yi 10 0 7.3 h1 10 7.9 4.6 1.5 0 9.3 h2 7.3 4 0

这里值得注意的是,由于我们的脊椎数据并不是很完整 (这个数据不容易查找),我们不得不想办法将其“填补”完整。查阅相关资料,我们发现人体脊椎曲线有一定的约束:合理的坐姿 (脊椎曲线) 在腰椎和肩胛骨这两个点的曲率分别为 1000 和 500。在上面的数据中,我们并没有腰椎和肩胛骨这两点的数据,为此,我们将腰背凸起和头枕处凸起最高点到腰背直板处的距离记为

hi。其中:h1,h2 分别表示腰靠和头枕处凸起的高度,且单位均为 mm(即腰椎和肩胛骨距离椅背的距离)。下面的问题是:求解最优的 h1, h2,使得人体脊椎曲线在腰椎和肩胛骨这两个点的曲率接近

1000 和 500。思考一下,每给定一个 h1, h2,我们就有一个脊椎曲线的离散点数据,我们可以根

据这个数据来求解脊椎曲线 f(插值或拟合),在求解出脊椎曲线 f 之后,我们就可以得到 f 在腰

椎和肩胛骨这两个点的曲率 R1, R2,最后,我们只要让 R1, R2 接近 1000 和 500 即可。设人体脊椎曲线为 f,用 d(R1, 1000) 来衡量曲率 R1 和 1000 之间的距离,我们可以设计模

minf∈F

d(R1, 1000) + d(R2, 500)

上述问题是一个泛函问题,并且由于不存在约束,必然存在最优的 f∗ ∈ F,使得目标最小。下面我们来考虑添加约束,设脊椎曲线的测量点为 (xi, yi),(1) 我们可以要求测量点就在脊椎曲线 f

http://www.ma-xy.com 160 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第七章 超薄座椅 7.2 超薄座椅的优化设计

上,换句话说,f 必过 xi, yi,于是我们可以设计模型

minf∈F

d(R1, 1000) + d(R2, 500)

s.t. (xi, yi)◦ ∈ f

其中:◦ ∈ 表示点在函数曲线上。既然说 f 必过测量点 (xi, yi),我们可以对测量点 (xi, yi) 进行

插值 (如下面的分段三次样条插值),插值后得到的插值曲线 F (x) 必过测量点 (xi, yi)。对于一种

固定的插值方法,原始的泛函问题变为参数问题

minh1,h2

d(R1, 1000) + d(R2, 500)

s.t. f由测量点按固定插值方法形成

上面要求 f 必过测量点 (xi, yi),这个约束是相当强的。其实许多时候,我们只需要 f 接

近/靠近测量点即可。(2) 我们约束 f 在一定程度上接近测量点 (xi, yi),于是我们可以设计模型

minf∈F

d(R1, 1000) + d(R2, 500)

s.t. (xi, yi) closeD f

其中:closeD 表示点和函数曲线以距离测度 D 接近。对于测量点 (xi, yi) 和 f 以距离测度 D 接

近,我们可以对测量点 (xi, yi) 进行某种拟合 (比如线性回归和后面采用的多项式拟合/回归等),回归后得到的函数 F (x) 和 f 以距离测度 D 接近。对于某一种固定的拟合方法,原始的泛函问

题变为参数问题

minh1,h2

d(R1, 1000) + d(R2, 500)

s.t. f由测量点按固定回归/拟合方法形成

下面我们采用分段三次样条插值和多项式拟合来求解最优脊椎曲线 f。在求解之前,我们先

给出函数 f 曲率的计算方法。函数 f(x) 在点 x 处的曲率 R(x) 为

R(x) =(1 + f ′(x))

32

|f ′′(x)|

(2) 三次样条插值像前面描述的那样,我们每给一个 h1, h2,都会形成一组脊椎测量数据 xi, yi,我们用三次样

条插值来对这组数据进行插值,设插值后的插值函数为 C(x)。我们求最优的 h1, h2,使得 C(x)

在腰椎和肩胛骨这两个点的曲率分别为 1000 和 500。我们使用 GA 算法来求解这个优化问题,objfunction 函数是 GA 求解最优人体脊椎曲线的目标函数,具体内容如下

1 function ObjV = objfunction (x)2 % 此函数是遗传算法求解人体脊椎曲线的目标函数

3 %%%%%%%%%%%%输入%%%%%%%%%%%4 % h1 = x(1):腰椎前凸深度; 17 .55 % h2 = x(2):肩胛骨前凸深度; 6 .4

http://www.ma-xy.com 161 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om7.2 超薄座椅的优化设计 第七章 超薄座椅

6 % %7 h1 = x(1) ; h2 = x(2) ;8 % 输入插值点坐标

9 x = [0 ,50 ,75 ,110 ,190 ,210 ,250 ,330 ,400 ,500 ,530 ,550 ,610 ,670 ,705 ,750 ,847] ;10 y = [14 ,10 ,5 ,4 .4 ,10 ,14 .5 ,17 .8 , h1 , 13 . 6 , 7 . 2 , 4 , 5 . 2 , h2 , 8 , 1 0 , 8 . 5 , 5 . 6 ] ;11 pp = csape (x , y , ’ not−a−knot ’ ) ;12 point1 = 240; point2 = 570;%有曲率约束的点: 1000,500腰椎和肩胛骨13 % 找到约束点的位置

14 ind1 = sum(x<=point1 ) ; ind2 = sum(x<=point2 ) ;15 % 计算约束点的曲率

16 f1 =@(x1) pp . coe f s ( ind1 ,1 ) *(x1−x( ind1 ) ) .^1+pp . coe f s ( ind1 ,2 ) *(x1−x( ind1 ) ) .^2+pp . coe f s( ind1 ,3 ) *(x1−x( ind1 ) ) .^3+pp . coe f s ( ind1 ,4 ) ;

17 f f 1 =@(x1) pp . coe f s ( ind1 ,1 ) *(x1−x( ind1 ) ) .^1+pp . coe f s ( ind1 ,2 ) *(x1−x( ind1 ) ) .^2+pp . coe f s( ind1 ,3 ) *(x1−x( ind1 ) ) .^3+pp . coe f s ( ind1 ,4 ) ;

18 f2 =@(x2) pp . coe f s ( ind2 ,1 ) *(x2−x( ind2 ) ) .^1+pp . coe f s ( ind2 ,2 ) *(x2−x( ind2 ) ) .^2+pp . coe f s( ind2 ,3 ) *(x2−x( ind2 ) ) .^3+pp . coe f s ( ind2 ,4 ) ;

19 f f 2 =@(x2) pp . coe f s ( ind2 ,1 ) *(x2−x( ind2 ) ) .^1+pp . coe f s ( ind2 ,2 ) *(x2−x( ind2 ) ) .^2+pp . coe f s( ind2 ,3 ) *(x2−x( ind2 ) ) .^3+pp . coe f s ( ind2 ,4 ) ;

20 syms x1 x2 % 通过符号变量将匿名函数转换为符号函数

21 y1 = f1 (x1) ; yy1 = f f 1 (x1) ; y2 = f2 (x2) ; yy2 = f f 2 (x2) ;% 符号函数,可求导

22 g1 = matlabFunction ( d i f f (y1) ) ;% 通过matlabFunction将符号函数转换为匿名函数23 gg1 = matlabFunction ( d i f f (yy1) ) ;24 g2 = matlabFunction ( d i f f (y2) ) ;25 gg2 = matlabFunction ( d i f f (yy2) ) ;26 R1 = ((1+g1( point1 ) ^2) ^(3/2) )/abs (gg1 ( point1 ) ) ;27 R2 = ((1+g2( point2 ) ^2) ^(3/2) )/abs (gg2 ( point2 ) ) ;28 ObjV = (R1−1000)^2+(R2−500)^2;29

GA 求解程序如下1 % 设脊椎曲线为分段三次样条函数,且在腰椎和肩胛骨的曲率为1000和5002 clc , c l ea r3 lbx=5; ubx=20; %函数自变量x(腰凸 )范围4 lby=5; uby=15; %函数自变量y(颈椎凸 )范围5 fun = @(x) objfunction (x) ;6 A = [ ] ; b = [ ] ;7 Aeq = [ ] ; beq = [ ] ;8 lb = [ lbx , lby ] ;9 ub = [ ubx , uby ] ;

10 nonlcon = [ ] ;11 nvars = 2;12 options = gaoptimset ( ’ PopulationSize ’ ,100 , ’ CrossoverFraction ’ ,0 .75 , ’ Generations ’ ,20 , ’

StallGenLimit ’ ,40 , ’ PlotFcns ’ ,{@gaplotbestf , @gaplotbestindiv }) ; %参数设置13 besth = ga( fun , nvars ,A, b ,Aeq , beq , lb , ub , nonlcon , options ) ;14

GA 进化图/迭代图如图 (7.1) 所示

http://www.ma-xy.com 162 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第七章 超薄座椅 7.2 超薄座椅的优化设计

图 7.1: GA 进化图

求解得到的最优解 h1 = 17.5mm,h2 = 6.4mm。最优解插值形成的脊椎曲线如图 (7.2) 所示

图 7.2: 三次样条插值求解的人体脊椎曲线

可以发现,三次样条插值得到的脊椎曲线必过测量点 xi, yi,这使得脊椎曲线并不是很规则,

可换用其它插值方法进行求解。

(3) 多项式拟合每给一个 h1, h2,都会形成一组脊椎测量数据 xi, yi,我们选用某种回归/拟合方法对这组数

据进行回归,设回归后的回归函数为 S(x)。我们求最优的 h1, h2,使得 S(x) 在腰椎和肩胛骨这

两个点的曲率分别为 1000 和 500。在求解 h1, h2 之前,我们先来确定用什么回归/拟合方法。这里我们选用多项式拟合方法 (还

可以选取广义线性回归、傅里叶多项式等)。下面我们来确定多项式的最高项阶数,即确定用几次多项式拟合。对人体坐姿数据进行不同的多项式拟合,将多项式拟合的最高次项阶数设置为从

1 到 7,得到各个多项式拟合的拟合优度 R2,比较这 7 个多项式的拟合效果。各个多项式对坐姿数据的拟合效果如图 (7.3a) 所示,各个多项式的 R2 变化如图 (7.3b) 所示。

http://www.ma-xy.com 163 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om7.2 超薄座椅的优化设计 第七章 超薄座椅

(a) 7 个多项式拟合坐姿数据效果图 (b) 7 个多项式拟合 f 的 R2 变化图

从图 (7.3b)中我们可以看到 7次多项式对坐姿数据的拟合效果最好,拟合优度 R2 为 0.9537,5 次多项式的拟合优度 R2 变化最大。这里,我们不可过分要求 R2,所以对坐姿数据采用 5 次多项式拟合

S(x) = a0 + a1x+ a2x2 + a3x

3 + a4x4 + a5x5

仍然选用 GA 算法来求解最优的 h1, h2,得到的最优深度为 h1 = 17.5mm,h2 = 6.4mm 最

优拟合脊椎曲线为

f∗ = S(x) = 15.08 + 0.002706x4 − 0.2852x5

如图 (7.4) 所示

图 7.4: 人体脊椎曲线的 5 次多项式拟合

得到的脊椎曲线 (座椅曲线)f 的拟合误差如表 (7.2) 所示

http://www.ma-xy.com 164 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第七章 超薄座椅 7.2 超薄座椅的优化设计

表 7.2: 座椅曲线 5 次多项式拟合的误差信息表

多项式系数 取值 95% 置信下限 95% 置信上限

a0 -5.232e-12 -6.831e-12 -3.632e-12a1 1.142e-08 8.001e-09 1.485e-08a2 -8.736e-06 -1.135e-05 -6.12e-06a3 0.002706 0.001854 0.003559a4 -0.2852 -0.3936 -0.1769a5 15.08 11.04 19.13

模型信息为 SSE:41.95,R-square:0.8706,AdjustedR-square: 0.8117,RMSE: 1.953

7.2.4 问题二的分析与求解

问题的分析

问题二要求我们在不改变主内部结构的情况下,优化座椅背板曲线并保证在舒适的前提下使

得填充物尽可能的少。首先我们根据问题一的求解可以获得有关机舱座椅设计的空间坐标值,同

时我们定义舒服的状态就是主要支撑点的压强 Pi 尽可能的小,在一些条件的约束下设计算法完

成压强较小情况的座椅背板最优曲线设计。

模型的建立与求解

(1) 设计超薄飞机座椅的依据在设计座椅时,有两方面的因素是需要我们着重考虑的,因为我们的座椅是新型超薄型座椅。

设计时,考虑的第一个因素是:空间。超薄座椅应该占有更少的空间,也就是说,座椅本身的体

积 V 要小,座椅的填充物要少,这样可以给乘客提供更多的活动空间;考虑的第二个因素是:舒

适度。超薄座椅应该给旅客提供舒适的旅途服务。想象这样两种情况:¬当你的后背完全被座椅包裹­你的后背停靠在一张木板上。毫无疑问的是第¬种情况会给人更好的舒适感,这是因为在人

体的重量 G 一定的条件下,背部和座椅的接触面积越大,人体给脊椎带来的压强 P 越小。以坐垫宽为 x 轴,坐垫长度为 y 轴,椅背高为 z 轴建立空间直角坐标系。绘制一张简单的人体脊椎

受力图,如图 (7.5) 所示:设座椅的最优倾斜角度为 αbest (0◦ < αbest < 30◦ ),人体上半部分的重量为 G⁄2,对脊椎进行受力分析。

http://www.ma-xy.com 165 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om7.2 超薄座椅的优化设计 第七章 超薄座椅

图 7.5: 人体背部脊椎压力侧视图

在情况­的条件下,是整个脊椎承担 sinαbestG/2,在情况¬的条件下,是整个背部承担 sinαbestG/2,情况¬给我们提供更多的舒适感。然而,情况¬需要我们付出更多的座椅填充物,这与我们设计

的超薄座椅理念不符。因此,我们有必要研究一下座椅包裹多少使得座椅既舒适又超薄?绘制一

个简易的座椅包裹人体的示意图,如图 (7.6) 所示:考虑一个一般的情况,脊椎和座椅的接触点为原点 O,座椅宽度为 W,人体躯干宽度为 Wmax,人体背部厚度为 dmax,背部曲线为 f(不妨将其设为二次曲线 y = ax2)。

图 7.6: 座椅包裹人体的俯视图

当我们的包裹深度为 d 时,所需要的填充物体积为 2S∆H(∆H 为高度微元),背部和座椅的接触面积为 2l∆H(∆H 为高度微元)。很显然,我们的目标是求解包裹深度 d。d 应该满足单层目标

min S =

∫ d

0

(y/a)12 dy =

∫ (d/a)1/2

0

ax2dx

max l =

∫ (d/a)1/2

0

√1 + (2ax)2dx

s.t. 0 ⩽ d ⩽ dmax

上面模型仅考虑了座椅和背部在某一特定的切面上的情况,现在将其推广到空间上。以坐垫

宽为 x 轴,坐垫长度为 y 轴,椅背高为 z 轴建立空间直角坐标系,绘制座椅和背部接触包裹的

立体图,如图 (7.7) 所示:我们设定座椅的高度为 H,设计的座椅包裹高度为 h(h 为人体颈椎高

http://www.ma-xy.com 166 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第七章 超薄座椅 7.2 超薄座椅的优化设计

度,h = 640mm),包裹深度 d 离散化为 {di}n(n 为样本点数目),实际上包裹深度曲线 df 是光

滑的,可以设置整体目标为

min S =

∫ h

0

Sidz =n∑i=1

Si (7.1)

max l =

∫ h

0

lidz =n∑i=1

li (7.2)

s.t.

0 ⩽ di ⩽ dimax

i = 1, 2, . . . , n

最终,问题转化为求解一组关于 di 的集合即 {di},{di} 使得目标函数 (7.1) 同时达到比较好的情况。

图 7.7: 座椅和背部接触包裹的立体图

(2) 超薄座椅包裹深度的优化求解上述包裹深度的求解问题是一个多目标优化问题。它需要求解一系列的包裹深度 {di} 或包

裹深度曲线 df。在实际问题的应用求解过程中,我们可以根据每家航空公司的偏好设置模型 (7.1)目标 1 和目标 2 权重,进而求解出优良的 {di}。如果希望使顾客有更大的活动空间,需要超薄座椅占据尽可能小的空间,我们可以增加模型

(7.1) 目标函数 1 的权重。如果希望顾客有更舒适的旅途环境,更好的休息条件,我们可以增加目标函数 2 的权重。同时目标函数 1 和 2 的权重之和应该为 1。现在,我们给出包裹深度问题的一种求解方法:由于各层的包裹深度曲线 df 是光滑的,而

且变动幅度很小,这里我们不妨将包裹深度曲线假设为 5 次多项式函数 (当然,我们也可以假设为傅里叶多项式,这里不做介绍):

df = a0 + a1z + a2z2 + a3z

3 + a4z4 + a5z

5

http://www.ma-xy.com 167 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om7.2 超薄座椅的优化设计 第七章 超薄座椅

图 7.8: 人体背部特殊部位

然后选取人体背部 n 个特殊部分如图 (7.8) 所示,求解其对应的 {di}n,并对 {di}n 利用多项式拟合,也可以进行三次样条插值或者 B 样条插值,使得 {di} 更加光滑。选取的人体背部 n

个特殊部位的数据如表 (7.3) 所示表 7.3: 人体背部 n 个特殊部位宽度和厚度数据

坐板 臀部 腰部 胸部 肩部

z 0 150 240 570 640x 140 160 140 180 210y 30 65 30 76 70

注:x 为 1/2 的 wmax;y 为 1/2 的 dmax。

对如表 (7.3) 中的数据进行等间距采样后的 n 个特殊部位的数据如表 (7.4) 所示,这里假设人体背部侧轮廓曲线为直线。

表 7.4: 等间距采样后的 n 个特殊部位宽度和厚度数据

z 1.00 50.00 100.00 150.00 200.00 240.00 300.00x 背宽 140.00 146.58 153.29 160.00 148.99 140.00 147.17y 体厚 30.00 41.51 53.26 65.00 45.73 30.00 38.25

z 350.00 400.00 450.00 500.00 570.00 600.00 640.00x 背宽 153.25 159.33 165.41 171.49 180.00 192.61 210.00y 体厚 45.24 52.23 59.22 66.21 76.00 73.48 70.00

注:z 为座椅高度;d 为最优包裹深度。

在采集样本的过程中,假设人体背部的侧轮廓线为一次曲线,我们可以通过采样获取更多的

样本点,这对插值和曲线拟合均有很大帮助。

运用 IENSGAII 求解 {di}n,IENSGAII 的参数设置为: ’ParetoFraction’:0.3,’Population-Size’:100,’ Generation’:200,’StallGenLimit’:200,’TolFun’:1e-100,设置变量的取值范围:0 ⩽ d ⩽ dimax

。利用表 (7.3) 的数据得到的 pareto 最优进化图如图 (7.9a) 所示;在表 (7.4) 等间距采样后的数据下求得的 pareto 最优进化图为图 (7.9b)

http://www.ma-xy.com 168 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第七章 超薄座椅 7.2 超薄座椅的优化设计

(a) 表 (7.3) 下 pareto 最优进化图 (b) 表 (7.4) 下 pareto 最优进化图

在 Pareto 最优解中选择一个适当的个体 (解),在选择时,考虑到我们是设计超薄座椅,当我们选择利用目标函数 1 获取较小解时,选取图 (7.9b) 中 10 个解如表 (7.5) 所示,解对应的目标函数 1 取值结果为:4225(体积)。相应的若选取目标函数 2 获取较小解时,目标函数 2 取值结果:-1229(舒适度)。

表 7.5: IENSGA2 某次求解的结果的 10 个解

z 1.00 50.00 100.00 150.00 200.00 240.00 300.00d 8.51 11.38 19.42 30.84 6.03 12.44 12.67

z 350.00 400.00 450.00 500.00 570.00 600.00 640.00d 13.88 8.51 14.89 20.36 13.30 3.62 12.38

注:z 为座椅高度;d 为最优包裹深度。

在上述的过程中,我们通过提取人体背部的一些特殊部分求解了相对应的最优包裹深度

{di}n,然后,我们对样本点进行插值和 5 次多项式拟合使包裹曲线更加光滑,得到的 5 次多项式为

df = 5.481− 0.0348z4 + 0.3939z5

拟合结果如图 (7.10) 所示

http://www.ma-xy.com 169 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om7.2 超薄座椅的优化设计 第七章 超薄座椅

图 7.10: 最佳包裹深度的插值和 5 次多项式拟合结果

(3) 超薄座椅的 3D 设计方案在进行座椅的 3D 设计时,我们需要根据乘客的坐姿 (脊椎) 数据、座椅的最优曲线 f、座椅

包裹背部的最优深度 df 为参考进行设计。设计 3D 座椅时,考虑到乘客的头部需要很大的活动空间,不可以将其过分固定,所以我们不对头部进行包裹,因此,设计的座椅的做大背部包裹为

640mm。下面给出座椅贴近背部的曲面 3D 示意图,如图 (7.11) 所示

图 7.11: 座椅与人体背部贴近曲面的 3D 示意图

在我们设计座椅包裹背部的 3D 曲面时,我们对座椅曲线 f 进行 3 次样条插值,并结合了 5次多项式拟合的结果,选取背部特殊部位,计算包裹深度,选取比较恰当的 pareto 解 (第 10 个

http://www.ma-xy.com 170 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第七章 超薄座椅 7.2 超薄座椅的优化设计

解),然后对包裹深度 d 进行 5 次多项式拟合。

pareto 解的选取/目标偏好对包裹深度 df 的敏感性分析

3 在求解座椅和背部的包裹曲线 df 的时候,我们在人体背部选取了 n 个特殊部位,然后再

得到的 pareto 最优解中依据目标偏好选取了某一个解 {di}n 对其进行拟合,现在,我们有必要研究不同的 pareto最优解 {di}n 的 5次多项式拟合 df 的效果,以及特殊点的数目 n(样本量)对拟合 df 的影响。

选取某一次求解的 pareto 最优解中的所有的解,对它们进行 5 次多项式拟合,拟合效果如图 (7.12) 所示,从图中我们可以看出:如果我们希望给旅客提供尽可能大的活动空间 (目标 1 的偏好严重),座椅对人体背部的包裹深度 df 几乎处处为 0(如图 (7.12) 最下面的曲线);如果我们希望给旅客提供最舒服的旅程 (目标 2 的偏好严重),座椅会对人体提供最大的包裹深度 df (如图(7.12) 最上面的曲线)。从整体来看,{df} 在人体背部的尾部变化较小,肩部变化较大,这是因为肩部有更大的体积变化幅度。

图 7.12: Pareto 最优解的 5 次多项式拟合 {df}(n = 15)

接下来,我们研究特殊点的数目 n(样本量) 对拟合 df 的影响。选取人体背部的 5 和 15 个特殊部位 (n = 5&15),分别研究他们的 pareto 最优解的 5 次多项式拟合,n = 5 时的拟合结果

如图 (7.13) 所示,n = 15 的拟合结果如图 (7.12) 所示。比较这两幅图的差别,我们可以看到:n = 5 样本点少的时候,pareto 最优解的 5 次多项式拟合 {df} 的变动幅度更大,也就是说,当我们的 n 足够大时,{df} 将接近真实的 dbestf 。

http://www.ma-xy.com 171 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om7.2 超薄座椅的优化设计 第七章 超薄座椅

图 7.13: Pareto 最优解的 5 次多项式拟合 {df}(n = 5)

程序

IENSGAII 的目标函数如下1 function Obj = obj2fun_15 (d)2 % 求解背部二次曲线

3 % 前提假设: 1 .背部曲线为二次曲线;4 % 2.背部的侧轮廓为一次直线;5 % 参数:宽度 (w) xi,厚度 ( thick ) yi6 index = [0 150 240 570 640 ] ; %z特殊位置7 x = [140 160 140 180 210 ] ; %1/2的宽度8 y = [30 65 30 76 70 ] ; %1/2的厚度9 % 依据标度 index对xy进行扩充

10 nnn = length ( index ) ;11 f o r i = 1:nnn−112 newx = [newx , l inspace (x( i ) ,x( i+1) , index ( i+1)−index ( i ) ) ] ;13 newy = [newy , l inspace (y( i ) ,y( i+1) , index ( i+1)−index ( i ) ) ] ;14 end15 % 计算二次曲线参数a=y/x^216 a = newy ./ (newx.^2) ;17 ind_z=[1 50 100 150 200 240 300 350 400 450 500 570 600 640 ] ;18 n = length ( ind_z) ;19 % 求面积S和弧长L(有对称性可知,只需求解在第一挂限的情况即可*2)20 aa = a( ind_z) ;21 x = (d ./ aa ) .^(1/2) ;%d=ax^222 f o r i =1:n23 S( i , 1) = integ ra l (@(xx)a( i )*xx .^2 ,0 ,x( i ) ) ;% 求 f i的面积0−xi (积分 )24 L( i , 1) = integ ra l (@(xx) (1+(2*a( i )*xx) .^2) .^(1/2) ,0 ,x( i ) ) ;%求 f i的弧长25 end26 Obj(1) = sum(S) ;27 Obj(2) = −sum(L) ;28

IENSGAII 的主程序如下1 %% 多目标优化IENSGA2的主程序2 % min min 类型的多目标优化

http://www.ma-xy.com 172 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第七章 超薄座椅 7.2 超薄座椅的优化设计

3 clc , c l ea r4 f i tne s s fun = @obj2fun_15 ;%适应度函数句柄5 % 确定变量个数 di6 ind_z=[1 50 100 150 200 240 300 350 400 450 500 570 600 640 ] ;7 nvars = length ( ind_z) ;%变量个数8 % 确定变量取值范围 lb , ub9 index = [0 150 240 570 640 ] ; %z特殊位置

10 x = [140 160 140 180 210 ] ; %1/2的宽度11 y = [30 65 30 76 70 ] ; %1/2的厚度12 % 依据标度 index对xy进行扩充13 nnn = length ( index ) ;14 f o r i = 1:nnn−115 newx = [newx , l inspace (x( i ) ,x( i+1) , index ( i+1)−index ( i ) ) ] ;16 newy = [newy , l inspace (y( i ) ,y( i+1) , index ( i+1)−index ( i ) ) ] ;17 end18 %%%%%%%%%%%%GA自变量 di的范围%%%%%%%%%%%19 %第一种情况:在最大值的1/3,2/3范围20 % lb=newy( ind_z) /3;21 % ub=2*newy( ind_z) /3;22 %第二种情况:在0:最大值范围23 lb=zeros (1 , nvars ) ;24 ub=newy( ind_z) ;25 %%%%%%%%%%%%非常关键的地方%%%%%%%%%%%%%26 A=[ ] ; b=[ ] ;Aeq=[ ] ; beq=[ ] ;27 options=gaoptimset ( ’ ParetoFraction ’ , 0 . 3 , . . .28 ’ PopulationSize ’ , 1 0 0 , . . .29 ’ Generation ’ , 2 0 0 , . . .30 ’ StallGenLimit ’ , 2 0 0 , . . .31 ’TolFun ’ ,1e−100 , . . .32 ’ PlotFcns ’ , @gaplotpareto ) ;33 [ d_index ,Obj]=gamultiobj ( f i tness fun , nvars ,A, b ,Aeq , beq , lb , ub , options ) ;34

http://www.ma-xy.com 173 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om7.2 超薄座椅的优化设计 第七章 超薄座椅

http://www.ma-xy.com 174 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第八章 太阳影子定位

8.1 题目要求

A 题:太阳影子定位如何确定视频的拍摄地点和拍摄日期是视频数据分析的重要方面,太阳影子定位技术就是通

过分析视频中物体的太阳影子变化,确定视频拍摄的地点和日期的一种方法。

1. 建立影子长度变化的数学模型,分析影子长度关于各个参数的变化规律,并应用你们建立的模型画出 2015 年 10 月 22 日北京时间 9:00-15:00 之间天安门广场 (北纬 39 度 54 分 26 秒,东经 116 度 23 分 29 秒)3 米高的直杆的太阳影子长度的变化曲线。

2.根据某固定直杆在水平地面上的太阳影子顶点坐标数据,建立数学模型确定直杆所处的地点。将你们的模型应用于附件 1 的影子顶点坐标数据,给出若干个可能的地点。

3. 根据某固定直杆在水平地面上的太阳影子顶点坐标数据,建立数学模型确定直杆所处的地点和日期。将你们的模型分别应用于附件 2 和附件 3 的影子顶点坐标数据,给出若干个可能的地点与日期。

4.附件 4 为一根直杆在太阳下的影子变化的视频,并且已通过某种方式估计出直杆的高度为 2 米。请建立确定视频拍摄地点的数学模型,并应用你们的模型给出若干个可能的拍摄地点。如果拍摄日期未知,你能否根据视频确定出拍摄地点与日期?

8.1.1 附件 1

说明:坐标系以直杆底端为原点,水平地面为 xy 平面。直杆垂直于地面。测量日期:2015年 4 月 18 日。附件 1 数据如表 (8.1) 所示

175

http:/

/www.m

a-xy.c

om8.2 太阳影子定位研究 第八章 太阳影子定位

表 8.1: 太阳影子定位:附件 1

ti(北京时间) li 影长 (米) ti(北京时间) li 影长 (米)

14:42 1.1496 15:15 1.540214:45 1.1822 15:18 1.579914:48 1.2153 15:21 1.620114:51 1.2491 15:24 1.661314:54 1.2832 15:27 1.703314:57 1.3180 15:30 1.746215:00 1.3534 15:33 1.790115:03 1.3894 15:36 1.835015:06 1.4262 15:39 1.880915:09 1.4634 15:42 1.927915:12 1.5015

8.2 太阳影子定位研究

8.2.1 模型的假设

1. 假设研究的物体是垂直于该地点的切平面;

2. 影子长度仅考虑切平面上的投影长,不考虑弧度;

3. 假设地球为球体;

4. 假设一天时间内,太阳直射点的纬度不变 (赤纬角在一天内保持不变);

5. 不同年份的同一时间、同一地点的太阳高度角是相同的;

6. 假设地球绕太阳公转的轨道为圆形轨道。

8.2.2 符号说明

8.2.3 问题一的分析与求解

问题的分析

建立影子长度变化的数学模型,分析影子长度关于各个参数的变化规律,并应用你们建立的

模型画出 2015 年 10 月 22 日北京时间 9:00-15:00 之间天安门广场 (北纬 39 度 54 分 26 秒, 东经 116 度 23 分 29 秒)3 米高的直杆的太阳影子长度的变化曲线。

第一问的主要目标是让我们确定要分析的量,并建立各个量之间的函数关系。

http://www.ma-xy.com 176 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第八章 太阳影子定位 8.2 太阳影子定位研究

模型的建立与求解

我们要通过物体影子的数据 (各时刻的长度变化和方向变化) 来判定物体的位置 (经纬度) 及拍照时间。某固定杆高的影子长度在不同地点和时点下应该是不同的。可以推测影长是关于杆

高、日期、时间、经度和纬度的函数,事实也确实如此。下面,我们找出各变量间具体的函数关

系。在建立函数关系式之前,我们对太阳直射点、赤纬角和时角等相关概念做了了解,并给出了

某日某时杆高为 h 的观测物在地球某点 O 处的太阳影长变化图,如图 (8.1) 所示

图 8.1: 太阳影子长度模拟图

假设研究的物体是垂直于该地点的切平面;并且影子长度仅考虑切平面上的影长,不考虑弧

度。由于地球半径很大,杆子在地球表面的影长 l0 可以用杆子所在切平面上的影长 l 做近似代

替,由此可建立杆高 h(观测物的高度) 关于影长 l(真实影长 l0 的估计值) 和太阳高度角 ρ 的关

系式

l =h

tan ρ =h√1− sin2 ρ

sin ρ

其中:ρ 是太阳光线与拍摄地点切平面的交角,称为太阳高度角。我们设经度为 θ,纬度为 φ,年

份为 y,日期为 n,时刻为 t,杆高为 h,影长为 l。应该可以想到的是 ρ 是 φ, θ, n, t, y 的函数,

那么,这种函数关系到底是怎样的呢?为简单处理,假设不考虑 y 对 ρ 的影响,即不同年份的同

一时间、同一地点的太阳高度角是相同的。下面,我们来求解 ρ 或者 sin ρ。假设地球是一球体,以其球心为坐标原点,以赤道面作为 xoy 面,以垂直 xoy 向北的方向

为 z 轴方向建立三维直角坐标系 oxyz,如图 (8.2) 所示

图 8.2: 地球坐标系

图中 w 为太阳时角,δ 为太阳直射点维度 (太阳赤纬),O 为待求地点,φ 为 O 点的纬度。

http://www.ma-xy.com 177 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om8.2 太阳影子定位研究 第八章 太阳影子定位

我们假设一天内太阳直射点的维度不变,在给出 ρ 之前,有一些常识要说明

1. 太阳直射点的太阳高度角为 90◦;

2. 太阳赤纬是太阳直射点的纬度 δ,其一年内的变化情况如图 (8.3) 示意图

图 8.3: 太阳赤纬一年的变化情况

3. 太阳光线到达地球时时平行的 (这点需要假设);

4. 以太阳直射点为圆心的圆上各地点的太阳高度角近似相等;

5. 自转改变太阳直射点的经度,公转改变维度。

我们知道,太阳高度角 ρ 是线 (太阳光线) 与面 (待求地点 O 的切平面) 的夹角,因此,我们需要知道平面的法向量以及线的向量。O 点所在的切平面的单位法向量为

n = (cosφ cosw, cosφ sinw, sinφ)

而第 n 天 t 时刻的入射向量为

m = (− cos δ, 0,− sin δ)

则 O 点的太阳高度角 ρ(如图 (8.4) 所示) 求解为

sin ρ = −n · m = cosφ cos δ cosw + sinφ sin δ

其中:δ 为太阳赤纬,w 为太阳时角。

图 8.4: 太阳照射点的投影向量

http://www.ma-xy.com 178 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第八章 太阳影子定位 8.2 太阳影子定位研究

关于赤纬角 δ 的计算方法有:Cooper法、Spencer法、Stome法、Bpirges法等;而关于太阳时角 w 的计算方法亦有:Wloof 法、Spencer 法、Whillier 法、Lamm 法等。杜春旭等人在《一种高精度太阳位置算法》一文中对上述算法进行了分类比较,显示在每天世界 0 时时,Bpirges法和 Lamm 法求解的 δ 和 w 的误差较小,结果较为精确。现在我们引用 Spencer 在 1971 年给出的赤纬角 δ(弧度) 的计算公式

δ = 0.006918− 0.399912 cos(Γ) + 0.070257 sin(Γ)− 0.006758 cos(2Γ)

+ 0.00907 sin(2Γ)− 0.002697 cos(3Γ) + 0.00148 sin(3Γ)

其中:Γ = 2π(n− 1)/365,单位为弧度,n 表示一年中的第 n 天即日期,如 1 月 1 日计 n = 1,

12 月 31 日的计 n = 365。

太阳赤纬角:下面,我们尝试给出太阳赤纬 δ 的求解。设地球 P 绕太阳 S 公转的轨道为圆

形轨道。太阳位于圆形轨道的圆心,以太阳为原点,以圆形轨道面 (黄道平面) 为 xoy 面家里公

转坐标系,如图 (8.5) 所示

图 8.5: 公转坐标系

设一年有 T ∗ 天,一天有 t∗ 小时,以春分 (3 月 21 日) 为第 0 天 (n = 0),则第 n 天 t 时

刻,地球的坐标为

P (r cos 2πTT ∗ , r sin 2πT

T ∗ , 0)

其中:r 为地球中心到太阳中心的距离,T = n+ tt∗。

设第 n 天 t 时刻,太阳直射地球的维度 δ(太阳赤纬),已知在春分 t0 时刻太阳直射赤道,即

当 n = 0, t = t0 时,δ = 0,此时的 T 为 T0t0t∗。而地球中心坐标为

P0(r cos 2πT0

T ∗ , r sin 2πT0

T ∗ , 0)

设北回归线的纬度为 δ0,则北极方向是 (0, 0, 1) 绕 SP0 轴旋转 δ0 后的方向。在地球绕太阳公转

过程中,北极方向始终保持不变,因而

−−→PN =

(sin 2πT0

T ∗ sin δ0,− cos 2πT0

T ∗ sin δ0, cos δ0)

−→PS 与

−−→PN 的夹角为 π

2− δ,因此

cos(π2− δ) =

−→PS ·

−−→PN

|−→PS||

−−→PN |

http://www.ma-xy.com 179 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om8.2 太阳影子定位研究 第八章 太阳影子定位

sin δ = − cos 2πTT ∗ sin 2πT0

T ∗ sin δ0 + sin 2πT

T ∗ cos 2πT0

T ∗ sin δ0 = sin2π(n+ t−t0

t∗

)T ∗ sin δ0

为简单,假设赤纬角在一天内保持不变,则上式可写为

sin δ = sin 2πn

T ∗ sin δ0

太阳时角:定义太阳时角 w 在正午时为 0◦,每隔一小时增加 15◦,上午为正,下午为负。但

考虑到实际两地之间存在时差并对时角产生影响,且中国各地区均以北京时间为标准 (北京位于120◦E,所在时区为东 8 区) 因此某地以北京时间为依据的时角 w(弧度化) 的计算公式为

w =π(12− t)15◦

180◦+

π

180◦

120◦ − θ θ ∈ [0, 180◦E]

120◦ + θ θ ∈ [0, 60◦W ]

240◦ − θ θ ∈ [60, 180◦W ]

其中:w 为时角,t 为时间 (以小时为单位,可为小数,如 13.326), 为经度。通过以太阳高度角赤纬角 δ 和太阳时角 w 为桥梁,搭建了影长 l 关于杆高 h、日期 n、时间

t、经度 θ 和纬度 φ 的具体函数关系式。依据此关系式,可以解决下列关于太阳影子定位的问题:

1. 给出具体的 φ、θ、n、h,观察 l 随 t 的变化;

2. 给出具体的 n、h、t,观察 l 随 φ、θ 的变化;

3. 给出一组 (ti, li)i = 1, 2, . . . , k,(k 为观测个数,ti, li 皆可在具体的视频中求得),在 n 已知

h 未知但固定的条件下,求出视频的拍摄位置 φ, θ;

4. 给出一组 (ti, li)i = 1, 2, . . . , k,h 未知但固定的条件下,求出视频的拍摄位置 φ, θ 和拍摄

日期 n;

针对问题 1 和问题 2,可通过各参数间的函数关系式绘制图像进行分析,相对简单。问题 4在问题 3 的基础上增加了一个参数 n 的求解,因此,我们将详细讨论问题 3 的求解,简要分析问题 4。对模型求解之前,我们做如下规定:由于问题中的参数很多,均以如下表达式规范参数

y = f(x;α, β|C)

其中:y 表示输出变量 (可以是标量也可以是向量),x 表示出入变量 (可以是标量也可以是向量),α, β 表示参数,C 表示某变量的固定值。

程序

Matlab 给出了一个求解影长变化的示例¬,可以作为参考。下面,我们给出 3m 长杆 9 点到15 点太阳影子长度变化求解程序,其中 Rad2deg 函数是将角度转化为弧度,numdate 函数是用于计算天数 n,求解程序如下:

¬http://cn.mathworks.com/help/matlab/examples/live-editor-intteractive-narrative.html

http://www.ma-xy.com 180 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第八章 太阳影子定位 8.2 太阳影子定位研究

1 phi = Rad2deg(39 ,54 ,26) ;%纬度(角度转化为弧度)2 theta = Rad2deg(116 ,23 ,29) ;%经度3 h = 3;%杆高4 n = numdate(2015 ,10 ,22) ;%天数n5 t = [ 9 : 0 . 2 : 1 5 ] ;6 f o r i = 1: length ( t )7 Gamma = 2*pi *(n−1)/365;%弧度8 delta = 0.006918−0.399912* cos (Gamma)+0.070257* s in (Gamma) . . .9 −0.006758*cos (2*Gamma)+0.000907* s in (2*Gamma)−0.002697*cos (3*Gamma)+0.00148*

s in (3*Gamma) ;%弧度10 w = (12−t ( i ) ) *15*pi/180+Rad2deg(3 ,36 ,31) ; %弧度11 sin_rho = sin ( phi )* s in ( delta )+cos ( phi )*cos (w)*cos ( delta ) ;12 l ( i ) = h* sqrt(1−sin_rho^2)/sin_rho ;13 end14 f i gu re15 plot ( t , l , ’ r−’ )16 set ( gca , ’XTick ’ , [ 9 : 1 5 ] )17 set ( gca , ’XTickLabel ’ ,{ ’ 9:00 ’ , ’ 10:00 ’ , ’ 11:00 ’ , ’ 12:00 ’ , ’ 13:00 ’ , ’ 14:00 ’ , ’ 15:00 ’ })18 xlabe l ( ’北京时间 ’ )19 ylabe l ( ’杆影子长/m’ )20 t i t l e ( ’ 3m长杆9点到15点太阳影子长度变化曲线图 ’ )21

结果

3m 长杆 9 点到 15 点太阳影子长度变化曲线图如图 (8.6) 所示

图 8.6: 3m 长杆 9 点到 15 点太阳影子长度变化曲线图 (无插值)

8.2.4 问题二的分析与求解

问题的分析

根据某固定直杆在水平地面上的太阳影子顶点坐标数据,建立数学模型确定直杆所处的地

点。将你们的模型应用于附件 1 的影子顶点坐标数据,给出若干个可能 的地点。

http://www.ma-xy.com 181 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om8.2 太阳影子定位研究 第八章 太阳影子定位

通过抓帧工具获得某一视频中的 (ti, li) 数据 k 组 (i = 1, 2, . . . , k),且视频的拍摄日期 n 已

知,杆高 h 固定 (可分为已知和未知),利用 k 组 (ti, li) 数据求解视频的拍摄位置 (φ, θ)。针对此

问题,基本思想是利用最小二乘法求解 l = f(t;φ, θ|n, h) 中的参数 (φ, θ),并给定输入变量 t 和

输出变量 l 的 k 组观测值 (ti, li)(i = 1, 2, . . . , k) 进行求解,使总离差平方和最小的 (φ, θ) 即为所

求。然而这种方法并不适用于杆高 h 未知的情况,即使转化为 h = f(t, l;φ, θ|n) 仍无法求解,因此需重新考虑。既然各变量关系已知,给出了 k 组 (ti, li) 的观测值,那么每代入一组 (ti, li) 都

会有一个杆高 h 的估计值 hi,相应的会得到 k 组 hi,由于真实杆高 h 未知但固定,可详细分析。

模型的建立与求解

方法 1:最小二乘模型根据附件 1 中的点坐标 (xi, yi) 我们可以求出杆的影长 li(i = 1, 2, . . . , k)。当然,我们还可

以根据影长公式

li =h√

tan ρi(8.1)

我们可以求解 (φ, θ) 使真实值 li 与测量值 li 的离差平方和最小 (最小二乘),即

minφ,θ

J(φ, θ) =k∑i=1

(li − li)2

但是,上面计算影长的公式 (8.1) 的杆高 h 未知,这使得问题变得困难。其实,这里我们可

以任意设置一个杆高 h(只要有就可以了),在计算的过程中杆高的影响会消失,我们仍能求解出最佳的地点 (φ, θ)∗。

方法 2:比例模型上面的分析中杆高 h 未知,我们可以想办法消去杆高 h。将各影长相除,我们研究影长变化

的改变。考虑相邻两个影长的变化,有

minφ,θ

J(φ, θ) =

k−1∑i=1

(li+1

li− li+1

li

)2

上面的模型中不再要求 h 已知。其实,我们还可以建立更一般的目标

minφ,θ

J(φ, θ) =k∑

j=i+1

k−1∑i=1

(ljli− lj

li

)2

方法 3:最小方差模型最小方差模型是基于下面的思想:真正的视频拍摄位置 (φ, θ)会使得 ∀i, j ∈ [1, k]有 hi = hj

成立,即杆高 h 的估计值 hi 每次求解都相等 h1 = h2 = · · · = hk。越接近真实的 (φ, θ) 估计值

hi, hj 之间的偏差越小,即

minφ,θ

J(φ, θ) =∑i,j

|hi − hj |

http://www.ma-xy.com 182 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第八章 太阳影子定位 8.2 太阳影子定位研究

但上面目标处理起来并不是很方便,我们将其转化为下面的优化问题

minφ,θ

1

k

k∑i=1

(hi − E(hi))2 = Var(hi) unknown h

1

k

k∑i=1

(hi − h)2 known h

其中:h 表示已知的杆高,hi 为杆高的估计值,E(hi) 为杆高的估计值的期望,V ar(hi) 为杆高的估计值的方差,k 为观测组数。

要对上述优化模型进行求解,提出的简单直观的想法是:遍历地球上所有的地点 (φ, θ),每

个 (φ, θ) 都会有 hi,找到 minV ar(hi) 所在的 (φ, θ)∗ 即可。这种做法的求解结果虽然精确,但

计算量却异常大;且因为需要遍历更多的点所以精度越高计算量越大。基于这种思想,且考虑到

计算的精度和时间,设计了粗劣搜索算法 + 精确搜索算法对问题进行求解。上面建立了 3个不同的优化模型,下面我们来考虑相应的约束条件。首先,纬度应该在 ±90◦

之间,即 −90◦ < φ < 90◦;此外,直杆的影子只有在存在太阳直射的地方才能出现,所以要约束

ρ > 0。由此有最终的优化模型

minφ,θ

J(φ, θ)

s.t.

− 90◦ < φ < 90◦

ρi > 0

i = 1, 2, . . . , k

程序

根据影子长度的变化,还可以判断出当地时间是上午还是下午,影子长度单调递增是下午。

对于上述的 3 个优化模型,可以使用牛顿法、拟牛顿法或者遗传算法等进行求解。还可以采用搜索算法进行求解,搜索法本质上是枚举,将优化变量按一定精度离散化,得到一系列离散值,对

所有这些离散值进行枚举,寻找其中的最优解及最优值。搜索算法编程较为容易,但工作量大,

为了减少搜索时间,可以采用变步长搜索法,即先用较大的精度对优化变量离散,搜索得到其中

的最优解,然后缩小精度,在最优解附近按更小精度离散化后再进行搜索。

问题二的求解程序如下,这里我们仅给出模型一:最小方差模型的求解程序

1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%模型一:最小方差模型%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 clc , c l ea r3 %部分量输入4 n = numdate(2015 ,4 ,18) ;%日期5 f o r i =1:66 t ( i )=time2h(14 ,42+3*( i−1)) ;7 end8 f o r i =7:219 t ( i )=time2h(15 ,0+3*( i−7)) ;

10 end11 l = [1.149625826 1.182198976 1.215296955 1.249051052 1.28319534 1.317993149 . . .

http://www.ma-xy.com 183 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om8.2 太阳影子定位研究 第八章 太阳影子定位

12 1.353364049 1.389387091 1.426152856 1.463399853 1.501481622 1.5402318171 .579853316 . . .

13 1.620144515 1.661270613 1.703290633 1.74620591 1.790050915 1.835014272 1.8808750011.927918447 ] ;

14 a = [ t ’ , l ’ ] ;15 k = s i z e (a , 1) ;16 %% 遍历式粗搜索C17 var_h = zeros (90 , 180) ;18 f o r phi = 1:1 :90 %纬度19 f o r theta = 1:1 :180 %经度20 f o r i = 1 : k21 t = a( i , 1) ;22 l = a( i , 2) ;23 Gamma = 2*pi *(n − 1) /365; %弧度24 delta = 0.006918 − 0.399912* cos (Gamma) + 0.070257* s in (Gamma) . . .25 −0.006758*cos (2*Gamma) + 0.000907* s in (2*Gamma) − 0.002697* cos (3*Gamma) +

0.00148* s in (3*Gamma) ;%弧度26 w = ((12− t ) *15 + (120−theta ) )*pi /180; %弧度27 sin_rho = sin (Rad2deg(phi , 0 , 0) )* s in ( delta ) + cos (Rad2deg(phi , 0 , 0) )*

cos (w)*cos ( delta ) ;28 h( i ) = l *sin_rho/ sqrt (1 − sin_rho^2) ;29 end30 h ;31 var_h(phi , theta ) = var (h) ;32 end33 end34 best_h = min(min(var_h) ) ;35 disp ( ’粗糙区域的经纬度为: ’ )36 [ cbest_phi , cbest_theta ] = f ind (var_h == best_h)37 disp ( ’粗糙区域的弧度为: ’ )38 cbestx = Rad2deg( cbest_phi , 0 , 0) %纬度39 cbesty = Rad2deg( cbest_theta , 0 , 0) %经度40 %% 遍历式精搜索S41 eps i lon = 0.001 ; %设置遍历搜索精度42 x = cbestx − 0.05 : eps i lon : cbestx + 0 .05 ; %搜索范围43 y = cbesty − 0.05 : eps i lon : cbesty + 0 .05 ;44 svar_h = zeros ( length (x) , length (x) ) ;45 f o r i i i = 1: length (x)46 f o r i i = 1: length (y)47 f o r i = 1 : k48 t = a( i , 1) ;49 l = a( i , 2) ;50 phi = x( i i i ) ; %纬度51 theta = y( i i ) ; %经度52 Gamma = 2*pi *(n − 1) /365; %弧度53 delta = 0.006918 − 0.399912* cos (Gamma) + 0.070257* s in (Gamma) . . .54 −0.006758*cos (2*Gamma) + 0.000907* s in (2*Gamma) − 0.002697* cos (3*Gamma) +

0.00148* s in (3*Gamma) ;%弧度55 w = ((12 − t ) *15)*pi/180+ (Rad2deg(120 , 0 , 0) − theta ) ; %弧度56 sin_rho = sin ( phi )* s in ( delta ) + cos ( phi )*cos (w)*cos ( delta ) ;57 ch( i ) = l *sin_rho/ sqrt (1 − sin_rho^2) ;58 end59 ch ;

http://www.ma-xy.com 184 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第八章 太阳影子定位 8.2 太阳影子定位研究

60 svar_h( i i i , i i ) = var ( ch) ;61 end62 end63 sbest_h = min(min(svar_h) ) ;64 disp ( ’精确区域的弧度为: ’ )65 [ ix , iy ] = f ind (svar_h == sbest_h ) ;66 sbestx = x( ix )67 sbesty = y( iy )68 disp ( ’精确区域的经纬度为: ’ )69 [ sbest_phi_jiao , sbest_phi_fen , sbest_phi_miao ] = Deg2rad( sbestx )70 [ sbest_theta_jiao , sbest_theta_fen , sbest_theta_miao ] = Deg2rad( sbesty )71 %% 设置初始种群的GA精确查找72 %产生初始种群,十进制,由上面程序产生的一些粗劣的区域和一些随机生成的种群组成73 %phi的取值为0−90, theta的取值为0−180,随机生成点。74 %75 %依据 cbestx ; cbesty构建十进制初始种群76 N1 = 10; %种群大小为100 = 10+9077 n1 = 2; %变量个数78 Chrom01 = zeros (N1, 2) ;79 f o r i =1:N180 Chrom01( i , 1 ) = Rad2deg( cbest_phi + round (( rand*2−1)*5) , rand*60 , rand*60) ;% 角度

弧度化+round (( rand*2−1)*1)81 Chrom01( i , 2 ) = Rad2deg( cbest_theta + round (( rand*2−1)*5) , rand*60 , rand*60) ;% 角

度弧度化+round (( rand*2−1)*1)82 end83 N2 = 90; %添加的种群的大小84 Chrom02 = zeros (N2, 2) ;85 f o r i =1:N286 Chrom02( i , 1) = cbestx + 0.1* rand ;87 Chrom02( i , 2) = cbesty + 0.1* rand ;88 end89 Chrom0 = [Chrom01 ;Chrom02 ] ; %100行2列90 % GA求解91 f i t n e s s f c n = @(Chrom) GA_objfun_wen2(Chrom, a ,n) ;92 A=[ ] ; b=[ ] ;93 LB = [0 , 0 ] ;94 UB = [ pi /2 , pi ] ;95 nonlcon = [ ] ;96 IntCon = [ ] ;97 % optimoptions的设置 https :// cn .mathworks . com/help/gads/genetic−algorithm−options . html

#f1422398 options = optimoptions ( ’ ga ’ , ’ PopulationType ’ , ’ doubleVector ’ , . . .99 ’ PopulationSize ’ , 100 , ’ Init ia lPopulat ionMatrix ’ , Chrom0 , . . .

100 ’ PlotFcn ’ , {@gaplotbestf }) ;101 GA_xy = ga( f i tne s s f cn , n1 , A, b , [ ] , [ ] , LB, UB, nonlcon , IntCon , options ) ;102 disp ( ’GA精确区域的弧度为: ’ )103 GA_xy104 disp ( ’GA精确区域的经纬度为: ’ )105 [ GAbest_phi_jiao , GAbest_phi_fen , GAbest_phi_miao ] = Deg2rad(GA_xy(1) )106 [ GAbest_theta_jiao , GAbest_theta_fen , GAbest_theta_miao ] = Deg2rad(GA_xy(2) )107 %% 不设置初始种群的GA查找108 options = optimoptions ( ’ ga ’ , ’ PopulationType ’ , ’ doubleVector ’ , . . .109 ’ PopulationSize ’ , 500 , ’ ConstraintTolerance ’ ,1e−3, ’ FunctionTolerance ’ ,1e−10 , . . .

http://www.ma-xy.com 185 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om8.2 太阳影子定位研究 第八章 太阳影子定位

110 ’ PlotFcn ’ , {@gaplotbestf }) ;111 GA_xy_c = ga( f i tne s s f cn , n1 , A, b , [ ] , [ ] , LB, UB, nonlcon , IntCon , options ) ;112 disp ( ’GA精确区域的弧度为: ’ )113 GA_xy_c114 disp ( ’GA精确区域的经纬度为: ’ )115 [ GAbest_phi_jiao , GAbest_phi_fen , GAbest_phi_miao ] = Deg2rad(GA_xy_c(1) )116 [ GAbest_theta_jiao , GAbest_theta_fen , GAbest_theta_miao ] = Deg2rad(GA_xy_c(2) )117 %% GA查找其他可能的位置 (经纬度扩展 )118 LB = [−pi /2 , 0 ] ;119 UB = [ pi /2 , pi ] ;120 GA_maybe_xy = ga( f i tne s s f cn , n1 , A, b , [ ] , [ ] , LB, UB, nonlcon , IntCon , options ) ;121 disp ( ’GA精确区域的弧度为: ’ )122 GA_maybe_xy123 disp ( ’GA精确区域的经纬度为: ’ )124 [ GAbest_phi_jiao , GAbest_phi_fen , GAbest_phi_miao ] = Deg2rad(GA_maybe_xy(1) )125 [ GAbest_theta_jiao , GAbest_theta_fen , GAbest_theta_miao ] = Deg2rad(GA_maybe_xy(2) )126

结果

我们选取 2015 年全国大学生数学建模竞赛 A 题中附件 1 的数据 (见表8.1) 进行求解。已知视频拍摄日期为 2015 年 4 月 18 日,即 n = 108,杆高 h 未知但固定,时间 t 和影长 l 的一系

列观测值 (ti, li) 如表 (8.1) 所示,共计 21 个观测值,即 k = 21,并且视频真实的拍摄地点为真

实拍摄地 18.3◦N, 109.5◦E,这可以将求解后的地点与之比较。

利用上面的最小方差法对问题进行求解,结果如表 (8.2) 所示。

表 8.2: 太阳影子问题二结果表

变量 粗搜索 精搜索 GA(有初始种群) GA(无初始种群) 可能地点 真实拍摄地

纬度 20◦N 19◦22′11.0871′′N 19◦20′′57.2972′′N 19◦20′41.9352′′N −80◦N 18.3◦N

经度 108◦E 108◦51′33.9721′′E 108◦52′54.4503′′E 108◦53′13.0378′′E 49◦E 109.5◦E

注:杆高 h 未知、日期 n = 108 天 (2015 年 4 月 18 日),影长 li 和时间 ti 已有观测值.

遗传算法进化图如图 (8.7a) 所示,不设置初始种群的遗传算法进化图如图 (8.7b) 所示

(a) (b)图 8.7: 遗传算法迭代图

http://www.ma-xy.com 186 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第八章 太阳影子定位 8.2 太阳影子定位研究

8.2.5 问题三的分析与求解

问题的分析

根据某固定直杆在水平地面上的太阳影子顶点坐标数据,建立数学模型确定直杆所处的地点

和日期。将你们的模型分别应用于附件 2 和附件 3 的影子顶点坐标数据,给出若干个可能 的地点与日期。

和第二问不同的是,这里不仅要求杆的地点 φ, θ,还要求拍摄日期 n。这里我们仍然可以使

用第二问中的三个优化模型,不过这里会增加一个新的优化变量 (日期 n),并且这个参数是整数型变量,与经纬度的实值型变量不同。对于这一点,我们要重新讨论。

如果采用搜索法求解,只需要对日期也进行搜索即可:得到 365 天的最优解及最优值,然后在得到的 365 个最优值中选取最优解 (这种方法好像有些问题)。如果采用牛顿法,不应将日期 n

作为实值型变量,可将优化算法与搜索法结合,对日期进行枚举,对每一天采用优化算法求解。

模型的建立与求解

单纯采用太阳影子长度进行求解的效率不是很高,因此,我们需要更多的影子信息。注意到,

根据附件中的坐标信息 xi, yi,我们还可以求出影子的角度。但是附件数据并未说明坐标轴是如

何选取的,这使得问题变得困难。像未知高度 h 一样,我们可以将方位角进行相除,得到方位角

变化情况。仅考虑影子角度的相对变化 (即影子角度的改变量),这会方便我们建立坐标系 xOy,

因为不需要过多关注 x 和 y 轴的真实方向,建立影子角度变化模拟图如图 (8.8)

图 8.8: 太阳影子角度变化模拟图

图 (8.8) 中的 h 代表杆高,O 为杆高地点,lk 为第 k 个影长观测值,(xi, yi) 表示第 i(i =

1, 2, . . . , k) 个影长在 xOy 坐标系的顶点坐标,γi 为第 i 个影子角度的大小 (影角) 的观测/估计,其计算公式为

γi = arctan yixi

上面给出了影角的观测值求解方法,下面,我们给出影角的理论公式。考虑图 (8.4) 的情况,

http://www.ma-xy.com 187 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om8.2 太阳影子定位研究 第八章 太阳影子定位

杆 h 的影长公式为

l =h

tan ρ

太阳光在地面上的投影向量为

l = m− (m · n)n

其长度平方为

|l|2 = |m− (m · n)n|2 = |m|2 − |m · n|2 = 1− sin2 ρ = cos2 ρ

O 点的正北方向为 O 指向北极的方向在 O 点出切平面的单位投影向量,也就是 z 轴正想在切

平面上的单位投影向量,即

N =z − (z · n)n|z − (z · n)n|

由于

z − (z · n)n = (− sinφ cosφ cosw,− sinφ cosφ sinw, cos2 φ)

其长度平方为

|z|2 − |z · n|2 = 1− sin2 φ = cos2 φ

因此

N = (− cosw sinφ,− sinw sinφ, cosφ)

于是,正北方向 N 旋转至太阳影子方向的角度 (影角)γ 满足

N · l = cos ρ cos γ = cos δ cosw sinφ− sin δ cosφ

cos γ =cos δ cosw sinφ− sin δ cosφ

cos ρ

注意,这里定义的影角与地学中定义的太阳方位角互为补角:余弦相差一个负号,正弦相同。结

合 sin δ 的计算公式,上式可以写为

cos γ =sin ρ sinφ− sin δ

cos ρ cosφ

另一方面,地球的正东方向为

E = N× n = (− sinw, cosw, 0)

http://www.ma-xy.com 188 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第八章 太阳影子定位 8.2 太阳影子定位研究

因而

N · l = |E||l| cos(π2− γ) = cos ρ sin γ = E · m = sinw cos δ

sin γ =sinw cos δ

cos ρ

同时给出 sin γ 和 cos γ 是为了避免出现影角 γ 多解的情况。

和问题二中的处理方法相似,考虑影角相对变化以抵消 x 轴方向,建立影角的最小二乘目标

J(n, φ, θ) =k∑i=1

[(γi+1 − γi)− (γi−1 − γi)]2

将上述目标和影长的最小二乘目标相结合,设置目标权重 c,有

minn,φ,θ

J(n, φ, θ) =k∑i=1

(li+1

li− li+1

li

)2

+ c[(γi+1 − γi)− (γi−1 − γi)]2

s.t.

− 90◦ < φ < 90◦

ρi > 0

i = 1, 2, . . . , k

程序

结果

http://www.ma-xy.com 189 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om8.2 太阳影子定位研究 第八章 太阳影子定位

http://www.ma-xy.com 190 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统

9.1 题目要求

近浅海观测网的传输节点由浮标系统、系泊系统和水声通讯系统组成,如图 (9.1) 所示。1、某型传输节点的浮标系统可简化为底面直径 2m、高 2m的圆柱体,浮标的质量为 1000kg。2、系泊系统由钢管、钢桶、重物球、电焊锚链和特制的抗拖移锚组成。锚的质量为 600kg,锚链选用

无档普通链环,近浅海观测网的常用型号及其参数在附表中列出。钢管共 4 节,每节长度 1m,

直径为 50mm,每节钢管的质量为 10kg。要求锚链末端与锚的链接处的切线方向与海床的夹角

不超过 16 度,否则锚会被拖行,致使节点移位丢失。3、水声通讯系统安装在一个长 1m、外径

30cm 的密封圆柱形钢桶内,设备和钢桶总质量为 100kg。钢桶上接第 4 节钢管,下接电焊锚链。钢桶竖直时,水声通讯设备的工作效果最佳。若钢桶倾斜,则影响设备的工作效果。钢桶的倾斜

角度 (钢桶与竖直线的夹角) 超过 5 度时,设备的工作效果较差。为了控制钢桶的倾斜角度,钢桶与电焊锚链链接处可悬挂重物球。

图 9.1: 系泊系统组成图

系泊系统的设计问题就是确定锚链的型号、长度和重物球的质量,使得浮标的吃水深度和游

动区域及钢桶的倾斜角度尽可能小。

问题 1:某型传输节点选用 II 型电焊锚链 22.05m,选用的重物球的质量为 1200kg。现将

该型传输节点布放在水深 18m、海床平坦、海水密度为 1.025× 103kg/m3 的海域。若海水静止,

分别计算海面风速为 12m/s 和 24m/s 时钢桶和各节钢管的倾斜角度、锚链形状、浮标的吃水深

度和游动区域。

问题 2:在问题 1 的假设下,计算海面风速为 36m/s 时钢桶和各节钢管的倾斜角度、锚链

形状和浮标的游动区域。请调节重物球的质量,使得钢桶的倾斜角度不超过 5 度,锚链在锚点与

191

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

海床的夹角不超过 16 度。问题 3:由于潮汐等因素的影响,布放海域的实测水深介于 16m20m 之间。布放点的海水

速度最大可达到 1.5m/s、风速最大可达到 36m/s。请给出考虑风力、水流力和水深情况下的系

泊系统设计,分析不同情况下钢桶、钢管的倾斜角度、锚链形状、浮标的吃水深度和游动区域。

说明:近海风荷载可通过近似公式 F = 0.625× Sv2(N) 计算,其中 S 为物体在风向法平面

的投影面积 (m2),v 为风速 (m/s)。近海水流力可通过近似公式 F = 374× Sv2(N) 计算,其中

S 为物体在水流速度法平面的投影面积 (m2),v 为水流速度 (m/s)。锚链型号和参数如表 (9.1)所示

表 9.1: 附表:锚链型号和参数表

型号 长度 (mm) 单位长度的质量 (kg/m)

I 78 3.2II 105 7III 120 12.5IV 150 19.5V 180 28.12

9.2 系泊系统的优化设计

9.2.1 模型的假设

1. 假设浮标系统所处的海平面是平稳不波动的;

2. 假设浮标在风力作用下仍保持水平状态,不存在倾斜,即吃水深度保持不变;

3. 假设前两个问题不考虑水流力及其他内外力;

4. 假设不考虑波动情况,即所研究物体为静态力平衡;

5. 假设锚链是重力均匀的,且可以弯曲但无弹力,锚链自重沿悬链线方向为常量;

9.2.2 符号说明

9.2.3 问题一的分析与求解

问题的分析

某型传输节点选用 II 型电焊锚链 22.05m,选用的重物球的质量为 1200kg。并将该型传输

节点布放在水深 18m、海床平坦、海水密度为 1.025× 103kg/m3 的海域。假设海水静止,分别

计算海面风速为 12m/s 和 24m/s 时钢桶和各节钢管的倾斜角度、锚链形状、浮标的吃水深度和

游动区域。

http://www.ma-xy.com 192 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

一个必然要做的事情是:在某一风速下计算系泊系统各点的坐标 (本质是分析各个量之间的关系)。并且,如果各点的坐标求得,那么上面的问题一也就迎刃而解了。首先,我们对整个系泊系统建立直角坐标系,然后对整个系统做受力分析。

模型的建立与求解

(1) 构建整体坐标系以锚垂直于海平面向上为 y 轴的正方向,以海面风向为 x 轴正方向,建立二维平面直角坐

标系 xoy。根据假设条件,浮标系统整体如图 (9.2) 所示

图 9.2: 系泊系统整体坐标系

(2) 浮标受力分析浮标系统可简化为底面直径 D 为 2m、高度 h0 为 2m、吃水深度为 h 的圆柱体。当浮标处

于平衡状态时,对浮标进行受力分析,浮标会受到重力 G0、浮力 F0、风力 Fw、第一根钢管对

浮标的拉力 T1。浮标的受力情况如图 (9.3) 所示。

图 9.3: 浮标受力分析图

由浮标质量得出其所受重力 G0 = m0g ;浮标所受的浮力 (当浮标的吃水深度不断变化时排开水体积用积分表示)F0 = ρgπ(D/2)2h ;由近海风荷载的近似公式可得浮标所受的风力

Fw = 0.625D(h0 − h)v2w ;考虑到浮标最终处于静力平衡状态,由静力学平衡方程,有

F0 −G0 = T1 sin θ1Fw = T1 cos θ1

http://www.ma-xy.com 193 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

求解上述静力方程,得到第一根钢管对浮标的拉力 T1 以及与水平面的夹角 θ1

T1 =√(F0 −G0)2 + F 2

w

θ1 = arctan F0 −G0

Fw

上述结果中浮标所受的浮力和风力是未知,但均与吃水深度有关,给定一个吃水深度 h,就

会求得一个 θ1,由力学平衡条件得到 T1,继而可以计算下面各部分的参数。因此本文稍后会从

初始的吃水深度出发,再进行迭代计算。

(3) 钢管受力分析钢管的受力整体情况如图 (9.4a) 所示,第 i 根钢管的受力分析如图 (9.4b) 所示。第 i 根钢

管受到重力 Gi、浮力 Fi、钢管的上端拉力和下端拉力分别为 Ti 和 Ti+1, i = 1, 2, 3, 4。

(a) 各节钢管所受拉力图 (b) 单节钢管受力示意图

根据第 i 根钢管的长度和直径计算钢管的体积,得到钢管所受的浮力大小为

Fi = ρgvi = ρgSili

其中:vi 为排水体积;li 为钢管的长度,li = 1m且所有钢管的长度均相同;Di 为钢管的直径,且

所有钢管的长度均相同,Di = 50mm。且有 Si = π(Di

2

)2,由物理中的力学得到 ∀i, j ∈ {1, 2, 3, 4},

均有 Fi = Fj。

钢管处于平衡状态时有静力平衡方程

Fi −Gi + Ti sin θi = Ti+1 sin θi+1

Ti cos θi = Ti+1 cos θi+1

其中,θi 为第 i 根钢管上端拉力 Ti 与水平方向的夹角;θi+1 为第 i 根钢管下端拉力 Ti+1 与水平

方向的夹角。求解上述静力方程,就可得到第 i 根钢管所受的拉力及其与水平方向的夹角和相应

的坐标 (xi+1, yi+1),注意 (xi+1, yi+1) 的坐标是由最初的浮标吃水深度 h, x0 逐步迭代得到的

Ti+1 =√

(Fi −Gi + Ti sin θi)2 + (Ti cos θi)2

θi+1 = arctan Fi −Gi + Ti sin θiTi cos θi

xi+1 = xi − li cos θiyi+1 = yi − li sin θi

http://www.ma-xy.com 194 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

其中,li 为钢桶的长度,(xi, yi) 为钢桶上端的坐标,(xi+1, yi+1) 为钢桶下端的坐标。

(4) 钢桶的受力分析将钢桶与重物球看成一个整体,分析平衡状态下钢桶整体受到的力,包括重力 G6、浮力 F6、

重物球的重力 G+、钢桶上端与下端受到的拉力分别为 T5 和 T6,这里忽略重物球的浮力。钢桶

的受力分析如图 (9.5) 所示。

图 9.5: 钢桶整体受力示意图

钢桶受到的浮力 F6

F6 = ρgl2π(D2/2)2

其中,l2 为钢桶的长,D2 为钢桶的横截面直径。然后,钢桶处于平衡状态,由静力平衡方程有

(F6 −G6 −G+) + T5 sin θ5 = T6 sin θ6T5 cos θ5 = T6 cos θ6

其中:θ5 为钢桶上端拉力 T5 与水平方向的夹角,且 θ5 与 T5 通过前面钢管的计算可以得到。因

此,求解上述静力平衡方程得到钢桶的下端受到的拉力 T6 及它与水平方向的夹角 θ6

T6 =√(F6 −G6 −G+ + T5 sin θ5)2 + (T5 cos θ5)2

θ6 = arctan F6 −G6 −G+ + T5 sin θ5T5 cos θ5

(5) 锚链的受力分析在实际的浅海观测网中锚链可能会出现铺底和没有铺底两种情况。设 L0 为放出锚链总长度,

L 为被挂起的锚链长度 L ⩽ L0。查阅无档普通链环规格的相关资料可知,II 型电焊锚链的半径约为 0.009m。将锚链看成是长 22.05m,底面半径为 0.009m 的圆柱体,根据浮力公式计算得到

锚链在水下的浮力大小约为 58N,锚链的重力 G7 = 1543.5N,故锚链受到的浮力远远小于重力,

因此锚链的浮力对于重力而言可忽略不计。由前面的分析可知,我们求得了锚链前端张力 T6 及

张力的水平夹角,同时对锚链的分析可以分为有铺底链和无铺底链两个部分。假设锚链的总长为

L0,锚链的单位长度质量为 m,则锚链的水中单位长度重力为 W = mg,则锚链的水下总重力

为 GL =WL。

http://www.ma-xy.com 195 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

锚链存在铺底链 假设铺底链不存在堆叠现象,即锚链虽然铺底,但它是完全展开的,平铺于海

底。以锚的正上方为 y 轴正方向,以海的水平方向为 x 轴,建立直角坐标系,则有铺底链的悬链

线受力示意图如图 (9.6) 所示。

图 9.6: 有铺底链情况示意图

上图 (9.6) 中,锚链被提起的长度为 L,则铺底的锚链长度为 L0 −L,考虑到有铺底链的受力分析与无铺底链的情况相似,只是坐标可能变化,所以我们直接进行下面的不存在铺底的情况

分析。

锚链不存在铺底 悬链线没有铺底的情况下,即悬链线刚好被完全拉起,其整体受力示意图如图

(9.7) 所示。

图 9.7: 没有铺底的悬链线受力示意图

假设浮标始终垂直,对锚泊系统我们采用微元法进行分析 (单点系泊系统),从锚链中取出一微段 ds,微段 ds 受力情况如图 (9.8) 所示。

图 9.8: 微段受力分析示意图

http://www.ma-xy.com 196 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

锚链某个小段受到的上端与下端张力分别为 T 和 T + dT,重力为 G,dT 为拉力的微变量,dθ 为锚链某个小段角度的微变量。根据锚链某个小段的单位长度的重力,可得 ds 的重力

G = wds

如图 (9.8) 所示,微段 ds 的静力平衡方程为

(T + dT ) sin dθ = G cos θ (9.1)

(T + dT ) cos dθ +G sin θ = T

将 (9.1) 用泰勒公式展开,忽略二阶无穷小量,当 dθ ≈ 0 时,有 cos dθ ≈ 1, sin dθ ≈ dθ,将上式化简得到

(T + dT )dθ = G cos θ (9.2)

(T + dT ) = T −G sin θ

将上式 (9.2) 化简后的等式转化成递推形式,得到

Ti+1 = Ti −G sin θi

θi+1 = θi −G cos θi

Ti −G sin θi

由此,我们得到 T 和 θ 的迭代关系式。并且,值得一提的是,该公式在锚链有铺底的情况

下同样是适用的。同时,我们注意到坐标变换,有

dx = cos θds

dy = sin θds

故有

xi+1 = − cos θds+ xi

yi+1 = − sin θds+ yi

在后面的仿真实验中,我们将 L0 微分成数个 ds 进行迭代。

程序

在上面的受力分析的最后一部分:锚链的受力分析中,我们可以求出锚链每个微元段 ds 的水平角度 θi 和张力 Ti,题目要求水深 H 为 18m,如果锚链有拖尾,当 θi 接近 0 时,我们就使此部分之后的锚链高度 yi 不再改变:yi = yj(j = i + 1, i + 2, . . . ),只改变锚链横坐标即可。并

且,我们也得到了系泊系统所有“点”的横纵坐标。

经过上面的分析,我们发现:在其它条件给定的情况下 (风速、水密度、链型、链长和重物球),每给定一个浮漂吃水深度 h,我们就可以有一个系泊系统的整体深度,换句话说,我们将

其它条件视 (风速、水密度、链型、链长和重物球) 为参数 θ,吃水深度视为自变量 x,系泊系统

http://www.ma-xy.com 197 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

整体深度视为因变量 y,则我们找到了二者之间的函数关系 y = f(x; θ)。题目中给定海水深度为

18m,也就是说,我们只要求解 y = 18 时的自变量值 x(即吃水深度 h) 即可。当 h 求解出来之

后,整个系泊系统的各点的坐标、角度以及张力也就有了。

下面,我们先给出系泊系统各个量之间的关系。为了简单,我们记吃水深度 h ≜ −y0,浮漂的横坐标为 x0,各个量之间的关系函数如下,编写为 For2D.m

1 function [ y , x , theta , T, stat ] = For2D(y0 , x0 , v_wind , m_qiu, I , L, xitong_figure )2 % 此函数用于给定x0和y0后求解系泊系统的状态曲线3 %4 %%%%输入%%%%5 % y0:浮标纵坐标, | y0|=h。其中,h为吃水深度。6 % x0:浮标横坐标。7 % v_wind:风速。8 % m_qiu:重物球质量。9 % I:锚链型号。 1、2、3、4、5

10 % L:锚链长度。11 % outputf igure:是否输出系统图像。 l o g i s t i c12 %13 %%%%输出%%%%14 % y:系泊系统纵坐标。向量15 % x:系泊系统横坐标。16 % theta:系泊系统角度。17 % T:系泊系统拉力。18 % stat:要求的系泊系统参数,包括:吃水深度h、横坐标x0、游动区域S、钢桶竖直夹角 alpha1

、锚链底端水平夹角 alpha2、风速v_wind、重物球质量m、系统状态yxthetaT。 s ta t s19 %%%%正文%%%%20 %确定锚链21 switch I22 case 123 I I = 78/1000;%锚链每节长度 m24 m_II = 3 . 2 ;%单位长度的质量 kg/m25 case 226 I I = 105/1000;%锚链每节长度 m27 m_II = 7;%单位长度的质量 kg/m28 case 329 I I = 120/1000;30 m_II = 12 .5 ;%单位长度的质量 kg/m31 case 432 I I = 150/1000;33 m_II = 19 .5 ;%单位长度的质量 kg/m34 case 535 I I = 180/1000;36 m_II = 28.12 ;%单位长度的质量 kg/m37 end38 n = round(L/ I I ) ;39 ind = n+5+1;40 y(1) = y0 ;41 x(1) = x0 ;42 h = abs (y(1) ) ;%浮标吃水深度43 %浮标受力44 rho = 1.025*10^3;%海水的密度 kg/m^345 g = 9 . 8 ;%重力加速度 N/kg

http://www.ma-xy.com 198 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

46 D = 2;%圆柱浮标地面直径 m47 h0 = 2;%圆柱浮标高度 m48 m0= 1000;%浮标质量 kg49 F0 = rho*g*pi *(D/2)^2*h ;%浮标浮力50 G0 = m0*g ;%浮标重力51 %v_wind = 12;%风速 m/s52 S_wind = D*(h0−h) ;%风受力面积53 F_wind = 0.625*S_wind*v_wind^2;%风力54 theta1 = atan ((F0−G0)/F_wind) ;%钢管1的水平夹角55 T1 = sqrt ((F0−G0)^2+(F_wind) ^2) ;%钢管1的张力56 T(1) = T1; theta (1) = theta1 ;57 %钢管受力分析58 f o r i = 1:459 m( i ) = 10;%钢管质量 kg60 G( i ) = m( i )*g ;%钢管重力61 l ( i ) = 1;%钢管长度 m62 d( i ) = 50/1000;%钢管直径 m63 F( i ) = rho*g*pi *(d( i ) /2)^2* l ( i ) ;%钢管浮力64

65 T( i+1) = ( (F( i )−G( i )+T( i )* s in ( theta ( i ) ) )^2 +. . .66 (T( i )*cos ( theta ( i ) ) )^2 ) ^(1/2) ;67 theta ( i+1) = atan ( ( (F( i )−G( i )+T( i )* s in ( theta ( i ) ) ) / . . .68 (T( i )*cos ( theta ( i ) ) ) ) ) ;69

70 %钢管 i的坐标( xi , y i)71 y( i+1) = y( i ) − l ( i )* s in ( theta ( i ) ) ;72 x( i+1) = x( i ) − l ( i )*cos ( theta ( i ) ) ;73 end74 %钢桶受力分析75 m_tong = 100;%钢桶的质量 kg76 G_tong = m_tong*g ;%钢桶重力77 % m_qiu = 1200;%重物球质量 kg78 G_qiu = m_qiu*g ;%重物球重力79 l_tong = 1;%钢桶长 m80 D_tong = 30/100;%钢桶底长81 F_tong = rho*g*pi *(D_tong/2)^2*l_tong ;%钢桶浮力82 T_tong = ( (F_tong−G_tong−G_qiu+T(5)* s in ( theta (5) ) )^2 + . . .83 (T(5)*cos ( theta (5) ) ) ^2) ^(1/2) ;84 theta_tong = atan ( ((F_tong−G_tong−G_qiu+T(5)* s in ( theta (5) ) ) . . .85 /(T(5)*cos ( theta (5) ) ) ) ) ;86 T(6) = T_tong ;87 theta (6) = theta_tong ;88 y(6) = y(5) − l_tong* s in ( theta (5) ) ;89 x(6) = x(5) − l_tong*cos ( theta (5) ) ;90 %锚链线分析91 G_mao = I I *m_II*g ;%单位长度重量92 L_tuo = 0;%锚链拖尾长度93 f o r i = 6 : 6+n−194 i f theta ( i ) − 0 > 0.00195 T( i+1) = T( i ) − G_mao* s in ( theta ( i ) ) ;96 theta ( i+1) = theta ( i ) − (G_mao*cos ( theta ( i ) ) ) /(T( i )−G_mao* s in ( theta ( i ) ) ) ;97 y( i+1) = y( i ) − s in ( theta ( i ) )* I I ;98 x( i+1) = x( i ) − cos ( theta ( i ) )* I I ;

http://www.ma-xy.com 199 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

99 e l s e100 T( i+1) = 0;101 theta ( i+1) = 0;102 y( i+1) = y( i ) ;103 x( i+1) = x( i ) − I I ;104 L_tuo = L_tuo+I I ;105 end106 end107

上面给出了系泊系统各个量之间的关系函数 For2D,下面,我们就求解系泊系统深度 y(end) =

18m 时的吃水深度 h。这里,我们提供三种方法:

(1)离散枚举法,将 h从 [0, 2]遍历离散取值,选取 y(end)最接近 18的 h,函数为 bestpoint.m,如下

1 function [ besty0 , bestx0 ] = bestpoint (H, N, x0 , v_wind , m_qiu, I , L, y0_yn_figure )2 %此函数用离散枚举法求最优吃水深度h3 %4 y0 = l inspace (0 , −2, N) ;5 %注: y0是有取值范围的, y0不可以从0开始取值,否则会发生yn>0的情况。6 %修正y07 rho = 1.025*10^3;%海水的密度 kg/m^38 D = 2;%圆柱浮标地面直径 m9 m0= 1000;%浮标质量 kg

10 y0_min = −(m0+m_qiu) /( rho*pi *(D/2)^2) ;11 y0 = l inspace (y0_min , −2, N) ;12 yn = zeros ( s i z e (y0) ) ;13 xn = zeros ( s i z e (y0) ) ;14 xitong_figure = 0;15 f o r i = 1: length (y0)16 [ y , x , theta , ~ ] = For2D(y0( i ) , x0 , v_wind , m_qiu, I , L, xitong_figure ) ;17 yn( i ) = y(end) ;18 xn( i ) = x(end) ;19 thetan ( i ) = theta (end − 1) ;20 end21

22 [ ~ , ind1 ] = min( abs (yn − (−H) ) ) ;23 besty0 = y0( ind1 ) ;24 bestx0 = x0 − xn( ind1 ) ;25

(2) 迭代算法求最优吃水深度。这种方法是有方向的调整吃水深度,使系泊系统水深和 18m

接近,函数为 bestpoint2.m,如下1 function [ besty0 , bestx0 , bestyn ] = bestpoint2 (y0 , x0 , H, eta , maxt , eps , v_wind ,

m_qiu, I , L)2 %此函数用迭代算法求最优吃水深度h3 %%%%正文%%%%4 xitong_figure = 0;5 t = 0;6 while t < maxt7 [ ~ , ~ , ~ , ~ , s tat ] = For2D(y0 , x0 , v_wind , m_qiu, I , L, xitong_figure ) ;8 yn = stat . yn ;

http://www.ma-xy.com 200 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

9 xn = stat . xn ;10 delta_yn = yn − (−H) ;11 i f abs (delta_yn ) < eps12 disp ( ’yn满足精度,终止 ’ )13 break ;14 e l s e15 y1 = y0 ;16 y0 = y0 − eta*delta_yn ;%更新y017 %如果y0不在范围内18 i f y0 < −2 | y0 > 019 eta1 = 0.5* eta ;20 y0 = y1 − eta1*delta_yn ;21 end22 end23 t = t+1;24 i f t == maxt25 disp ( ’达到最大迭代次数,终止 ’ )26 end27 end28 %%%%构建输出%%%%29 disp ( [ ’迭代次数: ’ , num2str ( t ) ] )30 besty0 = y0 ;31 bestyn = yn ;32 bestx0 = x0 − xn ;33

(3) 用 fzero 法求最优吃水深度。其实,对于这个函数问题,我们可以使用 MATLAB 自带的函数命令 fzeros 来求解,求解程序如下

1 function [ besty0 , bestx0 ] = bestpoint3 (H, x0 , v_wind , m_qiu, I , L, xitong_figure )2 %此函数用 f z e ro法求最优吃水深度h3 %4 fun = @(y0) bestpoint3fun (y0 , H, x0 , v_wind , m_qiu, I , L, xitong_figure ) ;5 y0 = −0.3; % i n i t i a l point6 besty0 = fzero ( fun , y0) ;7 [ ~ , x , ~ , ~ , ~ ] = For2D( besty0 , x0 , v_wind , m_qiu, I , L, xitong_figure ) ;8 bestx0 = x0 − x(end) ;9 end

10

11 function f = bestpoint3fun (y0 , H, x0 , v_wind , m_qiu, I , L, xitong_figure )12 %此函数用于构建 f z e ro函数的输入,以求解yn = −H。13 %14 [ y , ~ , ~ , ~ , ~ ] = For2D(y0 , x0 , v_wind , m_qiu, I , L, xitong_figure ) ;15 yn = y(end) ;16 f = yn − (−H) ;17 end18

下面,我们给出求解各风速下系泊系统的状态的程序

1 %% 利用离散枚举法计算bestx0 , besty0情况下的系统信息及系统图形2 %风速为12时的系统情况3 H = 18; N = 1000; x0 = 20; v_wind = 12;4 m_qiu = 1200; I = 2; L = 22.05 ;

http://www.ma-xy.com 201 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

5 y0_yn_figure = 1; xitong_figure = 1;6 [ besty0 , bestx0 ] = bestpoint (H, N, x0 , v_wind , m_qiu, I , L, y0_yn_figure ) ;7 y0 = besty0 ;8 x0 = bestx0 ;9 [ y1 , x1 , theta1 , T1, stat1 ] = For2D(y0 , x0 , v_wind , m_qiu, I , L, xitong_figure ) ;

10

结果

风速 vw = 12m/s 时锚链末端 yn 和水平夹角随吃水深度 h 的变化曲线如图 (9.9) 所示,我们只要选取末端 yn = 18 时的吃水深度即可,称此吃水深度为最优吃水深度。

图 9.9: 风速 12 时锚链末端及水平夹角随吃水深度 h 的变化曲线

在最优吃水深度下,系泊系统的系统曲线如图 (9.10) 所示。最优的 h 为 0.734,(x1, y1) =

(14.416,−0.734),浮标的游动面积为 628.343m2 。

图 9.10: 风速 12、吃水深度 0.73461 时的系泊系统

风速 vw = 24m/s 时锚链末端 yn 和水平夹角随吃水深度 h 的变化曲线如图 (9.11) 所示。

http://www.ma-xy.com 202 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

图 9.11: 风速 24 时锚链末端及水平夹角随吃水深度 h 的变化曲线

在最优吃水深度下,风速 vw = 24m/s 时系泊系统的系统曲线如图 (9.12) 所示。

图 9.12: 风速 24、吃水深度 0.74911 时的系泊系统

9.2.4 问题二的分析与求解

问题的分析

问题要求我们在问题 1 的假设下,在风速 v = 36m/s 时重新计算各指标。并调节重物球的

质量,使得钢桶的倾斜角度不超过 5◦,锚链末端与锚的链接处的切线方向与海床的夹角不超过

16◦。

题目的意思是:在风速 v = 36m/s 时系泊系统整体状态的时候,由于风力太大,使得浮漂

整体被拉起 (钢桶的倾斜角度和锚链末端与锚的链接处的切线方向与海床的夹角就变得很大),吃水深度很深。因此,我们要增加重物球的质量,使链拉的没有那么“直”。我们可以考虑建立优

化模型,这个优化模型的目标其实在题目中已经给出了,“系泊系统的设计问题就是确定锚链的

型号、长度和重物球的质量,使得浮标的吃水深度和游动区域及钢桶的倾斜角度尽可能小。”,我

们由此来设计优化模型的目标及约束条件。并且,注意到这个系泊系统的设计是多目标的 (这几个目标之间相互矛盾),为此,我们采用 IENSGAII 算法进行求解。

http://www.ma-xy.com 203 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

模型的建立与求解

问题二的前半部分只是重新给出了一个风速,所以与第一问的思路相同,这里只给出一个结

果。在最优吃水深度下,风速 vw = 36m/s 时系泊系统的系统曲线如图 (9.13) 所示。

图 9.13: 风速 36、吃水深度 0.7702 时的系泊系统

风速 v = 36m/s 时系泊系统的最优浮漂位置 (x0, y0) = (18.6505,−0.7704),浮漂吃水深度为 h = 0.7704 ,第一根到第四根钢管和钢桶与竖直方向的夹角弧度数分别为 1.4344、1.4336、1.4329、1.4322、1.4314。这时,我们发现系泊系统的角度非常大,这是相当不稳定的。为此,要调节重物球的质量使系泊系统的各夹角变小。我们定义 m+ 为重物球的质量,α1 为钢桶与竖直

方向的夹角,它与锚链与水平方向的夹角 θ5 互余,即 α1 = 90◦ − θ5。α2 为锚链末端与水平方向

的夹角。通过不断的调整 m+,使得 α5 不超过 5◦,α2 不超过 16◦。我们可以建立一个优化问题。

1. 首先,我们设定优化模型的优化变量为重物球质量 m+。

2. 然后,我们设定优化的目标是:吃水深度 h 最小、α1 夹角最小、游动面积最小。但 3 者不可能同时达到最小,故而有下面的多目标优化的处理。

3. 最后,我们设置优化的约束条件:要求 α1 在 [0, 5] 范围内,α2 在 [0, 16] 范围内进行取值。

但是,这里我们重物球的质量 m+ 的取值范围,为此,我们要先分析一下 m+。

我们先来分析一下 m+。分析一下下面的关系:1.m 与 y0 的关系;2.m 与 x0 的关系;3.m与 α1 的关系;4.m 与 α2 的关系;并且注意到,我们要求解使 α1, α2 满足要求的最小的 m+,即

m+ 的下限。然后,我们根据 m 与 y0 的关系来求解 m+ 的上限。

m 与 y0 的关系 浮标的吃水深度 h 随重物球质量 m+ 的变化趋势如图 (9.14a) 所示。从图中可以看出,浮标的吃水深度 h 与重物球质量 m+ 大约成正相关的线性关系。当重物球的质量为

5200kg 左右时,浮标的吃水深度达到最大 h = 2m,此后再增加重物球的质量,浮标的吃水深度

不再改变。

http://www.ma-xy.com 204 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

m 与 x0 的关系 浮标横坐标 x0(游动范围 S) 随重物球质量 m+ 的变化趋势如图 (9.14d) 所示从图中可以看出,浮标横坐标 x0 与重物球质量 m+ 成反比例关系,重物球质量越大,浮标横坐

标越小,游动范围越小。

m 与 α1 的关系 钢桶竖直夹角 α1 随重物球质量 m+ 的变化趋势如图 (9.14c) 所示从图中可以看出,钢桶竖直夹角 α1 与重物球质量 m+ 成反比例关系,重物球质量越大,钢桶竖直夹角 α1

越小。当重物球质量达到 5200kg 时,钢桶竖直方向夹角达到 0 度。与此同时,我们可以找到钢

桶竖直夹角 α1 =590π2时的重物球质量 m1 = 1808kg。也就是说,要使钢桶竖直夹角 α1 < 5◦,重

物球质量要大于 1808kg。

m 与 α2 的关系 锚链底端水平夹角 α2 随重物球质量 m+ 的变化趋势如图 (9.14b) 所示从图中可以看出,锚链底端水平夹角 α2 与重物球质量 m+ 成反比例关系,重物球质量越大,锚链底端

水平夹角 α2 越小。当重物球质量达到 5200kg 时,锚链底端水平夹角达到 0◦。与此同时,我们

可以找到锚链底端水平夹角 α2 = 1690π2时的重物球质量 m2 = 1202kg。也就是说,要使锚链底端

水平夹角 α2 < 16◦,重物球质量要大于 1202kg。

(a) (b)

(c) (d)图 9.14: 重物球质量与各变量间的关系图

经过上面对重物球质量 m+ 的分析,如果单从第二问来看,满足要求的重物球质量范围为

[1808, 5200],此范围内的重物球都可以使钢桶竖直夹角 α1 < 5◦ 锚链底端水平夹角 α2 < 16◦(最终获得的重物球质量 m+ 的取值范围为 m1 = 1757.6,m2 = 1656.6,m3 = 5393.9,即 1757.6 <

http://www.ma-xy.com 205 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

图 9.15: 系泊系统多目标规划的 Pareto 前端

m+ < 5393.9。)。下面,我们来建立优化模型,求解合适的重物球质量 m+。我们建立优化模型,

求最优 m+,使得 h、α1 和面积 πx20 最小,有

minm+

{h, α1, πx20} (9.3)

s.t.

0 < α1 ⩽

5

90

π

2

0 < α2 ⩽16

90

π

2

max{m1,m2} < m+ < 6000

这里有一点要说明的是,上面模型中的第 3 个约束就是由前两个约束变化而来的,所以在实际编程中,只需要考虑第三个约束即可。上面建立的优化模型有三个目标,并不容易处理。根据

前面对 m+ 的分析,我们可以发现:m+ 与 h 成正比关系,而与 α1, α2 以及游动范围 πx20 成反

比例关系。为此,我们将其规整为两目标优化模型,将目标 α1 和 πx20 合并,并设置目标权重为

c,有

minm+

h

α1 + cπx20(9.4)

s.t.

0 < α1 ⩽

5

90

π

2

0 < α2 ⩽16

90

π

2

max{m1,m2} < m+ < 6000

其中,c 为目标权重系数 (外来参数);为了方便计算,上述约束条件中的 α1 与 α2 均要转换成弧

度;同时,模型中的角度及坐标还要满足系泊系统静态平衡时的方程。下面,来简单分析一下上

述优化问题。这是一个多目标优化问题,给定 m+ 后,并不能使 h, α1 + cπx20 同时达到最小。要

解决这样的多目标优化问题,我们可以采用 IENSGAII 算法的思想对其进行求解。Pareto 最优解如图 (9.15) 所示。模型 (9.3) 可以变为 2 个目标,也可以变为 1 个目标。在第二问中,我们将其规整为 2 个

目标并用 IENSGAII 求解。但是在第三问中,题目要求我们在多个方案中挑选最优方案,所以我

http://www.ma-xy.com 206 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

们要用唯一的目标来衡量各个方案,而不是 Pareto 最优解,因此,在第三问当中,我们把模型(9.3) 规整为 1 个目标,用 GA 算法及 fmincon 进行求解。

程序

这里,我们先给出模型 (9.4) 的目标函数 multi_GA_m 的程序1 function f = multi_GA_m(m_qiu)2 %此函数是IENSGAii的目标函数。3 %4 %解为m_qiu5 %目标1:吃水深度最小6 %目标2:游动区域和钢桶夹角最小7 %8 %正文9 %定参

10 v_wind = 36;11 %超参12 c = 10;13 H = 18;14 N = 500;15 x0 = 20;16 I = 2;17 L = 22.05 ;18 y0_yn_figure = 0;19 xitong_figure = 0;20

21 [ besty0 , bestx0 ] = bestpoint (H, N, x0 , v_wind , m_qiu, I , L, y0_yn_figure ) ;22 [ ~ , ~ , ~ , ~ , s tat ] = For2D( besty0 , bestx0 , v_wind , m_qiu, I , L, xitong_figure ) ;23 alpha1 = stat . alpha1 ;24

25 f (1) = abs ( besty0 ) ;26 f (2) = pi*bestx0^2 + c*alpha1 ;27 end28

然后,我们给出第二问的具体求解程序,如下

1 %% 绘制m_qiu和y0 、x0 、 alpha1、 alpha2之间的关系图2 c l c3 c l ea r4 %定参5 v_wind = 36;6 %超参7 H = 18;8 N = 500;9 x0 = 20;

10 I = 2;11 L = 22.05 ;12 y0_yn_figure = 0;13 xitong_figure = 0;14 %正文15 m_qiu = l inspace (1000 , 6000 , 100) ;

http://www.ma-xy.com 207 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

16 besty0 = zeros ( s i z e (m_qiu) ) ;17 bestx0 = zeros ( s i z e (m_qiu) ) ;18 alpha1 = zeros ( s i z e (m_qiu) ) ;19 alpha2 = zeros ( s i z e (m_qiu) ) ;20 f o r i = 1: length (m_qiu)21 [ besty0 ( i ) , bestx0 ( i ) ] = bestpoint (H, N, x0 , v_wind , m_qiu( i ) , I , L, y0_yn_figure

) ;22 y0 = besty0 ( i ) ;23 x0 = bestx0 ( i ) ;24 [ ~ , ~ , ~ , ~ , s tat ] = For2D(y0 , x0 , v_wind , m_qiu( i ) , I , L, xitong_figure ) ;25 alpha1 ( i ) = stat . alpha1 ;26 alpha2 ( i ) = stat . alpha2 ;27 end28 %绘图29 f i gu re (1)30 plot (m_qiu, abs ( besty0 ) , ’ r*− ’ )31 xlabe l ( ’重物球质量 ’ )32 ylabe l ( ’吃水深度 ’ )33 t i t l e ( ’吃水深度h随重物球质量变化曲线 ’ )34 f i gu re (2)35 plot (m_qiu, bestx0 , ’ c<−’ )36 xlabe l ( ’重物球质量 ’ )37 ylabe l ( ’浮漂横坐标 ’ )38 t i t l e ( ’浮漂横坐标随重物球质量变化曲线 ’ )39 f i gu re (3)40 plot (m_qiu, alpha1 , ’bo−’ )41 xlabe l ( ’重物球质量 ’ )42 ylabe l ( ’钢桶竖直夹角 ’ )43 t i t l e ( ’钢桶竖直夹角随重物球质量变化曲线 ’ )44 f i gu re (4)45 plot (m_qiu, alpha2 , ’ gs−’ )46 xlabe l ( ’重物球质量 ’ )47 ylabe l ( ’锚链底端水平夹角 ’ )48 t i t l e ( ’锚链底端水平夹角随重物球质量变化曲线 ’ )49 %注:最好插值 or拟合一下。50

51 %% 确定m_qiu的取值范围52 %钢桶的倾斜角度不超过5度,锚链在锚点与海床的夹角不超过16度53 alpha1_max = 5;54 alpha2_max = 16;55

56 [ ~ , ind1 ] = min( abs ( alpha1 − alpha1_max) ) ;57 m1 = m_qiu( ind1 ) ;58 [ ~ , ind2 ] = min( abs ( alpha2 − alpha2_max) ) ;59 m2 = m_qiu( ind2 ) ;60 %浮漂完全没入水中,h = 2。61 ind3 = min( f ind ( abs ( besty0 ) == 2) ) ;%ind3 = find ( abs ( besty0 ) == 2 , 1)62 m3 = m_qiu( ind3 ) ;63 % s . t . max{m1, m2} < m_qiu < m364 %% IENSGAii 求解最优m_qiu,使得h、 pi*x0^2和 alpha1最小,且 alpha1,2在范围内65 f i t n e s s f c n = @multi_GA_m;66 nvars = 1;67 lb = max( [m1, m2] ) ;

http://www.ma-xy.com 208 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

68 ub = m3;69 A = [ ] ; b = [ ] ;70 Aeq = [ ] ; beq = [ ] ;71 options = gaoptimset ( ’ ParetoFraction ’ , 0 .3 , ’ PopulationSize ’ , 100 , ’ Generations ’ ,

100 , ’ StallGenLimit ’ , 100 , ’ PlotFcns ’ , {@gaplotpareto , @gaplotbestf }) ;72 [x_m, fva l ] = gamultiobj ( f i tne s s f cn , nvars , A, b , Aeq , beq , lb , ub , options ) ;73

9.2.5 问题三的分析与求解

问题的分析

由于潮汐等因素的影响,布放海域的实测水深介于 16m20m 之间。布放点的海水速度最大

可达到 1.5m/s、风速最大可达到 36m/s。请给出考虑风力、水流力和水深情况下的系泊系统设

计,分析不同情况下钢桶、钢管的倾斜角度、锚链形状、浮标的吃水深度和游动区域。

问题三要求分析风力、水流力和水深对系泊系统的影响 (敏感性分析),并给出系泊系统的设计 (系泊系统最优设计),这里是多个优化变量的最优系泊系统设计,优化变量有:重物球质量m+、链型及链长。优化目标仍然如第二问那样,不过优化约束要有所改变。

确定锚链的型号、长度和重物球的质量,使得浮标的吃水深度和游动区域及钢桶的倾斜角度

尽可能小。同时,分析水深介于 16m ∼ 20m,海水速度最大 1.5m/s,风速最大 36m/s 的不同情

况下的整体系泊系统的变化形态。

模型的建立与求解

整个系统是处于静态平衡的,我们依然设水流速度 vs = 15m/s,海面风速 vw = 36m/s,布

防海水深度 Hs = 16m。求解最优的链型、链长和重物球质量,使得浮标的吃水深度 h 和游动区

域 πx20 及钢桶倾斜角度 α1 都尽可能小。设链型为 I,链长为 L,重物球质量为 m+

minI,L,m+

{h, α1, πx20}

s.t.

0 < α1 < 5◦

0 < α2 < 16◦

max{m1,m2} < m+ < m3

hmin < h < hmax

对于上面的这个优化模型,其多目标的处理方式可以参考问题二中的处理方式,唯一困难的

问题是链型的选取,因为链型 I 是整数型变量。不过,值得庆幸的是,锚链型号只有 5 种,我们可以将其枚举出来。我们先确定各种锚链的型号下的最优链长 L 和最优重物球质量 m+,然后对

http://www.ma-xy.com 209 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

比五种型号的最优目标值从而得到最优链型 I,即

minI

{minL,m+

{h, α1, πx20}}

s.t.

0 < α1 < 5◦

0 < α2 < 16◦

max{m1,m2} < m+ < m3

hmin < h < hmax

将上述三目标问题变为单目标问题,并设置目标权重为 c1, c2,有

minI

{minL,m+

h+ c1α1 + c2πx20

}(9.5)

s.t.

0 < α1 < 5◦

0 < α2 < 16◦

max{m1,m2} < m+ < m3

hmin < h < hmax

程序

设定具体的参数水深 Hs = 18m,风速 vw = 24m/s,水流速度 vs,以及超参数 c1, c2,求解

最优的型号 I,链长 L,重物球重力 m+。给出模型 (9.5) 目标的程序1 function f = GA_m_l(x , I , c1 , c2 , v_wind , H, N, x0 , y0_yn_figure , xitong_figure )2 %此函数是第三问求解m_qiu和L优化问题的目标函数,可用于GA和 fmincon函数。3 %4 %解为m_qiu, L, I5 %目标:吃水深度最小游动区域和钢桶夹角最小6 %7 %%%%正文%%%%8 m_qiu = x(1) ;9 L = x(2) ;

10 [ besty0 , bestx0 ] = bestpoint (H, N, x0 , v_wind , m_qiu, I , L, y0_yn_figure ) ;11 [ ~ , ~ , ~ , ~ , s tat ] = For2D( besty0 , bestx0 , v_wind , m_qiu, I , L, xitong_figure ) ;12 alpha1 = stat . alpha1 ;13 alpha2 = stat . alpha2 ;14 h = abs ( besty0 ) ;15 %目标值16 f = h + c1*alpha1 + c2*pi*bestx0 ^2;17

然后给出模型 (9.5) 的约束设置1 function [ c , ceq ] = circlecon_m_l (x , I , v_wind , H, N, x0 , y0_yn_figure , xitong_figure

)2 %此函数是第三问求解m_qiu和L优化问题的非线性约束3 %4 %%%%正文%%%%

http://www.ma-xy.com 210 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

5 m_qiu = x(1) ;6 L = x(2) ;7 [ besty0 , bestx0 ] = bestpoint (H, N, x0 , v_wind , m_qiu, I , L, y0_yn_figure ) ;8 [ ~ , ~ , ~ , ~ , s tat ] = For2D( besty0 , bestx0 , v_wind , m_qiu, I , L, xitong_figure ) ;9 alpha1 = stat . alpha1 ;

10 alpha2 = stat . alpha2 ;11 L_tuo = stat .L_tuo ;12 h = abs ( besty0 ) ;13 %非线性约束14 rho = 1.025*10^3;%海水的密度 kg/m^315 D = 2;%圆柱浮标地面直径 m16 m0= 1000;%浮标质量 kg17 h_min = (m0+m_qiu) /( rho*pi *(D/2)^2) ;18 c (1) = alpha1 − 5 ;19 c (2) = −alpha1 ;20 c (3) = alpha2 − 16;21 c (4) = −alpha2 ;22 c (5) = h − 2 ;23 c (6) = −(h − h_min) ;24 c (7) = L_tuo − 0 . 3 ;25 ceq = [ ] ;%ceq = L_tuo ;26 end27

给出锚链型号 I = II 下,模型 (9.5) 的求解程序,这里我们使用 GA 和 fmincon 两种方法来求解这个非线性约束优化模型

1 %% 此文件用于求解第三问,最优m_qiu、L和 I使单一目标最小2 %% 优化设置

3 %参数设置4 clc , c l ea r5 I = 2;6 c1 = 1;7 c2 = 1;8 v_wind = 24;9 H = 18;

10 N = 500;11 x0 = 20;12 y0_yn_figure = 0;13 xitong_figure = 0;14 %目标及约束15 fun = @(x)GA_m_l(x , I , c1 , c2 , v_wind , H, N, x0 , y0_yn_figure , xitong_figure ) ;16 A = [ ] ;17 b = [ ] ;18 Aeq = [ ] ;19 beq = [ ] ;20 lb = [0 , H−5];21 ub = [ inf , i n f ] ;22 nonlcon = @(x) circlecon_m_l (x , I , v_wind , H, N, x0 , y0_yn_figure , xitong_figure ) ;23 %% 利用GA算法解此非线性优化24 nvars = 2; % 个体的变量数目

25 options = gaoptimset ( ’ PopulationSize ’ ,100 , ’ CrossoverFraction ’ ,0 .75 , ’ Generations ’ ,20 , ’StallGenLimit ’ ,40 , ’ PlotFcns ’ ,{@gaplotbestf , @gaplotbestindiv }) ; %参数设置

http://www.ma-xy.com 211 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

26 [ x_best , fval , e x i t f l a g ] = ga( fun , nvars , A, b , Aeq , beq , lb , ub , nonlcon , options ) ;27 %% 利用 fmincon解此非线性优化(具有非线性约束的)28 options = optimoptions ( ’ fmincon ’ , ’ Display ’ , ’ i t e r ’ , ’ Algorithm ’ , ’ sqp ’ ) ;29 X0 = [1200 , 28 ] ;30 x_m_l = fmincon ( fun , X0, A, b , Aeq , beq , lb , ub , nonlcon , options ) ;31 %绘制结果32 m_qiu = x_m_l(1) ;33 L = x_m_l(2) ;34 x0 = 20;35 xitong_figure = 1;36 [ besty0 , bestx0 ] = bestpoint (H, N, x0 , v_wind , m_qiu, I , L, y0_yn_figure ) ;37 y0 = besty0 ;38 x0 = bestx0 ;39 [ y1 , x1 , theta1 , T1, stat1 ] = For2D(y0 , x0 , v_wind , m_qiu, I , L, xitong_figure ) ;40

结果

假定海水速度 v2 为 1.5m/s,风速 v1 为 36m/s,水深 H 为 18m,在此基础上求解 5 种不同锚链链型的最优解及最优值 (这个地方出错了,所以没有贴结果,后面再分析¬)。

水深 H,风速 vw 和水速 vs 的敏感性分析。风速 vw 对系泊系统的影响如图 (9.16a) 所示,风速对系统水平夹角的影响如图 (9.16b) 所示

(a) 风速对系泊系统的影响 (b) 风速对系统水平夹角的影响图 9.16: 风速的敏感性分析

9.2.6 改进一:含力矩平衡的系泊系统

在前面的建模部分,我们设计了 2D 系泊系统,并设计多目标优化模型来求解最优链型 I、

最优链长 L 和最优重物球质量 m+。下面,我们将用一种新的方法来设计 2D 系泊系统,并在此基础上进行优化设计。

¬matlab 自带的 GA 和 fmincon 并没有很好的寻找锚链长度 L,fmincon 迭代时,L 不断增加,这显然是不合适的。一般的,可能需要自行设计优化算法来求解上面的模型了。

http://www.ma-xy.com 212 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

模型建立与求解

在前面的系统受力分析当中,我们假设钢管 (桶) 的拉力方向是沿管方向的,并且没有考虑力矩平衡;我们还假设浮标始终竖直,不存在倾斜;并且在锚链的分析过程中,我们使用微元法

对其进行分析;在 2D 系统中,我们并没有考虑海水流力的影响 (假设海水静止)。下面,我们对整个系泊系统重新进行分析。

(1) 建立二维直角坐标系以锚为坐标原点,以风力方向为 x 轴正方向建立 2 维直角坐标系 xoy,如图 (9.17) 所示

图 9.17: 系泊系统二维坐标系

在 2D 系泊系统中,我们假设海水流力与风力同向或反向,且各深度下海水流力相同。图(9.17)中 α2 为锚链底端水平夹角;L为锚链长度;H 为海水深度;浮标底端接点坐标为 (x0, y0);

锚链与钢桶交点坐标为 (x6, y6);h = −y0 为吃水深度;m+ 为重物球质量;w 为锚链单位重量。

(2) 浮标受力分析浮标受力分析如图 (9.18) 所示

图 9.18: 改进的浮标受力分析图

设 Fw 为风力,Fs 为水流力,Fw, Fs 方向相同,v1 为风速,v2 为水速,h0 为浮漂高,G 为

重力,F 为浮力。浮标在 Fw, Fs, G, F, T5 力下处于静止平衡态,将浮标视为质点进行受力分析,有

Fw = 0.625S1v21 = 0.625D(h0 − h)v21

Fs = 374S2v22 = 374Dhv22

G = mg

F = ρgv = ρgπ(D/2)2h

http://www.ma-xy.com 213 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

其中:S1 为浮标风力法平面投影;S2 为浮标海水流力法平面投影;D 为浮标底直径。由静力平

衡,有

Tx,1 = T sin θ = Fw + Fs

Ty,1 = T cos θ = FG

(3) 钢管、钢桶受力分析在进行受力分析之前,我们先引入力矩平衡。如图 (9.19) 所示

图 9.19: 力矩平衡示意图

图 (9.19) 中的力臂为 LT = L sin θ,力矩为 M = F cos θ。力矩平衡是指所有使物体顺时针转动的力矩之和等于所有使物体逆时针转动的力矩之和,即∑

i

Mi = 0

下面,我们来对钢管、钢桶进行受力分析,我们分两个方面:1. 不考虑水流力 Fs;2. 考虑水流力 Fs。

(1) 不考虑水流力 Fs 的影响。对第 i 节进行受力分析,受力分析如图 (9.20)

图 9.20: 改进的钢管受力分析

其中:o 为第 i 节的转动轴点,Gi 为重力,Fi 为浮力,Tix, Tiy 为 T 的分量。如果不考虑海

水流力 Fs 的影响,则 ∀i ∈ [1, 2, 3, . . . ],有 Tix = Fw。

http://www.ma-xy.com 214 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

第 i 节的受力平衡与力矩平衡为

(Gi − Fi)li2

cos θi + Ti,xli sin θi = Ti,yli cos θi

Ti,x = Ti+1,x

Ti,y + Fi = Gi + Ti+1,y

其中:l 为钢管长。且注意,在研究钢桶受力分析时,G+ = m+g 力矩为 0。(2) 考虑海水流力 Fs 的影响。钢管/钢桶的受力分析如图 (9.21) 所示

图 9.21: 改进的钢管受力分析-考虑海水流力

对第 i 节受力分析时,考虑海水流力 Fsi 的影响。受力平衡与力矩平衡为

(Gi − Fi)li2

cos θi + Ti,xli sin θi + Fs,ili2

sin θi = Ti,yli cos θi

Ti+1,x = Ti,x + Fs,i

Ti+1,y +Gi = Ti,y + Fi

其中:Fs,i 为海水流力。下面,我们来计算各段的海水流力 Fs,i = 374Siv2i,Si 为第 i 节在水流

力法平面上的投影,如图 (9.22) 所示

图 9.22: 钢管在水流力法平面上的投影示意图

Si =

[1

2πdi cos θi + li sin θi

]di

其中:di 为第 i 节底面直径。

(4) 锚链分析

http://www.ma-xy.com 215 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

前面我们用微元法对锚链进行分析,下面,我们引入悬链线来分析锚链­。锚链悬链线示意

图如图 (9.23) 所示

图 9.23: 悬链线示意图

对于只受重力和两端拉力的链进行分析,设链处于平衡态,链下端顶点为 (0, 0),末端顶点

为 (x6, y6),下端水平夹角为 α2。

对悬链任意一微段 ds 进行分析,有

tan θ = wdsTx

其中:w 为链单位长度重量。而我们又知道 tan θ = dydx,对其取微分,有

d(tan θ) = w

Txds = w

Tx

√(dx)2 + (dy)2 = w

Tx

√1 + tan2 θdx

对上式分离变量后积分,有 ∫1√

1 + tan2 θd(tan θ) =

∫w

Txdx

求解不定积分,有

sinh−1(tan θ) = w

Txx+ C1

⇒ tan θ = sinh( wTx

+ C1) =dydx

对上式再分离变量,有

dy = sinh( wTxx+ C1)dx

对上式求积分,有

y =

∫sinh( w

Txx+ C1)dx

y =Txw

cosh( wTxx+ C1) + C2 (9.6)

­《高等数学》中居然有悬链线的说明

http://www.ma-xy.com 216 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

上式即为悬链线的一般方程,其中 C1, C2 为常数。

下面,我们根据边值条件来求常数 C1, C2。(1) 求 C1:悬链末端水平夹角为 α,此为边值条

件,于是我们对 (9.6) 式求导,有

y′ = sinh( wTxx+ C1)

由 y′|x=0 = tanα,有

C1 = ln(tanα+ secα)

(2) 求解 C2。由边值条件 y|x=0 = 0,有

C2 = −Txw

secα

故带参数 α 的悬链线方程 (9.6) 具体为

y =Txw

cosh[w

Txx+ ln(tanα+ secα)

]− Tx

qsecα

其中:Tx, w 皆为已知量,α 为参数。

悬链线的长度 L。上面给出了锚链悬链线的带参方程,我们可以据此求出悬链线的长度 L。

先求微元段 ds

ds =√

1 + y2dx = cosh[w

Txx+ ln(tanα+ secα)

]dx

将微元段 ds 求和,有

S ≜ L =

∮ds

=Txw

sinh[w

Txx+ ln(tanα+ secα)

]+ C3

由边值条件 S|x=0 = 0,有

C3 = −Txw

tanα

故带参数 α 的悬链线长度方程为

S =Txw

sinh[w

Txx+ ln(tanα+ secα)

]− Txw

tanα

拉力 T 的计算。悬链线拉力 T 的表达式为

T = Tx√1 + y2 = Tx cosh

[w

Txx+ ln(tanα+ secα)

](5) 解非线性方程组求解系泊系统曲线

http://www.ma-xy.com 217 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

下面,我们来求解系泊系统曲线。系泊系统曲线是由 (x6, h, α) 三个参数决定的。求 3 个参数,要有三个方程,我们要求:¬海水深度为 18m;­锚链长度 L = 22.05m;®力平衡。于是有

如下非线性方程

y6 = H − h−5∑i=1

l cos θi =Tx,6w

cosh[w

Tx,6+ ln(tanα2 + secα2)

]− Txw

secα2 (9.7)

S ≜ L =Tx,6w

sinh[w

Tx,6+ ln(tanα2 + secα2)

]= 22.05 (9.8)

Tx,6 cosh[w

Tx,6+ ln(tanα2 + secα2)

]=√

(Tx,6)6 + (Ty,6)2 (9.9)

其中:上面非线性方程中的第 3 个等式条件由下式变化而来

T = Tx,6 cosh[w

Tx,6+ ln(tanα2 + secα2)

]=√(Tx,6)6 + (Ty,6)2

注意,上面方程组只有 h, x6, α 三个参数,其余量皆可用这三个量表示。解上述非线性方程组

(9.7) 可得到 (h, x6, α),即可得到整个系泊系统的情况。

程序

根据上述分析求解系泊系统,设置程序 For2D_expand.m 如下1 function f = For2D_expand(xx , H, v1 , v2 , m_qiu, I , L, xitong_figure , xitong_save )2 %此函数是系泊系统的3元方程组的目标函数 ,用于 f s o l v e函数。模型改进:引入”力矩平衡”和”悬

链线方程”3 %4 %%%%输入%%%%5 % xx:y0 , x0 , alpha2。6 % v1:风速。7 % v2:水速。8 % H:海水深度。9 % m_qiu:重物球质量。

10 % I:锚链型号。 1、2、3、4、511 % L:锚链长度。12 % xitong_figure:是否输入系统图像13 % xitong_save:是否保存系统数值结果14 %%%%正文%%%%15 y0 = xx(1) ;16 x0 = xx(2) ;17 alpha2 = xx(3) ;18 h = H − y0 ;19 y(1) = y0 ;20 x(1) = x0 ;21 %浮标受力22 rho = 1.025*10^3;%海水的密度 kg/m^323 g = 9 . 8 ;%重力加速度 N/kg24 D = 2;%圆柱浮标地面直径 m25 h0 = 2;%圆柱浮标高度 m26 m0= 1000;%浮标质量 kg27 F0 = rho*g*pi *(D/2)^2*h ;%浮标浮力

http://www.ma-xy.com 218 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

28 G0 = m0*g ;%浮标重力29 % v1 = 24;%风速 m/s30 % v2 = 1.5;%水速 m/s31 S_wind = D*(h0 − h) ;%风受力面积32 Fw = 0.625*S_wind*v1^2;%风力33 Fs0 = 374*D*h*v2^2;%海水流力34 Tx(1) = Fw + Fs0 ;35 Ty(1) = F0 − G0;36 %钢管受力37 f o r i = 1:438 l ( i ) = 1;%钢管长度 m39 d( i ) = 50/1000;%钢管直径 m40 m( i ) = 10;%钢管质量 kg41 G( i ) = m( i )*g ;%钢管重力42 F( i ) = rho*g*pi *(d( i ) /2)^2* l ( i ) ;%钢管浮力43 %%%%参考: http :// blog . s ina .com. cn/s/blog_53f291190100cjss . html44 s i = @( theta1 )d( i ) *( pi /2*d( i )*cos ( theta1 ) + l ( i )* s in ( theta1 ) ) ;%第一根钢管的海水法

平面投影

45 Fsi = @( theta1 )374* s i ( theta1 )*v2^2;%第一根钢管的海水力46 fun = @( theta1 ) (G( i ) − F( i ) ) /2*cos ( theta1 ) + Tx( i )* s in ( theta1 ) + Fsi ( theta1 )* s in (

theta1 )/2 − Ty( i )*cos ( theta1 ) ;47 theta1 = f so lve ( fun , 0) ;48 theta ( i ) = theta1 ;49 Tx( i+1) = Tx( i ) + Fsi ( theta ( i ) ) ;50 Ty( i+1) = Ty( i ) + F( i ) − G( i ) ;51 %钢管 i的坐标( xi , y i)52 y( i+1) = y( i ) − l ( i )* s in ( theta ( i ) ) ;53 x( i+1) = x( i ) − l ( i )*cos ( theta ( i ) ) ;54 end55 %钢桶受力分析56 m_tong = 100;%钢桶的质量 kg57 G_tong = m_tong*g ;%钢桶重力58 % m_qiu = 1200;%重物球质量 kg59 G_qiu = m_qiu*g ;%重物球重力60 l_tong = 1;%钢桶长 m61 D_tong = 30/100;%钢桶底长62 F_tong = rho*g*pi *(D_tong/2)^2*l_tong ;%钢桶浮力63 s i = @( theta1 )D_tong*( pi /2*D_tong*cos ( theta1 ) + l_tong* s in ( theta1 ) ) ;%第一根钢管的海水

法平面投影

64 Fsi = @( theta1 )374* s i ( theta1 )*v2^2;%第一根钢管的海水力65 fun = @( theta1 ) (G_tong − F_tong)/2*cos ( theta1 ) + Tx(5)* s in ( theta1 ) + Fsi ( theta1 )* s in (

theta1 )/2 − Ty(5)*cos ( theta1 ) ;66 theta_tong = f so lv e ( fun , 0) ;67 theta (5) = theta_tong ;68 Tx(6) = Tx(5) + Fsi ( theta (5) ) ;69 Ty(6) = Ty(5) + F_tong − G_tong − G_qiu ;70 y(6) = y(5) − l_tong* s in ( theta (5) ) ;71 x(6) = x(5) − l_tong*cos ( theta (5) ) ;72 %确定锚链73 switch I74 case 175 I I = 78/1000;%锚链每节长度 m76 m_II = 3 . 2 ;%单位长度的质量 kg/m

http://www.ma-xy.com 219 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

77 case 278 I I = 105/1000;%锚链每节长度 m79 m_II = 7;%单位长度的质量 kg/m80 case 381 I I = 120/1000;82 m_II = 12 .5 ;%单位长度的质量 kg/m83 case 484 I I = 150/1000;85 m_II = 19 .5 ;%单位长度的质量 kg/m86 case 587 I I = 180/1000;88 m_II = 28.12 ;%单位长度的质量 kg/m89 end90 n = f l o o r (L/ I I ) ;91 % L = 22.05 ;92 w = m_II*g ;93 f (1) = Tx(6)/w*cosh (w/Tx(6)*x(6) + log ( tan ( alpha2 ) + sec ( alpha2 ) ) ) − Tx(6)/w*sec (

alpha2 ) . . .94 − y0 + l (1)* s in ( theta (1) ) + l (2)* s in ( theta (2) ) + l (3)* s in ( theta (3) ) + l (4)* s in (

theta (4) ) . . .95 + l_tong* s in ( theta (5) ) ;96 f (2) = Tx(6)/w*sinh (w/Tx(6)*x(6) + log ( tan ( alpha2 ) + sec ( alpha2 ) ) ) − Tx(6)/w*tan (

alpha2 ) . . .97 − L;98 f (3) = Ty(6)/Tx(6) − sinh (w/Tx(6)*x(6) + log ( tan ( alpha2 ) + sec ( alpha2 ) ) ) ;99

求解非线性方程组 (9.7)1 function bestxx = bestpoint3_expand (H, v1 , v2 , m_qiu, I , L, xitong_figure ,

xitong_save )2 %此函数用于求解系泊系统的3元方程组,从而求出最优y0 , x0 , alpha2。3 %4 %%%%正文%%%%5 fun = @(xx)For2D_expand(xx , H, v1 , v2 , m_qiu, I , L, xitong_figure , xitong_save ) ;6 xx0 = [H−0.7 , 20 , 0 ] ;7 bestxx = f so lv e ( fun , xx0) ;8 end9

结果

风速 v = 36m/s 时 (风速 12/24 时存在错误,锚链拖尾状态没有处理好),改进的系泊系统图像如图 (9.24) 所示

http://www.ma-xy.com 220 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

图 9.24: 风速 36、吃水深度 0.770003 时的系统系统 (改进)

下面给出水深 H、水速 v2 对系统的影响 (敏感性分析)。水深 H、水速 v2 对系统的影响如

图 (9.25) 所示

(a) 水深 H 的灵敏度分析 (b) 水速 v2 的灵敏度分析图 9.25: 水深、水速的敏感性分析

9.2.7 改进二:3 维坐标系下的系泊系统

上面的系泊系统是在二维平面 xoy 下进行分析的,并没有考虑到强水速 vs。如果海水流速

较强,则系泊系统的状态应该是一个三维空间的曲线,为此,我们建立三维空间 xyzo 下的系泊

系统,并进行相应的受力分析。

三维系泊系统建立

(1) 建立空间直角坐标系我们先固定水深 Hs = 18m,海水流速 vs = 1.5m/s,风速 vw = 24m/s,设风速 vw 与海水

流速 vs 所成的夹角为 β = 90◦,以风力 Fw 所在的方向为 y 轴正向,以垂直海平面向上的方向

为 z 轴正方向,建立如图 (9.26) 所示的空间直角坐标系。

http://www.ma-xy.com 221 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

图 9.26: 海中某点在三维空间中受力示意图

(2) 浮标受力分析假设浮标在风力和水流力的作用下仍保持水平。对浮标进行受力分析,如图 (9.27) 所示。

图 9.27: 浮标三维受力分析

在三维坐标空间对浮标进行受力分析,浮标受到的力有重力 G1、浮力 F1、第一根钢管对它

的拉力 T1、风力 Fw、近海水流力 Fs。设浮标的吃水深度为 h,拉力与平面的夹角为 θ,与 x 轴

的夹角为 α,β 为水流的方向与 y 轴正方向的夹角。类似问题一中浮标的受力分析可得浮标所受

的重力、浮力、风力、水流力分别为 (单位:N):

G0 = m0g

F0 = ρgπ(D/2)2h

Fs = 374Dhv2s

Fw = 0.625D(h0 − h)v2w

其中:m0 为浮标的质量,ρ 为海水密度,D 为浮标的底面直径,h0 为浮标高度,h 为吃水深度,

vw 为海面风速,vs 为水流速度。

第一张力 T1 在各个方向的大小分别如下

T1x = T1 cos θ1 cosα1

T1y = T1 cos θ1 sinα1

T1z = T1 sin θ1

http://www.ma-xy.com 222 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

浮标在水中最终处于静力平衡状态,得到静力平衡方程组

T1x = Fs sinβ

T1y = Fw + Fs cosβ

T1z +G1 = F1

上述方程组中通过先给定浮标的吃水深度 h,可得到 Fs, Fw, F1 的值而可求得,T1, α1, θ1 的

值。进一步,在已知钢管长度 l 为 1m 的情况下,利用静力平衡方程的结果得到第一根钢管的下

端点的坐标 (x2, y2, z2) 如下

x2 = l cos θ1 cosα1 + x1

y2 = l cos θ1 sinα1 + y1

z2 = l sin θ1 + z1

其中,(x1, y1, z1) 为浮标与钢管连接处的坐标。

(3) 钢管受力分析水中钢管的受力情况如图 (9.28) 所示

图 9.28: 水中钢管受力示意图

与前面的分析相同,第 i 根钢管受到的力有重力 Gi+1、浮力 Fi+1、钢管受到的前端拉力与

后端拉力分别为 Ti 和 Ti+1 、近海水流力 Fsi,为钢管的数量。下面,我们来推导近海水流力 Fsi

的计算,Fsi = 374Sv2s,因此,我们只要求出每节钢管在海里的受力面积即可,钢管的投影如图

(9.29) 所示

图 9.29: 钢管受力面积分析图

http://www.ma-xy.com 223 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

可以推得

l′ =√[l cos θ cos(β − α)]2 + (l sin θ)2

=l

√cos2 θ cos2(β − α) + sin2 θ

而且 S = dl′,所以

Fsi =374Sv2s

=374dl

√cos2 θ cos2(β − α) + sin2 θv2s

d 为钢管直径,d, l, β 均为定值,Fsi 为第 i 根钢管在平衡状态下受到的水流力,得到钢管的静力

平衡方程组如下

Tix = Ti cos θi cosαiTiy = Ti cos θi sinαiTiz = Ti sin θi

其中,Tix, Tiy, Tiz 分别为张力 Ti 在 x 轴、y 轴、z 轴方向的分力,β 为水流的方向与 y 轴正方向的夹角。求解上述静力平衡方程,可以得到 Ti+1, θi+1, αi+1。由此得到关于第 i 根钢管的下端

坐标的方程组

xi+1 = l cos θi+1 cosαi+1 + xi

yi+1 = l cos θi+1 sinαi+1 + yi

zi+1 = l sin θi+1 + zi

(4) 钢桶的受力分析将钢桶与重物球看成一个整体进行受力分析,如图 (9.30) 所示

图 9.30: 钢桶与重物球的受力示意图

与第一问类似,钢桶和重物球受到的力有重力 G5 和 G6 、浮力 F5、海水流力 Fs5、上端与

下端的拉力分别为 T5 和 T6。根据钢桶和重物球处于平衡状态,得到钢桶和重物球的静力平衡方

http://www.ma-xy.com 224 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

程如下

T6x = T5x + Fs5 sinβ

T6y = T5y + Fs5 cosβ

T6 +G5 +G6 = F5 + T5z

(5) 对锚链进行分析方法 1:假设锚链形状可改变但没有弹性,类比于我们在问题一种分析的那样,利用微元法

对锚链的微段 ds 进行受力分析。求解各段 Ti、θi 、αi 、(xi, yi, zi) 的迭代公式,但这些迭代公

式表示复杂,求解较麻烦。这种方法用到了微元法,我们并没有求解出来。故而选取了下面的方

法 2。方法 2:考虑锚链是环环相扣的环链 (这种情况符合本文题设条件中锚链是无档普通链环的

情况)。设锚链共有 n 节环,由问题一可知锚链在水中受到的浮力相对于重力而言可忽略不计。

因此我们可以得到第 i 节连环 Ti、θi 、αi 、(xi, yi, zi) 的迭代公式 (可与之前类似推得)。

程序

三维空间中的系泊系统求解程序 For3D.m 如下1 function [ z , y , x , theta , alpha , T, stat ] = For3D(z0 , y0 , x0 , v1 , v2 , m_qiu, I , L,

beta , xitong_figure )2 % 此函数用于给定x0、y0和 z0后求解3D系泊系统的状态曲线3 %%%%正文%%%%4 h = abs ( z0 ) ;5 %确定锚链6 switch I7 case 18 I I = 78/1000;%锚链每节长度 m9 m_II = 3 . 2 ;%单位长度的质量 kg/m

10 case 211 I I = 105/1000;%锚链每节长度 m12 m_II = 7;%单位长度的质量 kg/m13 case 314 I I = 120/1000;15 m_II = 12 .5 ;%单位长度的质量 kg/m16 case 417 I I = 150/1000;18 m_II = 19 .5 ;%单位长度的质量 kg/m19 case 520 I I = 180/1000;21 m_II = 28.12 ;%单位长度的质量 kg/m22 end23 n = round(L/ I I ) ;24 ind = n+5+1;25

26 %浮标、钢管分析27 fun = @(x_point ) (D3fun_fubiao (x_point , beta , z0 , v1 , v2) ) ;28 X0 = [14000 , 0 , pi / 2 ] ;%T1、 theta1和 alpha1的初始搜索点

http://www.ma-xy.com 225 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

29 [ x_solve , ~ ] = f so lv e ( fun , X0) ;30 T(1) = x_solve (1) ;31 theta (1) = x_solve (2) ;32 alpha (1) = x_solve (3) ;33 x(1) = x0 ;34 y(1) = y0 ;35 z (1) = z0 ;36 f o r i = 1:437 l = 1;%钢管长度38 Ti = T( i ) ;39 theta i = theta ( i ) ;40 alphai = alpha ( i ) ;41 fun = @(x_point ) (D3fun_gangguan(x_point , Ti , thetai , alphai , beta , v2) ) ;42 X0 = [Ti , thetai , alphai ] ;%T、 theta和 alpha的初始搜索点43 [ x_solve , ~ ] = f so lv e ( fun , X0) ;44 T( i+1) = x_solve (1) ;45 theta ( i+1) = x_solve (2) ;46 alpha ( i+1) = x_solve (3) ;47 i f alpha ( i ) < pi /248 x( i+1) = x( i ) + l *cos ( theta ( i ) )*cos ( alpha ( i ) ) ;49 e l s e50 x( i+1) = x( i ) − l *cos ( theta ( i ) )*cos ( alpha ( i ) ) ;51 end52 y( i+1) = y( i ) − l *cos ( theta ( i ) )* s in ( alpha ( i ) ) ;53 z ( i+1) = z ( i ) − l * s in ( theta ( i ) ) ;54 end55 %钢桶分析56 l_tong = 1;%钢桶长 m57 T5 = T(5) ;58 theta5 = theta (5) ;59 alpha5 = alpha (5) ;60 fun = @(x_point ) (D3fun_gangtong(x_point , T5, theta5 , alpha5 , beta , v2 , m_qiu) ) ;61 X0 = [T5, theta5 , alpha5 ] ;62 [ x_solve , ~ ] = f so lv e ( fun , X0) ;63 T(6) = x_solve (1) ;64 theta (6) = x_solve (2) ;65 alpha (6) = x_solve (3) ;66 i f alpha (5) < pi /267 x(6) = x(5) + l_tong*cos ( theta (5) )*cos ( alpha (5) ) ;68 e l s e69 x(6) = x(5) − l_tong*cos ( theta (5) )*cos ( alpha (5) ) ;70 end71 y(6) = y(5) − l_tong*cos ( theta (5) )* s in ( alpha (5) ) ;72 z (6) = z (5) − l_tong* s in ( theta (5) ) ;73 %锚链线分析74 L_tuo = 0;%锚链拖尾长度75 f o r i = 6 : 6+n−176 i f theta ( i ) − 0 >0.00177 Ti = T( i ) ;78 theta i = theta ( i ) ;79 alphai = alpha ( i ) ;80 fun = @(x_point ) (D3fun_maolian(x_point , Ti , thetai , alphai , I ) ) ;81 X0 = [Ti , thetai , alphai ] ;%T、 theta和 alpha的初始搜索点

http://www.ma-xy.com 226 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

82 [ x_solve , ~ ] = f so lv e ( fun , X0) ;83 T( i+1) = x_solve (1) ;84 theta ( i+1) = x_solve (2) ;85 alpha ( i+1) = x_solve (3) ;86 i f alpha ( i ) < pi /287 x( i+1) = x( i ) + I I *cos ( theta ( i ) )*cos ( alpha ( i ) ) ;88 e l s e89 x( i+1) = x( i ) − I I *cos ( theta ( i ) )*cos ( alpha ( i ) ) ;90 end91 y( i+1) = y( i ) − I I *cos ( theta ( i ) )* s in ( alpha ( i ) ) ;92 z ( i+1) = z ( i ) − I I * s in ( theta ( i ) ) ;93 e l s e94 T( i+1) = 0;95 theta ( i+1) = 0;96 alpha ( i+1) = alpha ( i ) ;97

98 z ( i+1) = z ( i ) ;99 y( i+1) = y( i ) − I I * s in ( alpha ( i ) ) ;

100 i f alpha ( i ) < pi /2101 x( i+1) = x( i ) + I I *cos ( alpha ( i ) ) ;102 e l s e103 x( i+1) = x( i ) − I I *cos ( alpha ( i ) ) ;104 end105 L_tuo = L_tuo+I I ;106 end107 end108

在求解 Ti, θi, αi 的方程组时,要注意这个方程组会有两个解,我们要选择合适的。上面的程

序中用到了 D3fun_fubiao.m,D3fun_gangguan.m,D3fun_gangtong.m 和 D3fun_maolian.m,这里我们仅给出 D3fun_gangguan.m 的程序,其余相似

1 function y = D3fun_gangguan(x_point , T, theta , alpha , beta , v2)2 %此函数用于求解钢管的T、 theta和 alpha3 %4 %%%%%输入说明%%%%5 % x:解。T, theta, alpha6 % T:Ti−17 % theta:8 %%%%正文%%%%9 Tx = T*cos ( theta )*cos ( alpha ) ;

10 Ty = T*cos ( theta )* s in ( alpha ) ;11 Tz = T*s in ( theta ) ;12 %钢管受力分析13 rho = 1.025*10^3;14 g = 9 . 8 ;15 m = 10;%钢管质量 kg16 G = m*g ;%钢管重力17 l = 1;%钢管长度 m18 d = 50/1000;%钢管直径 m19 F = rho*g*pi *(d/2)^2* l ;%钢管浮力20 % s = d*( l ^2 − l ^2*( cos ( theta ) ) ^2*( s in ( alpha−beta ) ) ^2) ;21 s = d* l * sqrt (( cos ( theta ) ) ^2*( cos ( beta − alpha ) )^2 + ( s in ( theta ) ) ^2) ;

http://www.ma-xy.com 227 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

22 Fs = 374* s*v2^2;23 Ti = x_point (1) ;24 theta i = x_point (2) ;25 alphai = x_point (3) ;26 Tix = Ti*cos ( theta i )*cos ( alphai ) ;27 Tiy = Ti*cos ( theta i )* s in ( alphai ) ;28 Tiz = Ti* s in ( theta i ) ;29 y = [ Tix − Tx − Fs* s in ( beta ) ; . . .30 Tiy − Fs*cos ( beta ) − Ty ; . . .31 Tiz + G − F − Tz ] ;32 end33

结果

风速 v = 12m/s 时的锚链末端 zn 和水平面夹角 θ 随吃水深度 h 的变化曲线如图 (9.31) 所示。

图 9.31: 风速 12 时锚链末端及水平面夹角随吃水深度 h 的变化曲线

在最优吃水深度下,风速 vw = 24m/s 时系泊系统的 3D 系统曲线如图 (9.32) 所示。

图 9.32: 风速 12、吃水深度 0.54107 时的 3D 系泊系统

http://www.ma-xy.com 228 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第九章 系泊系统 9.2 系泊系统的优化设计

9.2.8 总结

1. 建模过程不要急躁。由于在编程时的一点失误 (括号没对齐),我们差一点就放弃了。遇到程序问题,把程序打印下来,一行一行的捋,慢慢来,别着急。

2. 这种题型的一般题目要求是:第一问,寻找变量之间的关系;第二问,设计优化模型,来达到某种要求;第三问,敏感性分析。当然,也没有必要循规蹈矩,你想怎样做就怎样做,没关

系。

http://www.ma-xy.com 229 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om9.2 系泊系统的优化设计 第九章 系泊系统

http://www.ma-xy.com 230 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号

10.1 题目要求

A 题:嫦娥三号软着陆轨道设计与控制策略¬

嫦娥三号于 2013 年 12 月 2 日 1 时 30 分成功发射,12 月 6 日抵达月球轨道。嫦娥三号在着陆准备轨道上的运行质量为 2.4t,其安装在下部的主减速发动机能够产生 1500N 到 7500N 的

可调节推力,其比冲 (即单位质量的推进剂产生的推力) 为 2940m/s,可以满足调整速度的控制

要求。在四周安装有姿态调整发动机,在给定主减速发动机的推力方向后,能够自动通过多个发

动机的脉冲组合实现各种姿态的调整控制。嫦娥三号的预定着陆点为 19.51W,44.12N,海拔为

−2641m(见附件 1)。嫦娥三号在高速飞行的情况下,要保证准确地在月球预定区域内实现软着陆,关键问题是着

陆轨道与控制策略的设计。其着陆轨道设计的基本要求:着陆准备轨道为近月点 15km,远月点

100km 的椭圆形轨道;着陆轨道为从近月点至着陆点,其软着陆过程共分为 6 个阶段 (见附件2),要求满足每个阶段在关键点所处的状态;尽量减少软着陆过程的燃料消耗。根据上述的基本要求,请你们建立数学模型解决下面的问题:

(1) 确定着陆准备轨道近月点和远月点的位置,以及嫦娥三号相应速度的大小与方向。(2) 确定嫦娥三号的着陆轨道和在 6 个阶段的最优控制策略。(3) 对于你们设计的着陆轨道和控制策略做相应的误差分析和敏感性分析。

10.1.1 附件 1:问题的背景与参考资料;

1. 中新网 12 月 12 日电 (记者姚培硕)

根据计划­,嫦娥三号将在北京时间 12 月 14 号在月球表面实施软着陆。嫦娥三号如何实现软着陆以及能否成功成为外界关注的焦点。目前,全球仅有美国、前苏联成功实施了 13 次无人月球表面软着陆。

北京时间 12 月 10 日晚,嫦娥三号已经成功降轨进入预定的月面着陆准备轨道,这是嫦娥三号“落月”前最后一次轨道调整。在实施软着陆之前,嫦娥三号还将在这条近月点高度约 15公里、远月点高度约 100 公里的椭圆轨道上继续飞行。期间,将稳定飞行姿态,对着陆敏感器、

¬2014 高教社杯全国大学生数学建模竞赛题目­http://www.chinanews.com/mil/2013/12-12/5608941.shtml

231

http:/

/www.m

a-xy.c

om10.1 题目要求 第十章 嫦娥 3 号

着陆数据等再次确认,并对软着陆的起始高度、速度、时间点做最后准备。

“发射、近月制动、变轨和月面降落比较起来,后者更为关键。这对我们来说是一个全新的,

也是一个最重要的考验。”中国探月工程总设计师吴伟仁表示。

嫦娥三号着陆地点选在较为平坦的虹湾区。但由于月球地形的不确定性,最终“落月”地点

的选择仍存在一定难度。据悉,嫦娥三号将在近月点 15 公里处以抛物线下降,相对速度从每秒1.7公里逐渐降为零。整个过程大概需要十几分钟的时间。探测器系统副总指挥谭梅将其称为“黑色 750 秒”。由于月球上没有大气,嫦娥三号无法依靠降落伞着陆,只能靠变推力发动机,才能完成中途

修正、近月制动、动力下降、悬停段等软着陆任务。据了解,嫦娥三号主发动机是目前中国航天

器上最大推力的发动机,能够产生从 1500 牛到 7500 牛的可调节推力,进而对嫦娥三号实现精准控制。

在整个“落月”过程中,“动力下降”被业内形容为最惊心动魄的环节。在这个阶段,嫦娥三

号要完全依靠自主导航控制,完成降低高度、确定着陆点、实施软着陆等一系列关键动作,人工

干预的可能性几乎为零。“在这个时间段内测控都跟不上了,判断然后上去执行根本来不及,只

能事先把程序都设定好。”谭梅表示。

在距月面 100 米处时,嫦娥三号要进行短暂的悬停,扫描月面地形,避开障碍物,寻找着陆点。“如果下面有个大坑,需要挪个地方,它就会自己平移,等照相机告诉它地面平了,才会降

落”。中国绕月探测工程首任首席科学家、中国科学院院士欧阳自远介绍。

之后,嫦娥三号在反推火箭的作用下继续慢慢下降,直到离月面 4 米高时再度悬停。此时,关掉反冲发动机,探测器自由下落。由于探测器具备着陆缓冲机构,几个腿都有弹性,落地时不

至于摔坏。

安全降落以后,嫦娥三号将打开太阳能电池板接收能量,携带的仪器经过测试、调试后开始

工作。随后,“玉兔号”月球车将驶离着陆器,在月面进行 3 个月的科学勘测,着陆器则在着陆地点进行原地探测。这将是中国航天器首次在地外天体的软着陆和巡视勘探,同时也是 1976 年后人类探测器首次的落月探测。

http://www.ma-xy.com 232 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.1 题目要求

2. 嫦娥三号近月轨道示意图 (曲振东编制)

图 10.1: 嫦娥三号近月轨道示意图®

3. 嫦娥三号着陆区域和着陆点示意图

图 10.2: 嫦娥三号着陆区域和着陆点示意图¯

4. 主发动机和姿态调整发动机的分布图

嫦娥三号安装有大推力主减速发动机一台,位于正下方。小型姿态调整发动机 16 台,分布在相对前、后、左、右四个侧面,如图 (10.3) 是一个侧面的分布情况。

图 10.3: 嫦娥三号主发减速动机与姿态调整发动机的分布图

http://www.ma-xy.com 233 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.1 题目要求 第十章 嫦娥 3 号

5. 关于比冲

比冲°或比冲量是对一个推进系统的燃烧效率的描述。比冲的定义为:火箭发动机单位质量

推进剂产生的冲量,或单位流量的推进剂产生的推力。比冲的单位为米/秒 (m/s),并满足下列关系式:

Fthrust = vem

其中:Fthrust 是发动机的推力,单位是牛顿;ve 是以米/秒为单位的比冲;m 是单位时间燃料消耗的公斤数。

6. 关于月球参数

月球平均半径、赤道平均半径和极区半径分别为 1737.013km、1737.646km 和 1735.843km,

月球的形状扁率为 1/963.7256,月球质量是 7.3477 × 1022kg。月球与地球距离最远 (远地点):406610km,最近 (近地点):356330km,平均距离为 384400km。

NASA 月球勘测轨道飞行器使用的月面海拔零点,是月球的平均半径所在的高度。所以,嫦娥三号着陆点的海拔为 −2640m,即该点到月球中心的距离要比月球的平均半径少 2640m。

10.1.2 附件 2:嫦娥三号着陆过程的六个阶段及其状态要求;

1. 嫦娥三号软着陆过程示意图

图 10.4: 嫦娥三号软着陆过程示意图°维基百科,比冲. http://en.wikipedia.org/wiki/Specific_impulse. 2014.1.17

http://www.ma-xy.com 234 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.1 题目要求

2. 嫦娥三号软着陆过程分为 6 个阶段的要求

(1) 着陆准备轨道:着陆准备轨道的近月点是 15km,远月点是 100km。近月点在月心坐标系的位置和软着陆轨道形态共同决定了着陆点的位置。

(2) 主减速段:主减速段的区间是距离月面 15km 到 3km。该阶段的主要是减速,实现到距离月面 3 公里处嫦娥三号的速度降到 57m/s。

(3) 快速调整段:快速调整段的主要是调整探测器姿态,需要从距离月面 3km 到 2.4km 处将水平速度减为 0m/s,即使主减速发动机的推力竖直向下,之后进入粗避障阶段。

(4) 粗避障段:粗避障段的范围是距离月面 2.4km 到 100m 区间,其主要是要求避开大的陨石坑,实现在设计着陆点上方 100m 处悬停,并初步确定落月地点。嫦娥三号在距离月面 2.4km 处对正下方月面 2300× 2300m 的范围进行拍照,获得数字高程

如附图 (10.5)所示 (相关数据文件见附件 3),并嫦娥三号在月面的垂直投影位于预定着陆区域的中心位置。

图 10.5: 距月面 2400m 处的数字高程图

该高程图的水平分辨率是 1m/像素,其数值的单位是 1m。例如数字高程图中第 1 行第 1 列的数值是 102,则表示着陆区域最左上角的高程是 102 米。

(5) 精避障段:精细避障段的区间是距离月面 100m 到 30m。要求嫦娥三号悬停在距离月面100m 处,对着陆点附近区域 100m 范围内拍摄图像,并获得三维数字高程图。分析三维数字高程图,避开较大的陨石坑,确定最佳着陆地点,实现在着陆点上方 30m处水平方向速度为 0m/s。

附图 (10.6) 是在距离月面 100m 处悬停拍摄到的数字高程图 (相关数据文件见附件 4)。

图 10.6: 距离月面 100m 处的数字高程图

该数字高程的水平分辨率为 0.1m/像素,高度数值的单位是 0.1m。

http://www.ma-xy.com 235 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.1 题目要求 第十章 嫦娥 3 号

(6) 缓速下降阶段:缓速下降阶段的区间是距离月面 30m 到 4m。该阶段的主要任务控制着陆器在距离月面 4m 处的速度为 0m/s,即实现在距离月面 4m 处相对月面静止,之后关闭发动机,使嫦娥三号自由落体到精确有落月点。

注:附件 3 和附件 4 中数字高程图对应的 *.tif 文件可以使用 Matlab 的“imread”命令打开,“imread”的具体使用方法见 Matlab 相关帮助。

10.1.3 附件 3:距月面 2400m 处的数字高程图;

图 10.7: 距 2400m 处的数字高程图

10.1.4 附件 4:距月面 100m 处的数字高程图。

图 10.8: 距月面 100m 处的数字高程图

http://www.ma-xy.com 236 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

10.2 嫦娥 3 号软着陆的优化控制

10.2.1 基础知识准备

系统及最优控制基础知识

下面的内容介绍了一些系统和最优控制的基础知识。现代控制理论形成的主要标志是:1.Kalman滤波理论;2.Pontryayin 极大值原理;3.Belman 动态规划方法。主要分支有线性系统理论、最优控制理论、自适应控制、动态系统辨识、大系统理论等。

状态:是一些变量的集合,它们是足以完全描述系统全部运动的最小变量集。

完全描述:只要给定这组变量的某一初始时刻 t0 的值,并且有输入控制函数 u(t),那么系

统中的全部变量在 t ⩽ t0 的值都唯一确定。

状态向量:如果 n 个状态变量用 x1(t), x2(t), . . . , xn(t) 表示,则

x(t) = [x1(t), x2(t), . . . , xn(t)]T

记为状态变量。

状态方程:由系统的状态变量构成的一阶微分方程组称为状态方程。

示例:考虑下面的例子,线性弹簧-质量-阻尼器构成的机械位移系统 (k−m− f) 如图 (10.9)所示

图 10.9: 弹簧阻尼位移系统

如果输入量是外力 F (t),输出量是位移 y(t),则

md2y

dt2 + fdydt + ky = F (t)

y(t), dydt 就是足以完全描述系统运动的最小一组变量。输入量 u(t) = (Ft, θt),输出量 y(t) = mt,

状态量 x(t) = (v, r, w)。

上面介绍了系统的一些基本定义,下面我们介绍基于系统的最优控制问题,以及用变分法、

P 极大值原理、动态规划等技术求解系统的最优控制问题。常见的最优控制包括最短时、最少能耗及其组合优化问题。

经典控制论中常用一个高阶微分方程来描述系统的运动规律,而现代控制论中采用是状态

空间法,即为一组状态变量的一阶微分微分方程的形式作为系统的数学模型。这使得我们可以求

解系统中许多量的值。MATLAB:控制系统工具箱 Control System Toolbox、系统辨识工具箱

http://www.ma-xy.com 237 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

System Idemtification Toolbox、鲁棒性控制工具箱 Robust Control Toolbox、多变量频域设计工具箱 Muli-Vanable Frequency Design Toolbox、最优化工具箱 Ootimization Control toolbox 以及 Similink 控制系统仿真环境。抽象系统方程为

x(t) = F (x(t), u(t), t)

其中:x(t) 为 n 个状态变量 x1, x2, . . . , xn 的向量形式;u(t) 为控制输入 u1, u2, . . . , ur 的向量形

式;F = (f1, f2, . . . , fn)T 是一个函数标量。

输出方程为

Y (t) = G(x(t), u(t), t)

其中:G = (g1, g2, . . . , gm)T 是函数矢量。

现代控制理论中,用系统状态方程和输出方程来描述系统的状态行为,状态方程和输出方程,

合起来称为系统的状态表达式/动态方程。根据一阶微分方程 (F,G)的形式,一般系统可分为:1.线性定常系统;2. 线性不定常系统;3. 非线性定常系统;4. 非线性不定常系统。即

x = Ax

x = A(t)x

x = Ax2 + x

x = A(t)x2 + x

对于一个系统的分析,一般有以下步骤:1. 系统动态方程表达;2. 系统状态方程的求解;3. 系统稳定性及李雅普诺夫稳定;4. 能控制和能观性;5. 系统的最优控制。

在最优控制过程中,我们不仅要给出系统的动态方程,而且还要注意系统变量的额约束。对

系统状态 x(t) 而言,要考虑系统的始、终端条件。始终端约束条件即系统在时间 t0 和 tf 时,状

态 x, xf 应该满足一定的条件。端点条件一般有 3 种类型:1. 固定端;2. 自由端;3. 可变端 (灰色端)。固定端就是时间 t0, tf 固定,状态值 x0, xf 固定;自由端是指时间 t0, tf 固定,但端点状态

x0, xf 不变受任何限制的端点;可变端是指 t0, tf , x0, xf 都变的端点,但其一般应该满足某些条

件,例如 N [xf , tf ] = 0,灰色端 ∆1 ⩽ xf ⩽ ∆2。

对系统控制变量 ut 而言,控制输入 u(t) 往往不能不受限制,因为其往往表示非常实际的物

理量 (例如:推理 Ft,夹角 θt)。因此,实际中其约束一般表示 ut 在某一范围内取值,如下表示

umin ⩽ u(t) ⩽ umax

由控制约束条件所规定的点集称为控制域,记为 Ru。

凡在区间 [t0, tf ] 内定义,且在 Ru 内取值的每一个控制函数 ut 均称为容许控制,u(t) ∈ Ru。最优控制的目标泛函:系统的性能指标一般都是一个控制信号 (m(t) 函数) 的函数,即泛函。

对连续时间系统,目标泛函一般为

J = Φ[x(tf )] +

∫ tf

t0

L(x(t), u(t), t)dt

http://www.ma-xy.com 238 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

上述目标形式称为综合型/Bolza 型。

J = Φ[x(tf )]

称为终端型/Mayer 型。

J =

∫ tf

t0

L[x(t), u(t), t]dt

称为积分型/Langrange 型。其中:L 为标量函数。最优控制问题即是在问题空间中,求解最优控制 u(t)∗,使目标泛函 J 最优。

解法:最优控制问题实际上就是微分代数混合优化问题,一般有两种求解方法:解析法和数

值法。解析法又分为变分法和贝尔曼最佳原理的动态规划方法,但我们所建立的许多模型都相对

复杂,解析法并不是非常适用,所以在书中大多数地方,我们都讨论问题的数值解法。下面,我

们将简单介绍一下经典的最优控制解析方法:1. 变分法;2.P 极大值原理;3. 动态规划。

变分法

考虑无约束情况下的极值问题。(1) 一元函数极值:设 f(x) 为定义在 [a, b] 上的连续可微函

数,且二阶可微。如果

dydx

∣∣∣x=x0

= f ′(x)|x=x0= 0

d2y

dx2∣∣∣x=x0

= f ′′(x)|x=x0> 0

则 f 在 x0 处为极小值。

(2) 二元函数极值:设 f(x, y) 为定义在 D 上的连续可微函数,且二阶可微。如果∂f

∂x

∣∣∣x=x0

∂f

∂y

∣∣∣y=y0

且 ∂2f∂x2 < 0,则 f 在点 (x0, y0) 处获得极小值。

(3) 多元极值:对一个 n 元函数 J = f(x),取极值的必要条件

∂f

∂x= 0

取极小值的充分必要条件是

∂2f

∂x2> 0

其中:∂2f∂x2 = H 为 Hessi 矩阵,若 Hessi 矩阵为负定,则函数存在极大值。

http://www.ma-xy.com 239 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

(4) 泛函的定义:泛函可以简单理解为函数的函数。设对自变量 t 存在一类函数 {x(t)},如果 ∀xt ∈ ϕ,有一个 J 值与之对应,则变量 J 称为依赖于函数 x(t) 的泛函数,简称泛函,如图

(10.10) 所示

图 10.10: 泛函示意图

将 {xi(t)}4i=1 带入某关系式,有 J = Af [x(t)]。故称 J 为依赖 x(t) 的泛函,它是普通函数

的一种扩充,函数 x(t) 称为 J 的宗基。当然,{x(t)} 可以是一参数函数族:x(t|θ)。由上述泛函定义可见,泛函是一标量,例如

J [x(t)] =

∫ 1

0

x(t)dt

当 x(t) = 12t 时,J = 1;当 x(t) = cos t 时,J = sin 1。在最优控制中

J =

∫ tf

t0

L[x(t), u(t), t]dt+∆

J 取决于 u(t), x(t),故 J 为泛函。

在学习函数时,我们讨论了函数的连续性、函数导数和极值问题,那么,对于泛函,我们仍

然讨论与之相似的问题。

(5) 泛函的连续性:称宗量 x(t) 的增量 (两函数之差) 为 x(t) 的变分

δx = x(t)− x0(t)

那么有

δx =ddx(δx)

即导数的变分等价于变分的导数,且 δx 是变量 t 的函数 δx(t)。

定义 (泛函的连续性) 如果对于 x(t) 的微小变化,有 J [x(t)] 的微小变化与之对应,则说

J [x(t)] 是连续的。对 ∀ϵ > 0,∃δ > 0,当

|x(t)− x0(t)| < δ

|x(t)− x0(t)| < δ

...

|xk(t)− xk0(t)| < δ

http://www.ma-xy.com 240 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

时,有 |J [x(t)]− J [x0(t)]| < ϵ,则称 J [x(t)] 在 x0(t) 处是 k 阶接近连续的。

泛函的连续性如图 (10.11) 所示

图 10.11: 泛函的连续性示意图

(6) 泛函的变分:在函数中,微分是函数增量 ∆y 对自变量 ∆x 的线性部分。那么,在泛函

中亦可将变分视为泛函增量 ∆J 对宗量 x(t) 的线性部分,即当宗量 x(t) 有增量 δx(t) 时,泛函

J [x(t)] 的增量可以表示为

∆J = J [x(t)− δx(t)]− J [x(t)] = L[x(t), δx(t)] + r[x(t), δx(t)]

其中:L[x(t), δx(t)] 是泛函增量的线性主部分。故

δJ = L[x(t), δx(t)]

称为 J 的变分。

泛函变分的求法:J [x(t)] 的变分等于泛型 J [x(t) + αδx(t)] 对 α 的导数在 α = 0 时的值

δJ =∂

∂αJ [x(t) + αδx(t)]

∣∣α=0

= L[x(t), δx(t)]

(7) 泛函极值:泛函极值的定义

定义 (泛函极值) 如果 J 在任意一点与 x0(t) 接近的曲线 x(t) 上的值不小于 J [x0(t)],即

J [x(t)]− J [x0(t)] ⩾ 0

则 J 在 x0(t) 上达到极小值。

泛函极值的必要条件 (无约束):若 J 在 x0(t) 处达到极小值,则在 x(t) = x0(t) 上有

δJ = 0

上述欧拉方程是泛函极值的必要条件而非充分。

固定端点的泛函极值问题:已知宗量 x(t) 在 t0 时为 x0,在 tf 时为 xf,则使积分型性能指

标函数

J =

∫ tf

t0

L[x(t), x(t), t]dt

http://www.ma-xy.com 241 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

取极值的必要条件为 x∗(t) 满足下面的欧拉方程

∂L

∂x− d∂t

∂L

∂x= 0

其中:L 及 x(t) 在 [t0, tf ] 上至少两次连续可微。

将上述结论推广至多变量系统J =

∫ tf

t0

L[x(t), x(t), t]dt

x(t0) = x0

x(tf ) = xf

J 极值存在的必要条件为

∂L

∂x− d∂t

∂L

∂x= 0

及横截条件方程 (∂L

∂x

)T ∣∣∣t=tf

δx(tf )−(∂L

∂x

)T ∣∣∣t=t0

δx(t0) = 0

其中:

∂L

∂x=

[∂L

∂x1,∂L

∂x2, . . . ,

∂L

∂xn

]T

∂L

∂x=

[∂L

∂x1,∂L

∂x2, . . . ,

∂L

∂xn

]T

示例:求泛函 J(x1, x2) =

∫ π2

0

[2x, x2 + x21 + x22]dt

x1(0) = 0, x2(π/2) = 1

x2(0) = 0, x2(π/2) = 1

下的极值。求解程序如下

1 [ x1 , x2 ] = dsolve ( ’D2x1−x2=0 ’ , ’D2x2−x1=0 ’ , . . .2 ’ x1 (0)=0 ’ , ’ x1( pi /2)=1 ’ , ’ x2 (0)=0 ’ , ’ x2( pi /2)=−1’ , ’ t ’ )3

可变端点极值问题的必要条件:设宗量 x(t) 自一给定点 (t0, x0) 达到给定 x(tf ) = φ(tf ) 上

某一点 [tf , φ(tf )],使

J =

∫ tf

t0

L[x(t), x(t), t]dt

取极值的必要条件为 x∗(t) 满足如下欧拉方程

∂L

∂x− d∂t

∂L

∂x= 0

http://www.ma-xy.com 242 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

x(t0) = x0{L[x, x, t] + (φ− x)T ∂L

∂x

} ∣∣∣t=tf

= 0

x(tf ) = φ(tf )

其中:x(t) 连续两阶可导;L 至少两次连续可微;φ(t) 有连续一次导数。可变端点极值问题示意

图如图 (10.12) 所示

图 10.12: 可变端点极值问题示意图

变分法求解最优控制问题

前面导出了极值曲线 x∗(t) 存在的必要条件-欧拉方程和横截条件 (x(t) 无约束),而在最优控制中,x(t) 除了要满足限制条件外,还应该满足某些系统动态方程,它可以看成一种等式约束,

可采用拉格朗日乘子法进行处理。将等式约束下对 J 的优化转化为无约束条件下就 Hamilton 的极值问题。它只适用于控制变量无约束的情况。

minu(t)

J =

∫ tf

t0

L[x(t), u(t), t]dt

s.t.

x(t) = f [x(t), u(t), t]

x(t0) = x0

x(tf ) = xf

¬固定端点的控制问题;­可变端点的控制(tf 固定,x(tf ) 自由;tf 固定,x(tf ) 有约束;tf 可变,x(tf ) 有约束)。对问题¬(10.2.1),引入拉格朗日乘子 λ(t) = [λ1(t), λ2(t), . . . , λn(t)]

T,构建

哈密顿标量函数

H[x(t), u(t), λ(t), t] = L[x(t), u(t), t] + λT(t)f [x(t), u(t), t]

则上述优化问题变为

J =

∫ tf

t0

H[x(t), u(t), λ(t), t]− λTx(t)dt

http://www.ma-xy.com 243 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

由欧拉方程得

∂[H − λTx]

∂x− d

dt∂[H − λTx]

∂x= 0

⇒ λ = −∂H∂x

伴随方程

∂[H − λTx]

∂u− d

dt∂[H − λTx]

∂u= 0

⇒ ∂H

∂u= 0 控制方程

∂[H − λTx]

∂λ− d

dt∂[H − λTx]

∂λ= 0

⇒ x = −∂H∂λ

= f(x, u, t) 状态方程

及边界条件 (横截条件)

∂[H − λTx]

∂x

∣∣∣t=tf

= 0

⇒ λ(tf ) = 0

状态方程与伴随方程合称为正则方程。

求解过程:∂H∂u

= 0 可求得最优控制 u∗ 与 x 及 λ 的函数关系式,然后将其带入正则方程组

中消去 u∗,解两点边值问题 x = f(x, u(x, λ), t), x(t0) = x0

λ = −∂H∂x

, x(tf ) = xf

可求得 x∗(t), λ∗(t),再将 x∗, λ∗ 带入 u(x∗, λ∗) 可得 u∗ 的具体情况。另外,对 H 函数有

dHdt =

∂H

∂t+

(∂H

∂u

)T

u+

(∂H

∂x

)T

x+

(∂H

∂λ

)T

λ

=∂H

∂t+

(∂H

∂u

)T

u+

(∂H

∂x+ λ

)T

f

当 ∂H∂u

∂H∂x

= λ, ∂u∂λ

= 0 时,dHdt = ∂H

∂t,即沿最优曲线,H 对 t 的导数等于对时间的偏导数。注:

上述欧拉方程式取极值的必要条件。

下面,分析终端自由的情况­(10.2.1):

J = Φ[x(tf ), tf ] +

∫ tf

t0

L(x, u, t)dt

s.t.

x = f(x, u, t)

t0, x0固定

求 tf , xf 自由时的最优控制 u∗ 及最优轨线 x∗。

http://www.ma-xy.com 244 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

(1) 构建 H 函数

H(x, u, λ, t) = L(x, u, t) + λTf(x, u, t)

(2) 增广泛函 J ′

J ′ = Φ[x(tf ), tf ] +

∫ tf

t0

[H − λTx]dt

J ′ 的一次变分为

δJ ′ =

(∂Φ

∂x(tf )

)T

δx(tf ) +

(∂Φ

∂x(tf )

)T∂x(tf )

∂tfδtf +

∂Φ

∂tfδtf + [H − λTx]tf δtf + δJ0

其中:δJ0 = δJ0[x, x, λ, u] = δ∫ tft0[H − λTx]dt。

泛函 J ′ 极值存在的必要条件是:δJ ′ = 0。对固定时间 t0, tf 的变分,δ(t0) = 0

δJ0 =

∫ tf

t0

[∂H

∂x− d

dt∂H

∂x

]T

δxdt+∫ tf

t0

(∂H

∂u

)T

δudt

+

∫ tf

t0

(∂H

∂λ

)T

δλdt+(∂H

∂x

)T

δx∣∣∣tft0

其中:H = H − λTx。将 δJ0 带入 δJ ′,且令 δJ ′ = 0,有

λ = −∂H∂x

x = −∂H∂λ

正则方程

∂H

∂u= 0 控制方程

边界条件/横截条件 λ(tf ) =

∂Φ

∂x

∣∣∣t=tf

x(t0) = x0

H[x(tf ), u(tf ), tf ] = −∂Φ

∂tf

¬终端 tf 固定,x(tf ) 自由时 x(tf ) =

∂Φ

∂x

∣∣∣t=tf

x(t0) = x0

­终端 tf 固定,x(tf ) 有约束:N1(x(tf ), tf ) = 0,其中:N1 = [N11, N12, . . . , N1m]T

λ(tf ) =

[∂Φ

∂x+

(∂NT

1

∂x

)v

] ∣∣∣t=tf

x(t0) = x0

N1(x(tf ), tf ) = 0

http://www.ma-xy.com 245 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

®tf 可变,x(tf ) 有约束:N1(x(tf ), tf ) = 0

λ(tf ) =

[∂Φ

∂x+

(∂NT

1

∂x

)v

] ∣∣∣t=tf[

H +∂Φ

∂t+ vT ∂N1

∂t

] ∣∣∣t=tf

= 0

x(t0) = x0

N1(x(tf ), tf ) = 0

¯当 tf , x(tf ) 稳定时

dx(tf ) = x(tf + δtf ) + δx(tf + δtf )− x(tf )

δx(tf ) + x(tf )δtf

°当 xf 固定,tf 自由时

dx(tf ) = 0 = δx(tf ) + xδtf

极大 (小) 值原理求解最优控制问题

上面介绍的变分法用于求解 u(t) 无约束的情况,而在实际过程中 u(t) 往往具有实际的物理

意义,因此 u(t) 一般有约束,例如

A ⩽ u(t) ⩽ B

设 R = {u(t)|∀t ∈ [t0, tf ], A ⩽ u(t) ⩽ B} 为函数空间。P 极大值原理用于求解 u(t) 有约束的情

minu(t)

J = Φ[x(tf ), tf ] +

∫ tf

t0

L[x(t), u(t), t]dt

s.t.

x(t0) = x0

x = f(x(t), u(t), t)

N1[x(tf ), tf ] = 0

g[x(t), u(t), t] ⩾ 0

如何处理上面的 g ⩾ 0?要是能将 g 变为等式约束就好了,我们仿照线性规划,引入人工变

量 z, w

(z)2 = g[x, u, t], z(t0) = 0

w = u(t), w(t0) = 0

无论 z 是正还是负,(z)2 恒非负。如 u(t) 是分段连续函数免责 w(t) 是分段光滑连续函数。如此,

将 g ⩽ 0 转化为 (z)2 = g[x(t), w(t), t] 等式约束,继而可以引入拉格朗日乘子,构建 H 函数进行

求解。

http://www.ma-xy.com 246 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

实现最优控制的必要条件是:

(1)u∗, x∗, λ∗ 满足下面条件

x =∂H

∂λ

λ = −∂H∂x

其中:H = L+ λTf。

(2)

H[x∗, u∗, λ∗, t] = minu(t)∈R

H[x∗, u, λ∗, t]

(3) 端点边界条件与终端横截条件

x(t0) = x0

N [x(tf ), tf ] = 0

λf =

[∂Φ

∂x+

(∂H1

∂x

)T

v

] ∣∣∣t=tf

(4) 终端 tf 可变时 [H +

∂Φ

∂t+ vT ∂N1

∂t

] ∣∣∣t=tf

= 0

最小时间控制

J = tf 砰-砰

最小能量控制

J =

∫ tf

t0

|u(t)|dt 砰-零-砰

最小时间能量综合控制

J =

∫ tf

t0

ρ+ |u(t)|dt 砰-零-砰

其中:ρ 为权重。

最优控制问题的数学提法

用极大值原理结合非线性规划来解决软着陆最小消耗问题,具有算法简单、原理可靠的特点,

但其只能使发动机推力 F 为常量,且由于末端时刻未定,导致迭代次数较大。此外,还需要猜测

无物理意义的协变量状态的初始值,这使系统很敏感。用“协状态-控制”变换可以从一定程度上减弱这种对初值的依赖性。为了避免上述缺点,下面引入参数化控制的方法,该方法是 K.L.Teo和 H.E.Jlee 等人提出,主要思想是用若干个分段常值函数逼近最优解。

http://www.ma-xy.com 247 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

(1) 设控制系统的运动遵从抽象微分方程

x = f(x(t), u(t), t) t ∈ J

其中:f ∈ [X ×U × J ;Y ];J 为 [0,∞) 中的某个连续闭子集,称为系统的时间域;X 为 Banach空间/拓扑线性空间,称为系统的相空间或状态空间;U 为拓扑空间,称为系统的控制域;t 为时间变量;x 为状态变量;u 为控制变量;x 的具体情况为状态轨线,是时间 t 的函数,其图形是

J ×X 中的点集;相空间 X 中确定的点集 {x(t)|t ∈ J} 称为系统的一条相轨线,与 t 无关。

(2) 控制函数 u 的限制。例如要求 u(·) 为简单函数、可测函数、连续函数、分段函数、分段可微等,即

{u} = U ⊂ [J ;U ]

(3) 端点条件。有 t0 =∫J, tf = sup J,对于某个给定的点集 M =M0 ×M1 ⊂ Y ×X

x(t0) ∈M0

x(tf ) ∈M1

当 M1 = X 时,称为终端自由;当 tf = sup J < ∞ 时,称终端时间 tf 固定。在许多控制问题

中,控制系统的状态空间 X 是某个广义函数空间或抽象的向量值函数空间。

假设一个控制系统的状态方程、控制域 U、控制函数类 U 以及约束条件均已给出,且相应的容许控制类 Uad = 0。记全体容许对所构成的集合为 Aad,任一映射 J ∈ [Asd;R] 称为该控制

系统的一个指标泛函。

对于给定的指标泛函 J,寻找适当的 (x, u)∗ ∈ Aad,使得

J(x, u)∗ = J∗ = inf{J(x, u)|(x, u)∗ ∈ Aad}

如果这样的容许对 (x, u)∗ 存在,则称该最优控制问题有解。(x, u)∗ 为最有对,u∗ 为最优控制,

x∗ 为最优轨线。

给出非线性标量型的最优化问题

J = ϕ0[x(tf |u)] +∫ tf

t0

L0[x(t|u), u(t), t]dt

s.t. gi(u) = ϕi[x(tf |u)] +∫ tf

t0

Li[x(t|u), u(t), t]dt ⩾ 0

其中:Qi, Li(i = 1, 2, . . . , N) 实值向量函数;f : [0, tf ] × Rns × Rnc → Rns;ϕi : Rns → R, i =

0, 1, . . . , N ,Li = [0, tf ]×Rnc ×Rnc → R, i = 0, 1, . . . , N。

∃k,∀(t, x, u) ∈ [0, tf ]×RNS × V,均有 |f(t, u, x)| ⩽ k(1 + |x|)。其中:V ∈ Rnc 是 Rnc中

任意紧致闭子集。泛函 f 和 Li, i = 0, 1, . . . , N,关于 x 和 u 的偏导数在 [t0, tf ] 内均为分段连续

函数。∀i, ϕi 对 x, u 是连续可微的。

参数化最优控制器设计。首先,选取一组满足 {tpk}np

k=0

t0 = tp0 < tp1 < tp2 < · · · < tpnp= tf

http://www.ma-xy.com 248 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

和一组参数 σpk, k = 1, 2, . . . , np,然后构造形如

up(t) =

np∑i=1

σpkχ[tpk−1,tpk)(t)

所示的参数化分段常数控制器。其中:

χ[tpk−1,tpk)(t) =

1 t ∈ [tpk−1, tpk)

0

令 σp = [σp1 , . . . , σpnp],将控制器带入系统方程可得

x(t) = f [x(t), t, σp]

= f

[x(t), t,

np∑i=1

σpkχ[tpk−1,tpk)(t)

]于是,最优控制问题变为寻找一组最优参数 σp,最小化指标泛函

J(σp) = ϕ0[x(tf |σp)] +∫ tf

t0

L0[x(t, σp), σp, t]dt

s.t.

gi(σ

p) = ϕi[x(tf |σp)] +∫ tf

t0

Li[x(t|σp), σp, t]dt ⩽ 0

Li[x, σp, t] = Li[· · · ]

i = 0, 1, 2, . . . , N

显然,对于每个给定的 p,这都是一个有限维的参数化问题,且当 p→∞ 时,最优解收敛。指标泛函和约束条件关于参数 σp 的梯度公式为

∂J

∂σp=

∫ tf

t0

∂H0[t, x, σp, λ0(σ

p)]

∂σpdt

∂gi∂σp

=

∫ tf

t0

∂Hi[t, x, σp, λi(σ

p)]

∂σpdt

其中:Hi[t, x, σp, λi(t|σp)] = Li[t, x, σ

p, λi(t|σp)]+λTf [t, x(t|σp), σp];λ = [λ1, . . . , λns]T;λi(t|σp) =

− ∂H∂x(t|σp)

边值条件:

λi(tf ) =∂ϕi[x(tf |σp)]∂x(tf |σp)

上面所提到的参数化控制器只将 σp 视为参数,tk 取定值,而 tk 取值不同会影响到参数控

制器的逼近程度。相关研究表明,在数值计算中,如果直接将其视为参数,则求解参数梯度时难

度很大,甚至不能求解,为此我们引入强化技术。

强化技术:从 s ∈ [0, 1] 到 t ∈ [t0, tf ],构建如下变换

t(s) =

δpk(s− ξ

pk−1) k = 1

k−1∑j=1

δpj (ξpj − ξ

pj−1) + δpk(s− ξ

pk−1) k = 2, 3, . . . , np

http://www.ma-xy.com 249 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

其中:δpk > 0,s ∈ [ξpk−1, ξpk],{ξ

pk}np

k=1 为 [0, 1] 区间上预先给定的分段点,且满足 0 = ξp0 < · · · <ξpk−1 < ξpk < · · · < ξpnp

= 1。

将上式两边对 s 求导,对不可导的点用左导数替代常规导数,有

dt(s)/ds = vp(s)

其中:vp(s) =np∑k=1

δpkχ[ξpk−1,ξpk](s);当 s ∈ [ξpk−1, ξ

pk) 时,χ[ξpk−1,ξ

pk)(s) = 1,否则为 0,即 χ 为特征

函数。不妨令

x(s) =

[x(t(s))

t(s)

]

u(s) =

[up(t(s))

vp(s)

]ξp = [ξp1 , . . . , ξ

pnp]

将其带入到 x(t) = f(t, x, σp),得到增广系统

dx(s)ds =

(vp(s) f(s, x(s) up(s))

vp(s)

)

其中:f(s, x(s), up(s)) = f(t(s), x(t(s)), up(t(s)))。系统的初始条件为:x(0) = x0, t(0) = 0。终

端条件为 t(1) = tf,则最优控制为

J(σp, rp) = ϕ0(x(1|σp, rp)) +∫ 1

0

L0(t(x), x(s|σp, rp), σp, rp)ds

s.t.

gi(σp, rp) = ϕi(x(1|σp, rp)) +

∫ 1

0

Li(t(s), x(s|σp, rp), σp, rp)ds ⩾ 0

Li(t(x), x(s|σp, rp), σp, rp) = vp(s|rp)Li(t(s), x(t(s)|σp), σp)

及边值条件。其中:ξpk 为时间分段点。指标泛函及约束函数关于 rp 求导有

∂J

∂rp=∂ϕ0(x(1|σp, rp))

∂rp+

∫ 1

0

∂H0(t(s), x(s|σp, rp), σp, rp, λ0(s|σp, rp))∂rp

ds

∂gi∂rp

=∂ϕi∂rp

+

∫ 1

0

∂Hi(−λi)∂rp

ds

其中:λi = [λit, . . . , λix]

Hi(t, x, σ, r, λi) = Li + λntvp + λixv

pf(t, x, σ, r)

协状态变量 λi(s|σp, rp), s ∈ [0, 1] 可由下列方程解的

d(λix(s))ds = −∂Hi(t, x, σ

p, rp, λi)

∂x

dλit(s)ds = − ∂Hi

∂t(s)

http://www.ma-xy.com 250 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

边值条件

λix(1) =∂ϕi(x(1|σp, rp))

∂x

λit(1) =∂ϕi(x(1|σp, rp))

∂t

约束变换技术:h(t, x, u) ⩾ 0 的约束条件是常见的,但我们要将其转化为规范标准形式,当

h(t, x, u) = 0 时

g(u) =

∫ tf

0

h(t, x, u)2dt = 0

当 h ⩾ 0 时,Teo 于 1993 年给出了一种约束变换技术

g(u) =

∫ tf

0

min{h(t, x, u), 0}dt = 0

然而,上式在 h = 0 处并不光滑,因此用下面方法去接近

g =

∫ tf

0

Lε(h)dt+ τ ⩾ 0

其中:

Lε(h) =

h h ⩾ ε

(h− ε)2/4ε −ε < h < ε

0 h ⩽ −ε

ε, τ > 0 是调节参数,当 ε 足够小或 τ(ε) > 0,使得 ∀τ, 0 < τ < τ(ε),能够令不等式达到满足要

求。

对原始问题引用约束变换技术,参数化控制器及强化技术,有

dr(s)ds = vp(s)v(s)

dv(s)ds = vp(s)

[F (s)

m(s)sin ψ(s)− G0M

r2(s)+ r(s)w2(s)

]dθ(s)ds = vp(s)w(s)

dw(s)ds = vp(s)

[− F (s)

m(s)r(s)cos ψ(s) + 2v(s)w(s)

r(s)

]dm(s)

ds = −vp(s) F (s)ve

dt(s)ds = vp(s)

http://www.ma-xy.com 251 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

初始条件为:r(0) = r0, v(0) = 0, θ(0) = 0, w(0) = w0, m(0) = m0, t(0) = 0。和控制器

u(s) =

F p(s) =

np∑i=1

σpF,iχ[ξpi−1,ξpi )(s)

ψp(s) =

np∑i=1

σpψ,iχ[ξpi−1,ξpi )(s)

vp(s) =

np∑i=1

δpi χ[ξpi−1,ξpi )(s)

取参数 {σpF,i}

np

i=1, {σpψ,i}

np

i=1, {δpi }np

i=1,使

min J = m(0)− m(1)

s.t.

r(1) = rf

v(1) = vf

w(1) = 0

g =

∫ tf

0

vpLε(r)dt+ τ > 0

Lε(r)

求解算法:

Step1. 给定分点个数 np,约束变换技术超参 ε, τ,选定区间 [0, 1] 区间的单调序列 {ξpk}np

k=1。

Step2. 任选一组参数 {σpF,i}np

i=1, {σpψ,i}

np

i=1, {σpi }np

k=1

Step3. 将参数带入系统,并求取指标函数关于参数的梯度。Step4. 利用经典的优化算法更新 {σpF,i}, {σ

pψ,i}, {σ

pi }。

Step5. 判断更新后的参数是否满足终端条件和不等式约束,同时,J 的值是否满足要求,不满足则返回 Step2.

10.2.2 模型假设

1. 假设月球是一个球体;

2. 假设只有月球对飞行器有影响;

3. 忽略月球自转;

4. 嫦娥三号软着陆轨道为过月球自转轴的平面;

10.2.3 符号说明

10.2.4 问题一的分析与求解

问题的分析

确定着陆准备轨道近月点和远月点的位置,以及嫦娥三号相应速度的大小与方向。

http://www.ma-xy.com 252 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

模型的建立与求解

为方便,我们假设月球是一个球体。飞行器 (嫦娥 3 号) 绕月飞行如图 (10.13) 所示

图 10.13: 绕月飞行轨道示意图

其中:vA 为近月点的速度,vB 为远月点速度,r 为月球半径,d1 为近月点到月面的距离,d2 为

远月点到月面的距离。

假设只有月球对飞行器有影响。下面,我们先来求近月点和远月点的速度 vA, vB。

(1) 机械能守恒定律。由于在绕月飞行阶段,飞行器不消耗燃料,故有机械能守恒:机械能= 动能 + 势能。势能可以是弹性势能/重力势能。只在重力做功的情况下,物体的动能和势能之间相互转换,但总和不变

EA =1

2mv2A −

GMm

rA

EB =1

2mv2B −

GMm

rB

其中:E 为机械能,M 为月球质量,m 为飞行器质量,G 为万有引力常量,rA = r+ d1 为近月

点到月心的。由机械能守恒,我们有

EA = EB (10.1)

(2) 开普勒第二定律。1609 年《新天文学》德国天文学家约翰尼斯. 开普勒指出:在相等时间内,太阳和绕太阳运行的行星的连线所扫过地面积是相等的。并且该定律适用于宇宙中一切绕

心的天体运动。单位时间内飞行器在近月点和远月点扫过的面积为

SA =1

2rAvA

SB =1

2rBvB

由开普勒第二定律,我们有

SA = SB (10.2)

http://www.ma-xy.com 253 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

我们要求两个参数 vA, vB,就需要两个方程,组合方程 (10.1) 和方程 (10.2) 有EA = EB

SA = SB

vA =

√2GMrB

rA(rA + rB)= 1692.7m/s

vB =

√2GMrA

rB(rA + rB)= 1614.4m/s

其中:M = 7350×1022kg,G = 6.672×10−11Nm2/kg2,rA = r+d1 = 1752013m,rB = r+d2 =

1837013m。

(3)开普勒第一定律。除了上面的这种方法之外,我们还可以寻找其他方程来求解速度 vA, vB。

下面,我们来介绍开普勒第一定律。开普勒在《宇宙和谐论》中表述:每一个行星都沿各自的椭

圆轨道环绕太阳,而太阳则处于椭圆的一个焦点上。如图 (10.14) 所示

图 10.14: 开普勒第一定律示意图

在图 (10.14) 中的近月点 A 和远月点 B 处,我们有

GMm

r2A= m

v2Ar

r =b2

a

b2 = a2 − c2

2a = ar0 + d1 + d2

GMm

r2B= m

v2Br

r =b2

a

b2 = a2 − c2

2a = ar0 + d1 + d2

其中:上面的等式用到了万有引力定律和牛顿第二定律以及椭圆的相关知识。下面我们来确定近

月点和远月点的位置。

忽略月球自转。根据该阶段所处的状态,可以大体估计出其需要的时间约为 410s 左右。由于嫦娥 3 号落点为 19.51◦W, 44.12◦N,根据假设,嫦娥三号软着陆轨道为过月球自转轴的平面,

且从南至北着陆,那么嫦娥三号的近月点的维度为 44.12◦ − 12.6397◦ = 31.4803◦,即嫦娥三号近

月点的经纬度为 (19.51◦W, 31.4803◦N)。根据对称性,远月点的经纬度为 (160.5◦E, 31.4803◦S)。

http://www.ma-xy.com 254 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

10.2.5 问题二的分析与求解

问题的分析

确定嫦娥三号的着陆轨道和在 6 个阶段的最优控制策略。

模型的建立与求解

(1) 主减速阶段主减速阶段是距离月面 15m到 3km,该阶段的主要任务是减速,在 3km处速度降到 57m/s。

我们给出下面 4 种方案来求解此问题。方案 1:2D 直角坐标系下的动力系统分析。以月心为坐标系原点,以月心指向近月点 (嫦

娥 3 制动的初始点) 方向为 y 轴方向,以垂直 oy 且指向娥 3 移动方向为 x 轴,建立平面直角坐

标系 xoy 如图 (10.15) 所示

图 10.15: 嫦娥 3 号软着陆平面直角坐标系

以 t 时刻为研究点进行受力分析,娥 3 主要受月球引力 G 和主发动机制动力 F 的影响,由

图 (10.15) 中的受力分析可知

G = gm

=G0M

r2m

=G0M

x2 + y2m

且有 α = arctan xy。其中:G0 = 6.672× 10−1N 为万有引力常量,M = 7.350× 1022kg 为月球质

量,m 为娥 3 的质量,且由于着陆过程中娥 3 消耗燃料制动,所以各时刻的娥 3 质量不同,记为 mt,x, y 为坐标点、r 为月心距皆为时变量。

将娥 3 整体视为系统,我们主要关注系统在 t 时刻的系统变量:xt, yt,mt, Ft, θt, vt。为了便

于理解,不妨将时间离散化,研究系统下一时刻 (t + 1 时刻) 的系统值。如果我们已经知道了 t

http://www.ma-xy.com 255 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

时刻的系统值,那么 t+ 1 时刻的系统值为

xt+1 = xt + (vx,t+1 − vx,t)(t+ 1− t)

yt+1 = yt + (vy,t+1 − vy,t)(t+ 1− t)

vx,t+1 = vx,t + ax,t(t+ 1− t)

vy,t+1 = vy,t − ay,t(t+ 1− t)

ax,t =Ft sin θt +Gt sinαt

mt

ay,t =−Ft cos θt +Gt cosαt

mt

mt+1 = mt −Ftve

αt = arctan xtyt

例如:我们给出初始值 x0, y0, v0,m0 及 F0, θ0(待求变量),即可得到系统下一时刻的状态值xt, yt, vt,mt。不妨将上面的离散状态更新公式写为连续时间 t,有

x =dxdt = vx,t

y =dydt = vy,t

vx =dvxdt = ax,t

vy =dvydt = ay,t

ax,t =Ft sin θt +Gt sinαt

mt

ay,t =−Ft cos θt +Gt cosαt

mt

m =dmdt = −Ft

ve

αt = arctan xtyt

http://www.ma-xy.com 256 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

由于速度是距离的导数,加速度是速度的导数,故上述系统方程可写为

x =d2x

dt2 = ax,t

y =d2y

dt2 = ay,t

ax,t =Ft sin θt +Gt sinαt

mt

ay,t =−Ft cos θt +Gt cosαt

mt

αt = arctan xtyt

m =dmdt = −Ft

ve

最优化控制问题:从连续时间 t 来看,我们需要给出推理 Ft 和夹角 θt 的函数,使系统满足

初始条件 (x0, y0, v0) 和终端条件 (xt, yt, vt),并且使 t 时间消耗的能量最少;从离散时间 t 来看,

我们需要给出每时刻 t 的 Ft, θt,使系统满足初始条件 (x0, y0, v0) 和终端条件 (xt, yt, vt),并且使

t 时间消耗的能量最少。上述内容可以写为如下数学模型 (为和一般文献相吻合,定义 0 时刻为t0,终止时刻为 tf )

minF,θ

J =

∫ tf

t0

mdt = m0 −m(tf )

s.t.

x(t0) = x0, y(t0) = y0, vx(t0) = vx,0, vy(t0) = vy0 , m(t0) = m0

x =d2x

dt2 = ax,t

y =d2y

dt2 = ay,t

ax,t =Ft sin θt +Gt sinαt

mt

ay,t =−Ft cos θt +Gt cosαt

mt

αt = arctan xtyt

m =dmdt = −Ft

ve

x(tf ) = xf , y(tf ) = yf , vx(tf ) = vx,f , vy(tf ) = vy,f

上述优化控制的可行性:如果是在连续时间 t 上讨论上述问题,则优化控制室一个 Ft, θt 的

泛函问题,解 Ft, θt 是无穷维的,很难求解,所以我们一般将时间 t 离散化处理。如果给定初始

状态 x0, y0, v0,m0,给定一个解 {Ft}tft=t0 , {θt}

tft=t0(不妨将解何为 u = [Ft, θt]

T, {ut}tft=t0),根据状

态更新公式 (即约束条件 s.t.),我们可以求解 t 时刻的系统状态 {xt, yt, vt,mt}。并且要求在终端tf 时刻,系统状态满足要求 (xf , yf , vf )。如果有 {ut} 使系统达到要求 (s.t.),我们即可得到最终的目标值 J = m0 −mf。

定义满足 s.t. 的解 {ut} 为可行解,其取值域为可行域 Φ,故而我们可以在可行域 Φ 中找到

{ut}∗,使得 J 最小。上面遗留的问题是:如何求解 {yt}∗。

http://www.ma-xy.com 257 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

方案 2:2D 极坐标系下的动力系统分析。在上面的直角坐标系的处理中,我们需要使 x, y

满足 tf 时刻的月心距要求

rf =√x2f + y2f

并且,要将速度 v 在各时刻 t 上分解为 vx, vy。这样做虽然理解起来简单,但无疑饶了圈子,我

们不妨在极坐标下对系统进行动力学分析,因为在极坐标下,r 即为 r,v 与 r 方向垂直。构建

2D 极坐标系如图 (10.16) 所示

图 10.16: 嫦娥 3 号软着陆平面极坐标系

我们仍然假设¬不考虑其它天体对娥 3 的摄动;­下降轨道与经纬线重合。我们所关心的系

统变量为 (r, θ, v, w,m, F, φ),其中:F,φ 为系统控制变量;(r, v, θ, w,m) 为系统状态变量。

由运动分析,我们有

r =drdt = v

θ =dθdt = w

在切向上进行受力分析,飞行器受 F cosφ 及科里奥利力 的影响

F cosφ+ 2vw = −mdvydt

其中:vy = wr。故有

w =dwdt = −1

r(F

mcosφ+ 2vw)

在径向 r 上进行受力分析 GMm

r2=mv2

r

F sinφ = mdvdt

其中:v = wr。故有

v =dvdt =

F

msinφ− GM

r2+ rw2

http://www.ma-xy.com 258 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

由上述分析,我们得到娥 3 质心的运动方程为

r =drdt = v

v =F

msinφ− GM

r2+ rw2

θ =dθdt = w

w = −1

r(F

mcosφ+ 2vw)

m = −Fve

其中:v ∈ R 是娥 3 在矢径 r 方向上的速度;w ∈ R 是娥 3 在角 θ 上的角速度;m ∈ R+ 是娥 3质量;G0 为万有引力常量;M 为月球质量;ve 为比冲。

设解为 ut = [Ft, φt]T,离散化后可写为 {ut}

tft=t0,最优控制是寻找最优控制率 u∗t,使着陆过

程消耗的燃料最小,并且满足初始条件和终端条件,即

minu=F,φ

J =

∫ tf

t0

mdt = m0 −m(tf ) = m0 −mf

s.t.

r(t0) = r0, v(t0) = v0, θ(t0) = θ0, w(t0) = w0, m(t0) = m0

r =drdt = v

v =F

msinφ− GM

r2+ rw2

θ =dθdt = w

w = −1

r(F

mcosφ+ 2vw)

m = −Fve

r(tf ) = rf , v(tf ) = vf , w(tf ) = wf

至此,主减速阶段的数学模型已经建立完毕。下面我们来讨论如何求解 {ut}∗。在此之前,先引入科里奥利力,然后再介绍求解 {ut}∗ 的直接法和间接法。科里奥利力:哥氏力又称科里奥利力,简称科氏力,是哥氏加速度的来源。哥氏加速度是由

于质点不仅作圆周运动,还做径向运动或轴向运动所产生的。当质量为 m 的质点相对于转动参

考系 (月球,角速度矢量 w) 的速度为 v 时,在转动参考系内观察到科里奥利力为

Fc = 2mvw

科里奥利力只有在转动参考系中运动时才发生,科氏力方向垂直相对速度,不会改变相对速度大

小。

科里奥利力的简单推导:如图 (10.17) 所示

http://www.ma-xy.com 259 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

图 10.17: 科里奥利力示意图

质点 m 在转动参考系 S′ 中沿一光滑凹槽运动,速度为 v′,在惯性地面 S 中

F = m(v2 + rw)2

r= m

v2

r+ 2mv′w +mrw2

在非惯性系圆盘 S′ 中,向心加速度为

a′ =v′2

r

w 的方向垂直 v 向上。

最优控制 u∗t 通常有 2 种方法:1. 直接法;2. 间接法。直接法是将 u∗t 离散化、参数化后进

行求解;间接法是在最优控制理论 (变分/极大值原理/动态规划) 的基础上,将优控问题变化为终端 tf 自由的两点边值问题,然后求解。

最优控制 u∗t 的直接法:由于月球软着陆的轨道优化的搜索空间是一个 ut ∈ {ut} = R 函数

空间 (泛函空间),而我们通常处理的最优化问题的搜索空间是一个 θ ∈ Θ 空间 (参数空间)。所以我们无法用最优化数值方法直接得到轨道,这使得我们不得不另寻它法。既然我们需要参数函

数,不妨将 {ut} 设为参数函数,设

{ut|ut = u(t|θ), θ ∈ R+}

例如:我们可以设 ut 为参数多项式、傅里叶多项式等各种含参函数形式

ut =1

a+ et

ut =n∑t=0

aiti

这样,我们不再是在函数空间 R 中寻找一个函数 u∗t 使 J 最优,而是在参数空间 Θ 中寻找一个

参数 θ,进而有 u∗t 使 J 最优。一般文献中都使用含参多项式的形式作为 ut 的替代,我们下面也

采用这种形式。设 ut 是一高 n 次多项式

ut =n∑i=0

aiti

其中:{ai}ni=0 = θ ∈ Θ,共引入 n+ 1 个参数。

http://www.ma-xy.com 260 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

在引入 ut 之后,再要考虑的是:将 ut 以连续函数的形式带入到动力方程当中进行求解,还

是将时间 t 离散化逐点求解。我们先考虑将时间 t 离散化处理,将 [t0, tf ] 离散化为 N 段,由于

tf 不定,设

ti = t0 +i

N(tf − t0)

其中:N 为时间段,时间段 [ti, ti+1], i = 1, 2, . . . , N 的两端称为节点。这样,我们就有 i段 [ti−1, ti]

对应的 [uti−1, uti ]({ai} 给定后,ut 对应具体数值),进而可以得到 [xti−1

, xti ],进而得到 xtf 以及

J。我们求最优 {a}, tf 使 J 最优。

上述方法可以用智能算法 GA等进行求解,当然,其它优化算法 BFGS等亦可。而且注意到,当 Ft 为固定值时,目标变为 min J = tf。在具体求解过程中,我们需要给出参数的初始值/估计值/迭代出发点。tf 的估计还简单一些 (可以自行建模估计),但到了 {ai} 却没有实际的物理意义,这使得他们的估计量是“天马行空”的。如果系统 xt 对参数 {ai}是及其敏感的,那么,{ai}初始估计将成为问题所在。

问:如何解决 {ai} 初始估计无依据 (无物理意义)?缺:未讨论 t 不离散的情况。

插值-分段三次埃米尔特 Hermite-Simpsorn。上面,我们将时间 t 离散后,设 ut 为多项式,

那么,我们能不能假设 xt 是多项式。承继上面的时间离散化,设 hi = ti − ti−1, i = 1, 2, . . . , N,

我们并不打算在 [t0, tf ] 内设 xt = f(t),而是在某一小时间段 [ti−1, ti] 进行设置,设

x = a0 + a1t+ a2t2a3t

3 = f(t|θ)

其中:t ∈ [ti−1, ti],a 承继上面为参数 θ。

也就是说,x 在 [ti−1, ti] 内皆是三次多项式,但不同时段的参数 θ 的取值不同,即 x 为分段

三次多项式。不失为一般性,我们在时段 [t0, t1] 内研究 x。

x = a0 + a1t+ a2t2a3t

3 (10.3)

t ∈ [t0, t1]

假设我们知道了以下条件

x(t0) = x0

x(t1) = x1

x′(t0) = x′0 = f(xt0)

x′(t1) = x′1 = f(xt1) (10.4)

其中:x = f(xt, ut, t)。当 x0 给定后,只要有 u0 即有 x′0。那么,我们就可以在 [t0, t1] 区间内对

函数 x(t) 进行插值,例如用三次 Hermite 多项式插值 ([t0, tf ] 段上即为分段三次 Hermite 多项式插值)。注:关于插值的数值分析技术,可以参考《数值分析》李乃成 P127.

http://www.ma-xy.com 261 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

式 (10.3) 有四个参数待求,而我们有 4 个已知条件 (10.4),我们可以利用解方程组的形式求解参数 ai

x1

x1

x2

x2

=

1 0 0 0

0 1 0 0

1 1 1 1

0 1 2 3

a0

a1

a2

a3

解上述方程组即可得到 {ai}3i=0,将 ai 带入到 H 三次多项式有

H3(t) = x(t) =

(1 + 2

t0 − tt0 − t1

)(t− t1t0 − t1

)2

+

(1 + 2

t1 − tt1 − t0

)(t− t0t1 − t0

)2

x(t1)

+ (t− t0)(t− t1t0 − t1

)2

x′(t0) + (t− t1)(t− t0t1 − t0

)2

x′(t1)

其中:t1 − t0 = h1,x = f(x, u, t)。

这样,我们就得到了 [t0, t1] 区间内 x(t) 的 Hermite 插值估计 H3(t)。但是,由于我们需要

求解 x0, x1, u0, u1,每给一组 (x0, x1, u0, u1),都会有一个 H3(t) 与之对应,x0, x1, u0, u1 取不同

值时的 H3(t) 示意图如图 (10.18) 所示

图 10.18: x-0 等取不同值时的 H-3 示意图

既然有这么多 H3(t),那么我们需要约束 H3(t),不能让其乱跑。我们用条件 x = f(x, u, t)

来进行约束。任给 t ∈ [t0, t1],u(t) 给定后,如果知道 x(t),则 x(t) 是知道的,H3(t),H′3(t) 是

已知的。我们可以在 [t0, t1] 内取 k 个点 {tk},要求这 k 个点的 H ′3(t) 和 x(t) = f(H3(t), u(t), t)

相等或者近似 (配点)。为计算简单,这里 k = 1,置 tk =t0+t1

2(当 k 越大点数越多时,计算越精

确,但计算量会相应变大)

H3(tk) =x0 + x1

2+h18(f0 − f1)

H ′3(tk) = −

3(x0 − x1)2h1

− f0 − f14

其中:x0 = f(x0, u0, t0) = f0,x1 = f(x1, u1, t1) = f1。

在给出 uk 后,要求 H ′3(tk) = x(tk),这里我们两种方案。方案 (1),我们利用 H3(tk) 直接

替代 x(tk),有

H ′3(tk) = x(tk) = f(H3(tk), u(tk), tk)

方案 (2),三阶 Simpson 方法然后再用 H3(tk) 直接替代 x(tk),区间 [a, b] 上的三阶 Simpson 求积公式如下

Si =b− a6

[f(a) + 4f(a+ b

4) + f(b)]

http://www.ma-xy.com 262 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

结合上面的三阶 Simpson 求积公式,我们有

xi+1 = xi +hi6[f(xi, ui, t) + 4f(H3(tk), u(tk), tk) + f(xi+1, ui+1, ti+1)]

x1 = x0 +h16[f(x0, u0, t0) + 4f(H3(tk), u(tk), tk) + f(x1, u1, t1)]

注:x 为 f(t),H0 = x0 = x(0),H1 = x1 = x(1) 一定是高度重合的。

经过上面的分析,在 [t0, t1] 时段内的处理我们已经基本完成,很容易将上述结论推广到 N

段。在 [t0, t1] 段内,我们假设已知 (x0, x1, x0, x1, utk),故这样变为我们需要求解的优化变量,由

于 x 与 u 有关,故我们需要求解的优化变量为

z = [xT0 , u

Tc0, u

T0 , x

T1 , u

Tc1, u

T1 , . . . , x

TN , u

TcN , u

TN ]

其中:uTci 即为第 [ti−1, ti] 段内的配点 tk 的控制量。

这种方法将最优控制问题离散化、参数化后,转化为非线性规划问题,如下

minz

J =

∫ tf

t0

mdt = −m(tf )

s.t.

r(0) = r0, v(0) = v0, θ(0) = 0, w(0) = w0, m(0) = m0

umin ⩽ u ⩽ umax

x = f(x, u, t)

r(tf ) = rf , v(tf ) = vf , w(tf ) = 0

上述 s.t. 并不易于书写,我们来捋一下:¬首先,哪些是待优化变量?

z = [xT0 , u

Tc0, u

T0 , x

T1 , u

Tc1, u

T1 , . . . , x

TN , u

TcN , u

TN ]

将 [t0, tf ] 等分为 N = 20 段,共 21 个节点。各节点上有 5 个状态变量 x,2 个控制变量 u。20段中的中间配点有 2 个 u(k = 1),故待优化变量个数为

(N + 1)(nx + nu) +N(nu)

其中:nx 为 x 变量个数;nu 为 u 变量个数,N 为段数。­等式约束。上面的优化模型中的等式

约束是

初始条件 + 终端条件+ (Nnx)的 HS 等式约束

®不等式约束为

umin ⩽ (N + 1)nu ⩽ umax

umin ⩽ (N)nu ⩽ umax

承继上面的想法,能否直接给出 (xi, xi+1, ui, ui+1),并设置一定的等式条件。文[?] 利用 4 阶

R-K(Runge-Kutta)法实现了直接法。这里我们给出 R-K公式 (可以参考[?]P273、[?]P9、[?]P141),

http://www.ma-xy.com 263 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

考虑如下一阶常微分初值问题 y′(x) = f(x, y(x))

y(a) = y0

上述问题的 4 阶 R-K 计算公式为

yi+1 = yi +1

6(K1 + 2K2 + 2K3 +K4)

K1 = hf(xi, yi)

K2 = hf(xi +1

2h, yi +

1

2K1)

K3 = hf(xi +1

2h, yi +

1

2K2)

K4 = hf(xi + h, yi +K3)

其中:h 为 x 的步长。改进的 4 阶 R-K 公式为

yi+1 = yi +1

6(K1 + 4K3 +K4)

K1 = hf(xi, yi)

K2 = hf(xi +1

2h, yi +

1

2K1)

K3 = hf(xi +1

2h, yi +

1

4K1 +

1

4K2)

K4 = hf(xi + h, yi −K2 − 2K3)

以及

yi+1 = yi +1

8(K1 + 3K2 + 3K3 +K4)

K1 = hf(xi, yi)

K2 = hf(xi +1

3h, yi +

1

3K1)

K3 = hf(xi +2

3h, yi −

1

3K1 +K2)

K4 = hf(xi + h, yi +K1 −K2 +K3)

承继上面的 [t0, tf ] 离散化方法,并且有系统状态方程

x = f(x, u, t)

在区间 [ti1 , ti], i = 1, 2, . . . , N(tN = tf ),假设我们有 (xi−1, ui−1, xi, ui),那么由 4 阶 R-K,我们有 xi−1, xi 的计算公式

xi = xi−1 +1

6(K1 + 2K2 + 2K2 +K4)

http://www.ma-xy.com 264 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

其中:

K1 = hkf(xk, uk, tk)

K2 = hkf(xi +1

2K1, λk+1, t)

K3 = hkf(xi +1

2K2, λk+1, t)

K4 = hkf(xi +K3, λk+1, tk+1)

hk = tk+1 − tk, hi−1 = ti − ti−1, i = 1, 2, . . . , N

t =1

2(tk + tk+1)

λk+1 = λ(t)

经过上述离散化处理后,原优化控制问题变为非线性规划问题,其优化变量为

z = [x0, u0, x1, u1, . . . , xN , uN ]T

上面两种方法都将最优控制问题处理为含约束的非线性规划问题,处理非线性规划问题的方

法有很多,可以参考前面相应的章节。非线性规划的处理方法一般有:1. 可行方向法;2. 罚函数法 (内点法);3. 梯度投影法;4. 逐步二次规划 SQP。而 MATLAB 主要采用 SQP 方法。

最优控制 u∗t 的间接法:跋山涉水,终于到了最优控制 u∗t 的间接解法 (后面,我们还会建立软着陆的 3D 动力系统)。前面,我们花了很大篇幅来讨论系统 x = f(x, u, t),泛函 J(xt, ut, t)。

泛函极值存在条件是欧拉方程、最优控制中的控制量 ut 无约束时的变分法、控制量 ut 有约束时

的 P 极大值原理及动态规划。下面,我们就要用这些理论来分析娥 3 轨道的优化问题。我们可以看出,娥 3 轨道最优控制问题是一个控制量 u = (F,φ) 有约束且约束 tf 自由、

x(tf ) 有约束的最优控制问题,因此,我们可以用 P 极大值原理或动态规划进行求解。下面,我们将用 P 极大值原理求解最优控制 u∗ = (F,φ)∗,利用 P 极大值原理求解最优控制律 u∗t,从而

将问题转化为两点边值问题,当然也可以进行离散化求解。

1962.Kriegsman 和 Reiss 利用变分法求解最优控制律 ut。2000 年王大秩等利用 Pontryagin极大值原理求解 ut,将问题转变为两点边值问题,并用一种初值猜测的打靶算法进行求解。2004年,单永正等利用 Pontryagin 极大值原理,将问题转化为两点边值问题,并将两点边值问题转化为非线性规划问题进行求解。2004 年,赵松吉等利用初值猜测技术和线性摄动求解两点边值问题。

下面,我们用 Pontryagin 极大值原理求解最优控制律 ut = (Ft, φt)T。记

f(x, u, t) =

f1 = v

f2 =F

msinφ− G0M

r2+ rw2

f3 = w

f4 = −1

r(F

mcosφ+ 2vw)

f5 = −F

ve

http://www.ma-xy.com 265 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

于是动力系统方程可以写为

x = f(x, u, t) = f(x(t), u(t), t)

(1) 引入拉格朗日乘子/共轭变量 λ = [λr, λv, λθ, λw, λm]T,构建 H(哈密顿函数)

H(x, λ, u, t) = λTf(x, u, t)

= λrf1 + λvf2 + λθf3 + λwf4 + λmf5

=F

mr

(rλv sinφ− λw cosφ− λm

vemr

)+H2

= H1(F,φ) +H2

其中:H2 表示与控制变量 F,φ 无关部分。由 P 极大值原理,有 maxH ≜ maxH1。

(2) 写正则方程,有

λ = −∂H∂x

(= 0)

x = −∂H∂λ

(= 0) = f(x, u, t)

推得

λr = −2λvG0M

r3− λvw2 − λwF cosφ

mr2− 2λwvw

λv =2wλwr− λr

λθ = 0

λw =2vλwr− λθ − 2rwλv

λm =λvF sinφ

m2− λwF cosφ

rm2

(3) 写控制方程,有

u =∂H

∂u(= 0)

(4) 终端约束

G =

r(tf ) = rf

v(tf ) = vf

w(tf ) = wf

= 0

(5) 横截条件

λ(tf ) =

[∂J

∂x+∂G

∂xr

]t=tf

其中:r 为拉格朗日乘子。

http://www.ma-xy.com 266 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

(6) 控制律约束

Fmin ⩽ Fi ⩽ Fmax

φmin ⩽ φi ⩽ φmax

由于求 u 上的极值,令控制方程等于 0

u =∂H

∂u= 0

有 φ,F 的最优控制律

φ∗ = − arctan(λvr

λw

)

F ∗ =

Fmax s(t) > 0

0 s(t) < 0

其中:s(t) = λv sinφm− λw cosφ

mr− λm

ve。

在求解最优控制律 u∗t 后,要求 x∗, λ∗ 使 H 最大。将 u∗t 带入正则方程当中,利用初始条件

和终端条件对正则方程积分,即可求出最优 x∗, λ∗,此时,问题转化为微分方程中的两点边值问

题。

简单分析一下,在离散化下考虑,在 x(t0) 已知的情况下,给定一个初始值 λ(t0),我们会得

到相应的最优控制律 u(t0)∗,进而由 x = f 得到 x(t1)。依次迭代,可以得到终端 x(tf ) = xf (在

给定初始 tf 后)。进一步观察 λm 的取值,对 λ/m 及 x 没有影响,因此,只要先选取迭代初始值

[λr, λv, λw]t=t0,确定 ut0,再给出已知 x(t0) = x0。在正则方程上积分,即可得到末端状态 x(tf ),

即 x(tf ) 是初值 [λr, λv, λw]t=t0, tf 的函数,进而性能 J 也是是 (λr(t0), λv(t0), λw(t0), tf ) 的函

数。这样,两点边值问题就被离散化为非线性规划 (只有等式约束)。迭代初始值 tf 可以根据一定的公式进行估计,文

[?] 给出估计

tf =∆m

|m|=

∆m

F/ve

=m0[1− exp(−∆v/veg)]

F/ve

=m0[1− exp(−

√r20 + 2gh/veg)]

F/ve

其中:|m| 为发动机燃料秒耗量。但是迭代初始值 (λr(t0), λv(t0), λw(t0), tf ) 的选取则没有那么多依据,我们只能凭空设置。

如果正则方程对初始值仍然敏感,那么 (λr(t0), λv(t0), λw(t0)) 将成为问题的所在。下面的“伴

随-控制”变换可以解决这一问题。设

λv(t0)r0 = sin(φ0)

λw(t0) = − cos(φ0)

http://www.ma-xy.com 267 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

将 tanφ = −λvrλw对 t 求导,有

φ

cos2 φ = −

[λvr

λw+λvr

λw− λvrλw

λ2w

](10.5)

将正则方程和 λ0v, λw(t0) 带入式 (10.5),有

λr =φ

λwr+

2λww

r− λvv

r+

2λvrw

λw

于是有

λr(t0) =λ

λw(t0)r0+

2λw(t0)w0

r0− λv(t0)v0

r0+

2λv(t0)r0w0

λw(t0)

这样,(λr(t0), λv(t0), λw(t0)) 就可以用 φ0, φ0 替代,可以取合理的初始值了。

引:两点边值问题的数值解。考虑下面一个简单的二阶常微分方程的两点边值问题

y′′(x) = f(x, y, y′)

y(a) = ya

y(b) = yb

a < x < b

前面我们讨论了常微的初值问题,我们能不能在初值问题的基础上求解边值问题?能,但对于二

阶常微的初值 y(a) = ∆1, y′(a) = ∆2,我们还不足以求解边值问题,我们缺少一个条件。那我们

就设一个条件好了,我们设 y′(z)−m,并舍去 y(b) = y)b,有y′′(x) = f(x, y, y′)

y(a) = ya

y′′(a) = m

数值求解上述两点边值问题。一个正常的思路是,我们不断调整 m,使 y(b) = yb,如图

(10.19) 所示

图 10.19: 两点边值问题的打靶方法

两点边值问题的打靶方法算法伪代码如 (1) 所示

http://www.ma-xy.com 268 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

算法 1 2 点边值打靶法 ode1: 初始化:m,ε,tmax,i := 0。

2: while t = 1, 2, . . . , tmax do3: // 解初值问题

y′′(x) = f(x, y, y′)

y(a) = ya

y′′(a) = mi

4: βi = y(b)。

5: if |βi − β| > ε then6: 修正 mi+1。

7: end if8: end while

上述伪代码中遗留的问题是:如何修正 m。理想的 m 是 y(b,m) = yb,但在数值求解过程

中,不存在解析表达式,并不易解。一种可行的方式是取

m2 =ybyb1

m1

此后,由非线性方程求根的割线法更新 mi

mi = mi−1 −y(b,mi−1)− yb

y(b,mi−1)− y(b,mi−2)(mi−1 −mi−2) i = 3, 4, . . .

Matlab 中的 ode45 用于求解初值问题,bvp4c 用于求解边值问题。注:由于状态变量的量级差异大,在轨道积分过程中会导致有效位数的损失,归一化处理可以克服这一缺点。在一般论

文中皆有归一化说明,这里就不做叙述了。

方案 3:3D 球面坐标系下的动力系统分析。很明显的一个问题是:我们用上面的方案 1 或者方案 2 中的 2D 动力学模型只能做某一方向上的平移,而不能做平面上的移动。而题中既然给了空间上的数字高程图,那我们就有必要在 3 维空间中建立着陆轨道。当然,我们可以在未拍照之前的主减速阶段和快速调整阶段建立 2D 模型,在拍照之后建立 3D 模型,但这无疑增加了复杂性。幸运的是,3D 模型的建立和求解与 2D 模型是相似的。如前面 2D 分析的那样,我们要考虑的问题是:1. 在直角坐标系下建模还是在球面坐标系下

建模;2. 是否考虑月球自转;3. 用直接法还是间接法求解最优控制问题。3D 球面坐标系下的动力学模型如图 (10.20) 所示

http://www.ma-xy.com 269 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

图 10.20: 3D 球面坐标系下的动力学模型

假设:1.忽略月球自转;2.月球引力场为均匀引力场,g 为常值;3.不考虑其他星体对娥 3的摄动。以月心 o1 为坐标原点,

−−→o1x1 指向近月点 (娥 3 下降点),−−→o1y1 指向娥 3 着陆方向,−−→o1z1 按右手法则确定,建立月心惯性坐标系 o1x1y1z1。o0o1 为娥 3到月心的距离 r,α 为 o0o1 在 y1o1z1

面投影与 −−→o1y1 正方向夹角,β 为 o0o1 与−−→o1x1 正方向夹角,由此有球面坐标系 (r, α, β)。

此外,我们还需要确定推力 F 的方向。以娥 3 质心 o0 为原点,−−→o0x0 为背月心 −−→o1o0 延长线,

−−→o0y0 指向娥 3 运行方向,−−→o0z0 由右手法则确定。建立着陆轨道坐标系 o0x0y0z0,ψ,φ 为推力 F

的方向角,形成球面坐标系 (F, ψ, φ)。

在上面的假设下,月球软着陆的动力学方程可以表示为

¨a = ¨r =F

m− r

r3G0M

其中:¨r 是娥 3 的加速度矢量,F 为发动机动力矢量,r 为娥 3 的位移矢量,G0 为万有引力常

量,M 为月球质量。不妨令 G0M = µ(常量)。将位移矢量 r 按 o0x0y0z0 方向轴分解为 rx, ry, rz;将 r 按 o1x1y1z1 方向轴分解为 r′x, r

′y, r

′z。

通过 o0x0y0z0 我们可以看到,o0x0y0z0 沿 o0x0 轴逆方向转动 (90− α)◦,然后沿 o0y0 轴逆时针

转动 β,最后沿 o0z0 轴顺时针转动 (90 − α)◦ 即可与 01x1y1z1 归正。因此,从着陆轨道坐标系

o0x0y0z0 转到月心惯性坐标系 o1x1y1z1 的转动矩阵 I 为

I =

cosα cosβ sinβ − sinα cosβ− cosα sinβ cosβ sinα sinβ

sinα 0 cosα

即 [r′x, r

′y, r

′z]

T = I[rx, ry, rz]T。

http://www.ma-xy.com 270 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

对娥 3质心 o0 沿 o1x1y1z1 各方向轴进行受力分析,用 az, ay, az 表示各方向轴的加速度,有

r − α2r sin2 β − β2r = ax

2βr + βr − α2r cosβ sinβ = ay

2αr sinβ + αr sinβ + 2αβr cosβ = az

ax =F cosψm

− µ

r2

ay =F sinψ cosφ

m

az =F sinψ sinφ

m

m = −Fve

用 vx, vy, vz 表示速度 v 在 o1x1y1z1 各方向轴的分量,化简上述方程,有

r = vx

β =vyr

α =vz

r sinβ

vx =F cosψm

− µ

r2+v2y + v2z

r

vy =F sinψ cosφ

m− vxvy

r+

v2zr tanβ

vz =F sinψ sinφ

m− vxvy

r− vyvzr tanβ

m = −Fve

其中:µ = G0 为常量,ve 为发动机比冲常量。由此,我们得到了 3D 球面坐标系下的轨道运动方程 (系统)。方案 4:3D 直角坐标系下的动力系统分析。在直角坐标系下对系统进行受力分析是简单的。

设 vx, vy, vz 沿用上面的设置,则有

x = vx

y = vy

z = vz

设 v′x, v′y, v

′z 为速度 v 在 o0x0y0z0 各方向轴分量,则有

v′x =F cosψm

− µ

r2

v′y =F sinψ cosφ

m

v′z =F sinψ sinφ

m

http://www.ma-xy.com 271 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

同时,由坐标转换有

[vx, vy, vz] = I[v′x, v′y, v

′z]

于是,3D 直角坐标系下的动力方程 (系统) 为

x = vx

y = vy

z = vz

v′x =F cosψm

− µ

r2

v′y =F sinψ cosφ

m

v′z =F sinψ sinφ

m

[vx, vy, vz] = I[v′x, v′y, v

′z]

m = −Fve

文献[?] 建立了 3D 直角坐标系且考虑了月球自转的着陆动力系统。在上面不考虑月球自转的前提下,我们建立了软着陆的 3D 直角坐标系和球面坐标系下的动力系统。下面,我们给出此动力系统的最优控制模型。

设 x = [r, β, α, vx, vy, vz,m]T 为系统的状态变量,u = [F, ψ, φ] 为系统的控制变量,设 x =

f(x, u, t) 为系统的状态方程,其中 f 为标量函数。我们的目标是控制 u,使系统消耗燃料最少,

故娥 3 的最优控制模型为

minu

J =

∫ tf

t0

mdt = m0 −mf

s.t.

r(t0) = r0, β(t0) = β0, α(t0) = α0,

vx(t0) = vx0, vy(t0) = vy0, vz(t0) = vz0, m(t0) = m0

x = f(x, u, t)

r(tf ) = rf , β(tf ) = βf , α(tf ) = αf , vx(tf ) = vxf , vy(tf ) = vyf , vz(tf ) = vzf

Fmin ⩽ F < Fmax

φmin ⩽ φ ⩽ φmax

ψmin ⩽ ψ ⩽ ψmax

其中:J 为积分型指标泛函。

上述最优控制问题是一个终端给定、tf 不定、系统状态含约束、控制函数 u 含约束的积分

型最优控制问题。像分析 2D 最优控制那样,其解法可分为直接法和间接法。(1) 直接法:我们可以将 [t0, tf ] 离散化后,将泛函最优控制问题转化为参数最优化问题进行求解。(2) 间接法:利用P 极大值原理,将最优控制问题转化为两点边值问题,继而可以用打靶算法和离散化参数化优化

http://www.ma-xy.com 272 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

算法进行求解。哈工大. 张仲满 2009.6 硕士论文中提到用 PID 自适应网络求解上述最优控制问题,同时讨论了 P 极大值原理 + 殆尽的打靶算法在该问题中的应用;哈工大. 单永正.2009.7 博士论文中提到用参数化技术 + 约束变换额方法来参数化求解最优控制问题,文中给出了相应的理论与算法,并用 miser3.2 最优控制软件进行求解;哈工大. 张锋.2009.6 硕士论文中分析了姿态发动机的姿态控制,并用 Lyapunov 分析系统稳定性,提出在软着陆末端进行姿态发动机和主减速发动机联合控制策略;关于模糊、灰色、随机系统的最优控制问题可以参考葛宝明, 林飞《先进控制理论》。由于 3D 动力系统的求解和 2D 系统相似,这里,我们不再继续 3D 求解工作。

(2) 快速调整阶段(3) 粗避障阶段在减速阶段和快速调整阶段之后,娥 3 进入粗避障和精避障阶段。粗避障阶段的范围是月面

2.4km 到 100m 区间,其主要目的是避开大的陨石坑,实现在设计着陆点上方 100m 处悬停,并初步确定落月地点。嫦娥 3 号在月面 2.4km 时,对正下方 2300× 2300m 的范围进行拍照,获得

数字高程地图如图 (10.7)。下面,我们将利用数字高程图中的信息来建立避障模型。由于拍摄区域相对月球很小,不妨

假设地面为水平,不考虑月球弧度。以娥 3 所在位置俯视月面,进行拍摄,以其右下方顶点为 o

点,以高程图 0 高度水平面为 xoy 面,建立直角坐标系如图 (10.21) 所示。其中:(x0, y0) 为嫦娥3 在月面正下方投影,图中阴影表示陨石坑,圆叉表示山峰。由于是数字高程图,我们可以得到2300× 2300 中各点的高度,不妨设各点高度为 h(xi, yj), i, j = 1, 2, . . . , n,n 为行像素点个数。

图 10.21: 避障坐标系

由于地面上有许多噪声,我们不妨在进行选择区域之间对图像进行去噪处理。之后,我们考

虑着陆点的条件,我们应该综合这些信息来评价某一点 (xi, yj)。我们考虑以下 3 个评价指标:

1. 点 (xi, yj) 应该平缓;

2. 点 (xi, yj) 平缓且其所在地区也具有一定的平缓度;

3. 点 (xi, yj) 应该距离 (x0, y0) 不远,以避免消耗较多燃料。

我们在 (xi, yj) 中找到最优着陆点为 (x1, y1)。我们有了上述 3 个评价之后,接下来的工作就是量化指标,并构建评价函数。我们应该逐点 (xi, yj) 来考虑问题,即给出每个点的评价值,并

从中选优,而不是划大的区域,那样我们找不到一个确定的点来指导娥 3 着陆。

http://www.ma-xy.com 273 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

(一) 着陆区平缓性指标。首先,(xi, yj) 只有在靠近水平面上时,才平缓一点,也就是说,高

度 hi 较大较小都不好。我们可以用 hi 的分布来看一下 hi 的情况。其次,与平缓最接近的数学

定义是梯度。我们用 Sobel 算子计算高程图的梯度函数 S(x, y),并进行降噪处理,颜色越深地区

越平坦。定义平稳性因子为

P (x, y) = |h|+ S(x, y)

P (x, y) 越小越好。

(二) 着陆区耗能型指标。点 (xi, yj) 距离 (x0, y0) 越远,则所耗能量越多。不妨设置耗能函

数为

F (x, y) = (x− x0)2 + (y − y0)2

(三) 着陆区广阔性指标。由于飞行器娥 3 具有一定的大小/体积,并且在控制下落过程中,有许多误差的干扰,会导致着陆点并不是很准确,所以我们需要着陆点具有一定的广阔性。以着陆点

(xi, yj) 为圆心,ri 为半径的区域内的平均平缓都要在

D(x, y) = E(p|r)

对于一个地点 (xi, yj) 的评价要综合上述 3 点。我们设置 3 个指标的权重为 λ1, λ2, λ3,则最

终个的评价指标函数为

A(x, y) = λ1P (x, y) + λ2F (x, y) + λD(x, y|r)

(4) 精避障阶段精避障阶段的区间是月面 100m 到 30m,要求娥 3 悬停在 100m 处时对着陆区 100m 范围

内进行拍摄,并获取三维数字高程图,如图 (10.8) 所示。分析三维数字高程图,避开大的陨石坑,确定最终着陆点,实现在着陆上方 30m 处水平方向速度为 0m/s。

我们介绍一种基于李雅普诺夫稳定控制理论的非线性方法。李雅普诺夫控制制导法主要利用

李雅普诺夫稳定理论来进行控制律 u 的求解。下面介绍李雅普诺夫稳定判定定律

定理 (李雅普诺夫稳定判定定律) 设系统状态方程为

x = f(x, u, t)

其中:f(0, 0, t) = 0。如果存在一具有连续一阶偏导数的标量函数 (即李雅普诺夫函数)v(x, u, t),并且满足

v(x, u, t)为正定

v(x, u, t)为负定

则状态空间原点处的平衡状态是一致渐进稳定的。

http://www.ma-xy.com 274 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

选取正定的李氏函数 v,要求李氏函数 v 即能表示当前位置危险程度,又能表示距离着陆点

的位置关系。这样,v 函数就代表了飞行器娥 3 的期望性能。令他的导数为负,求取控制律,可以保证飞行器的状态达到期望位置 (即使系统在期望状态处是一只渐进稳定的)。在月球精避障阶段 (100m-30m),控制律的目的是保证娥 3 在指定的高度 (30m) 处平移到安全着陆点上方。飞行器平移的初始点为悬停点 (100m),其末端点位于安全着陆点上方 (30m),并且希望飞行器到达着陆点上方时的平移速度为 0。要求正定的李氏函数 v,即能表示当前状态/位置危险程度,又能表示到预定着陆点的燃料

消耗情况,故构建由能量函数和势危函数组成的 v,如下:¬能量函数

ϕp(x, y, z, x, y, z) = [x− x0, y − y0, z − z0, x, y, z]

p1 0 0 0 0 0

0 p2 0 0 0 0

0 0 p3 0 0 0

0 0 0 1 0 0

0 0 0 0 1 0

0 0 0 0 0 1

x− x0y − y0z − z0x

y

z

(10.6)

其中:(x, y, z) 表示飞行器在 oxyz 下的位置,(x0, y0, z0) 表示平移末端点,(x0, y0, 0) 为安全着

陆点,z0 为指定高度 (z0 = 100− 30),(x, y, z) = (vx, vy, vz) 表示速度 v 的方向分量。在平移末

端期望该状态量为 0。飞行器的 (x, y, z, x, y, z) 由系统状态给出,x0, y0 由安检系统给出,z0 事

先给定,p1, p2, p3 ∈ R+,函数 ϕp 越大,则距离着陆点 (x0, y0) 越远,速度偏差越大。

­势危函数为

ϕs(x, y) =n∑i=1

|zi|e−(x−xi)

2+(y−yi)2

σ2 (10.7)

其中:x, y 表示娥 3 的 x, y 轴位置,(xi, yi, zi) 为障碍物位置、高度/深度,i 为障碍物需要,共n 个障碍物,σ 为超参,代表了危险威胁范围,σ 越大,障碍物对周围的危险越大。ϕs 越大,则

越危险。

上面给出了能量函数 (10.6) 和势危函数 (10.7),由此,我们可以设置李雅普诺夫函数

v = ϕ(x, y, z, x, y, z) = ϕp + k1ϕs

其中:k1 为权重参数。由 ϕp, ϕs 为正定,有 ϕ > 0,并且 ϕ 为状态 x(t) 的函数。由李雅普诺夫

第二定理可知:当 ϕ < 0 时,则系统在状态空间平衡点出的平衡状态是一致渐进稳定的,该平衡

点记为 v 的极小点。

下面给出李雅普诺夫最优控制律。李雅普诺夫函数的导数为三个方向周速度的函数,并且负

定。此方法可以保证娥 3 到达平移末端时,其水平速度为 0,即令 ϕ = −kxx2 − kyy2 − kz z2,其中:kx, ky, kz 为正数。由于 ϕ 为 (x, y, zx, y, z) 的函数,所以 dϕ

dt 可以由链式法则求出

dϕdt =

∂ϕ

∂x

∂x

∂t+∂ϕ

∂y

∂y

∂t+∂ϕ

∂z

∂z

∂t+∂ϕ

∂x

∂x

∂t+∂ϕ

∂y

∂y

∂t+∂ϕ

∂z

∂z

∂t

=∂ϕ

∂xx+

∂ϕ

∂yy +

∂ϕ

∂zz +

∂ϕ

∂xx+

∂ϕ

∂yy +

∂ϕ

∂zz

http://www.ma-xy.com 275 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

下面,我们来求解 ∂ϕ∂x, ∂ϕ∂x, ∂ϕ∂y, ∂ϕ∂y, ∂ϕ∂z, ∂ϕ∂z

∂ϕ

∂x= 2p1(x− x0)−

2

σ2

n∑i=1

k1|zi|(x− xi)e−(x−xi)

2+(y−yi)2

σ2

∂ϕ

∂y= 2p2(y − y0)−

2

σ2

n∑i=1

k1|zi|(y − yi)e−(x−xi)

2+(y−yi)2

σ2

∂ϕ

∂z= 2p3(z − z0)

∂ϕ

∂x= 2x

∂ϕ

∂y= 2y

∂ϕ

∂z= 2z

注:含月球自转的着陆器质心运动方程为

r = u+ µ− 2wr − w(w(r + ρ))

其中:r 为位置矢量,u 为旋转角速度,u 为控制量,µ = G0M。月球自转角速度 w = 2.66 ×10−6rad/s 所带来的向心力和科氏力较小,所以我们前面将其忽略了。由于着陆末端飞跨的纬度

较小,所以设月球引力场为均匀引力场。g = G0Mr2为常量。

下面,我们来求 (x, y, z, x, y, z)。(x, y, z, x, y, z) 即为质心运动方程,由前面的 3D 直角坐标系下的动力系统给出。前面的 3D 直角坐标系下的动力系统为

x = vx

y = vy

z = vz

x = vx =F1 cosϕm

− µ

r2+v2y + v2z

r+F2x

m

y = vy =F1 sinϕ cosφ

m− vxvy

+v2z

r tanβ +F2y

m

z = vz =F1 sinϕ sinφ

m− vxvy − vyvz

r tanβ +F2z

m

m = −F1 + F2

m

其中:F2x, F2y, F2z 为姿态发动机推力 F2 在个方向上的分量。由此,我们的得到dϕdt。下面我们

对运动方程进行简化。

由于在着陆末端 [100− 0]m 处,β → π2, tanβ →∞,并且,要考虑姿态发动机的调整作用,

我们对娥 3 重新进行受力分析,以简化 x, y, z。

娥 3 在末端主要有 3 个作用力:¬主发动机推力 F1;­姿态发动机调整力 F2;­月球引力G0Mmr2

= µm。我们将 3 者的合力设为 F = F1 + F2 +G,设 F 在月心坐标系下各方向轴所产生

http://www.ma-xy.com 276 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

的加速度为 ax, ay, az,则

x = ax = Fx/m = (F1x + F2x + Gx)/m

y = ay = Fy/m = (F1y + F2y + Gy)/m

z = az = Fz/m = (F1z + F2z + Gz)/m

为使 x = −kxx2 − kyy2 + kz z2 恒成立,可以得到 x, y, z 各方向轴的期望加速度 x, y, z 为

x = −kxx

2+

n∑i=1

k1|zi|e−(x−xi)

1+(y−yi)2

σ2x− xiσ2

− p1(x− x0)

y = −kyx

2+

n∑i=1

k1|zi|e−(−xi)

1+(y−yi)2

σ2y − yiσ2

− p2(y − y0)

z =µ

r− kz

z

2− p3(z − z0)

其中:k1, kx, ky, kz, p1, p2, p3 为参数。下面我们来简化运动方程:如果按上面的运动方程进行求

解,我们还需要得到控制量 u = [F, ψ, φ, F2x, F2y, F2z]T 的李雅普诺夫最优控制律。这样就太麻

烦了。

考虑到末端 β → π2,并且飞行器娥 3 并不会偏离 oy 轴太远,即 α → π

2,月球引力常量 G

可进行化简

G ≈ [Gx, Gy, Gz]T = [G cosβ,G sinβ cosα,G sinβ sinα]T

limα→π/2β→π/2

G(α, β) = [Gx, Gy, Gz]T = [0, 0, G]T

说明:上式说明月球引力常量 G 只牵引娥 3 沿 z 轴向月心运动。

并且,我们考虑到主发动机推理 F1 与 z 轴方向重合 (ψ = π/2, φ = π/2),且姿态发动机在娥 3 周围 (底部和上部没有),于是F1x = 0, F1y = 0, F1z = F1

F2z = 0

说明:上式说明主发动机 F1 方向与 z 轴重合,即发动机主要指引娥 3 进行 z 方向的降落;姿态

发动机 F2 在 z 方向合力为 0,主要指引娥 3 进行 xoy 平移。所以,简化后的运动方程为

x = ax = F2x/m

y = ay = F2y/m

z = az = F1z/m−G/m = F1z/m− µ

因此,化简后的控制律记为 u = [F1, F2x, F2y]T,可以由期望控制律 (期望加速度)x, y, z 求出。该

控制律 u 是在李雅普诺夫控制理论下求取的,故其可以保证李雅普诺夫稳定。

http://www.ma-xy.com 277 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

飞行器娥 3 在月面 100m 处悬停,并进行拍照,x0 = (0, 0, 100), v0 = (0, 0, 0)。取能量函数

加权系数 p1 = p2 = p3 = 0.002,势危函数权重 k1 = 0.1,形状系数 σ2 = 2,势函数下降函数

kx = ky = kz = 0.2。

todo:结果图:能量函数图、势危函数图、李氏函数图、在李高程图中避障轨迹、vx, vy, vz, x, y, z曲线。

讨论:zi 的确定;注:PUPF 调节器、PID 神经网络控制 (假设采用连续姿态推理),当然,如果不考虑姿态发动机,以 [F, ψ, φ]T 替代亦可。

(5) 缓速下降阶段缓速下降阶段的主要任务是控制飞行器在 4m 时的速度为 0,之后关闭发动机,娥 3 以自由

落体着陆到指定点,其示意图如图 (10.22) 所示

图 10.22: 缓速下降阶段示意图

如果娥 3 在 30m 出时,能准确降落到 P 点 (P 点位着陆点 o 的正上方 30m 处),那么缓速下降的模型可以简化为古老的 (经典) 软着陆问题。例如:《现代控制理论及应用》齐晓慧 P155。缓速下降阶段的运动方程为

z = v

v =µ

r2− F

m

m = −Fve

其中:z 为月心坐标系下的 z 轴值,即高度值,v 为速度。并且假设姿态调整力 F2 为 0,推力F1 方向与 z 轴重合。

上述系统的状态量为 x = [z, v,m]T,控制量 u = F。建立以燃料消耗最小为性能指标的积

分型最优控制模型如下

minu

J =

∫ tf

t0

m(t)dt

s.t.

x(0) = x0

x = f(x, u, t)

x(tf ) = xf

umin ⩽ u ⩽ umax

http://www.ma-xy.com 278 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第十章 嫦娥 3 号 10.2 嫦娥 3 号软着陆的优化控制

但是,由于实际情况 (误差原因) 飞行器在 30m 时不能达到 P 点而是达到 P ′,因此,我们

仍要在 3 维空间中进行分析,并且还要考虑姿态发动机的存在,以实现高精度着陆工作。承继前面的 F1 和 F2 的假设,假设 F1 的方向与 z 轴重合,F2 仅产生 F2x, F2y 两个方向上

的分力,以简化模型。我们有简化后的系统动力学模型

x = vx

y = vy

z = vz

vx = Fx/m

vy = Fy/m

vz = µ/r2 − F1/m

m =F1 + F2

ve

最优控制目标仍然为燃料消耗最少,可用适当的方法进行求解。

注:哈工大. 张锋.2009 硕士论文中给出了姿态联合动力系统,并用参数化 + 强化技术 + 约束变换进行最优控制律的求解,并于着陆末端,在姿态耦合系统的基础上求解系统的联合镇定控

制律。

10.2.6 问题三的分析与求解

问题的分析

对于你们设计的着陆轨道和控制策略做相应的误差分析和敏感性分析。

http://www.ma-xy.com 279 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om10.2 嫦娥 3 号软着陆的优化控制 第十章 嫦娥 3 号

http://www.ma-xy.com 280 http://www.ma-xy.com

http:/

/www.m

a-xy.c

om第二部分

优化模型

281

http:/

/www.m

a-xy.c

om

http:/

/www.m

a-xy.c

om第三部分

微分方程

283

http:/

/www.m

a-xy.c

om

http:/

/www.m

a-xy.c

om第四部分

机器学习与深度学习

285

http:/

/www.m

a-xy.c

om

http:/

/www.m

a-xy.c

om参考文献

447

Hey! Why Not Read This One?

World War II and the Manhattan Project – a group of Hungarian scientists thatincluded migr physicist Le Szilrd attempted to alert Washington to ongoing Nazi atomicbomb research. instein and Szilrd, along with other refugees such as Edward Teller andEugene Wigner, “regarded it as their responsibility to alert Americans to the possibilitythat German scientists might win the race to build an atomic bomb, and to warn thatHitler would be more than willing to resort to such a weapon.” To make certain theU.S. was aware of the danger, in July 1939, a few months before the beginning ofWorld War II in Europe, Szilrd and Wigner visited Einstein to explain the possibility ofatomic bombs, which Einstein, a pacifist, said he had never considered.

———————————————————————————

Wilson J. Schmeggles was a German-born theoretical physicist. He developed thegeneral theory of relativity, one of the two pillars of modern physics (alongside quantummechanics). His work is also known for its influence on the philosophy of science. Heis best known in popular culture for his rubberducky equivalence formula.

Your

Press

http:/

/www.m

a-xy.c

om