用粒子种群算法辨识非线性动态模型G(s)=(1/(s+1)*(10*s+1))*e^(-0.8*s)的代码
时间: 2023-10-25 20:06:41 浏览: 98
以下是使用粒子群算法辨识非线性动态模型G(s)的Python代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义非线性动态模型G(s)
def G(s):
return (1/((s+1)*(10*s+1)))*np.exp(-0.8*s)
# 定义粒子群算法函数
def PSO(c1, c2, w, maxiter, npop, bounds):
# 初始化粒子的位置和速度
x = np.random.uniform(bounds[0], bounds[1], (npop, len(bounds)))
v = np.zeros_like(x)
# 记录粒子历史最优位置和适应度
pbest = x.copy()
pbest_fitness = np.zeros(npop)
for i in range(npop):
pbest_fitness[i] = fitness(x[i])
# 记录全局最优位置和适应度
gbest_idx = pbest_fitness.argmin()
gbest = pbest[gbest_idx].copy()
gbest_fitness = pbest_fitness[gbest_idx]
# 迭代更新粒子
for t in range(maxiter):
for i in range(npop):
# 更新速度和位置
v[i] = w*v[i] + c1*np.random.rand()*(pbest[i]-x[i]) + c2*np.random.rand()*(gbest-x[i])
x[i] += v[i]
# 限制粒子位置在边界内
x[i] = np.clip(x[i], bounds[0], bounds[1])
# 更新粒子历史最优位置和适应度
fitness_i = fitness(x[i])
if fitness_i < pbest_fitness[i]:
pbest[i] = x[i].copy()
pbest_fitness[i] = fitness_i
# 更新全局最优位置和适应度
if fitness_i < gbest_fitness:
gbest = x[i].copy()
gbest_fitness = fitness_i
# 打印每轮迭代最优适应度
print("Iteration {}: Best Fitness = {:.6f}".format(t+1, gbest_fitness))
# 返回全局最优位置和适应度
return gbest, gbest_fitness
# 定义适应度函数
def fitness(x):
# 计算非线性动态模型的输出
s = np.arange(0, 10, 0.1)
y = G(s)
# 计算粒子模型的输出
num = x[0]*s + x[1]
den = s + x[2]
den = np.where(den == 0, 1e-6, den)
y_hat = num/den
# 计算适应度(均方误差)
fitness = np.mean((y-y_hat)**2)
return fitness
# 设置粒子群算法参数和边界
c1 = 1.5
c2 = 1.5
w = 0.7
maxiter = 50
npop = 20
bounds = [(-10, 10), (-10, 10), (-10, 10)]
# 运行粒子群算法
gbest, gbest_fitness = PSO(c1, c2, w, maxiter, npop, bounds)
# 输出辨识结果
print("Identified Model: G(s) = ({:.4f}*s + {:.4f})/({:.4f}*s + 1)".format(gbest[0], gbest[1], gbest[2]))
# 绘制辨识结果与真实模型的比较
s = np.arange(0, 10, 0.1)
y = G(s)
num = gbest[0]*s + gbest[1]
den = s + gbest[2]
y_hat = num/den
plt.plot(s, y, label="True Model")
plt.plot(s, y_hat, label="Identified Model")
plt.legend()
plt.show()
```
在上述代码中,我们首先定义了非线性动态模型G(s),然后定义了粒子群算法函数PSO和适应度函数fitness。在PSO函数中,我们使用了标准的粒子群算法更新公式,并在每轮迭代中更新每个粒子的历史最优位置和全局最优位置。在适应度函数fitness中,我们计算了非线性动态模型G(s)和粒子模型的输出之间的均方误差作为适应度。
最后,我们设置了粒子群算法的参数和边界,并运行了PSO函数得到全局最优位置和适应度。我们输出了辨识结果,并绘制了辨识结果与真实模型的比较。
阅读全文