rand和unifrnd函数的异同
rand函数和unifrnd函数的相同和不同点在CSDN这篇文章已经解释得很清楚👉:点击这里,其实本质上是一样的,都是用rand函数随机在0~1范围内取均匀分布的值,unifrnd是对rand函数的封装。其中博主举的例子很形象:
在区间[5,10]上生成400个均匀分布的随机数 ,两个生成的是一样的数:
h1=unifrnd(5,10,1,400);
h2=5+5*rand(1,400); % same pdf
还有不懂的可以查一查matlab官方帮助文档以及stackoverflow的这篇文章👉:点击这里
我是不懂它们两个函数具体是怎么实现的,所以我只能用笨办法,分别运行两个仿真来看得到的实验结果,有没有什么异同。
仿真代码
具体代码可以看我这个文章👉:线性递减权重的PSO-PID算法
具体运行代码的不同之处就在于:
1)rand函数随机初始化粒子速度
%% 粒子群初始化
Range = ones(SwarmSize,1)*(Ub-Lb); % 初始化范围
Swarm = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb % 初始化粒子群
VStep = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin % 初始化速度
2)unifrnd函数随机初始化粒子速度
%% 粒子群初始化
Swarm = zeros(SwarmSize,Dim); %预分配内存
VStep = zeros(SwarmSize,Dim);
for i = 1:SwarmSize
for j = 1:Dim
Swarm(i, j) = unifrnd(Lb(j), Ub(j)); % 使用均匀分布随机生成位置
VStep(i, j) = unifrnd(Vmin, Vmax); % 使用均匀分布随机生成速度
end
end
仿真结果
两者共同的初始条件,只要注意其粒子个数Swarm、最大迭代次数MaxIter、速度边界Vmax&Vmin以及位置边界Ub&Lb即可。
ws=0.9; % 最大权重
we=0.4; % 惯性因子 线性惯性权重 最小权重
c1 = 2; % 加速常数/学习因子1
c2 = 2; % 加速常数/学习因子2
Dim = 3; % 维数
SwarmSize = 100; % 粒子群规模
ObjFun = @PSO_PIDdiscrete1; % 待优化函数句柄
MaxIter = 100; % 最大迭代次数
MinFit = 0.00001; % 最小适应值
Vmax = 1; %速度更新限制范围
Vmin = -1;
Ub = [10 50 10]; %位置更新限制范围
Lb = [0 0 0];
rand函数的结果:
这些图像还是能够明显看出它的迭代效果的,前面的PID值都有不同的取值(Kp除外,它都是0),总的来说比我之前仿真的效果要好太多了,其迭代出来最优的PID值为:[ 0 ; 10.2371832745715 ; 2.08573422231178]
将这个结果带回到simulink模型可以得到最佳适应度值:0.0106427512662789
其反馈速度于输入速度之间的曲线对比图如下:
效果还是不错的!
unifrnd函数结果如下:
其迭代出来最优的PID值为:[0 ; 10.2371922156877 ; 2.08573268286997],与之前迭代出来的值只是在小数点后5、6位有差距,其实这是很小的变化。
将这个结果带回到simulink模型可以得到最佳适应度值:0.0106427512135790,适应度值也是在小数点后9位才开始有变化。
其反馈速度于输入速度之间的曲线对比图如下:
和之前的结果几乎看不出什么变化,效果也是还可以的。
以及之前仿真时间大约是3.39h,这一次时间是3.68h,可能稍微有点差别但是也不大。
结论
无论是用rand函数还是unifrnd函数初始化的速度,对最终迭代出来的较优PID值几乎没有影响,两种速度初始化都是可以的。
感谢大家能够看到这里!