适用范围
本文对参数辨识以及相关优化问题进行总结,并给出实现代码和流程。这类问题特点如下:
(1)需要对目标函数进行多次计算,并且保存每次计算时所用的全部参数
(2)计算完后需要从存储的函数中选优,提取最优解以及对应参数
(3)需要批量绘图,得到迭代规律和每种参数的变化规律
例子:
(1)采用动态规划法求最小油耗:优化方法为动态规划法(论文中),目标函数为油耗,参数为划分的航段(或时段)、每个状态上的点的位置和个数
(2)船舶在风浪中航行的参数辨识,主要辨识出风浪对船舶的影响参数。
本文以例(2)为例讲解,优化方法以模拟退火算法为例。
存储数据
错误做法:先建立空list,再根据循环一个个append。坏处:极有可能出现浅拷贝,且list维度不够,必须建立多个list
正确做法:建立一个多维数组,比如三维数组np.zeros([2,3,100]),2表示退火的随机初始次数,3表示参数个数,100表示迭代次数,用来存储每次迭代的参数值(后面绘制迭代曲线图)。
批量绘制多图
subplot()格式如下:
subplot( numRows, numCols, plotNum)
整个Figure会被划分为numRows行,numCols列,并从左往右,从上往下编号为1,2…也就是说plotNum指定了子图所在的位置,此外,如果三个参数的都小于10,则可以简写在一起,例如:subplot(4, 3, 2)也可以写成 subplot(432)
根据以上信息,采用subplot()绘制多图的代码为:
import matplotlib.pyplot as plt
plt.figure(figsize=(5,4))#设置图像总大小,注意先设置大小再绘图
sub_plot=[231,232,233,234,235,236]
for i in range(len(sub_plot)):
plt.subplot(sub_plot[i])
plt.plot(x1[num],y1[num])#x1,y1是二维array,Num表示选取第num行
#如果多于10张图,则不能用类似(234)形式,需要用(2,3,4)
for i in range(10,13):
plt.subplot(5,3,i)
plt.plot(x1[num],yi[num])
plt.show()
绘制图像所示,第一张为目标函数迭代曲线,剩下的为各个参数迭代曲线。