针对多入多出多智能体系统,设计执行器饱和情况下的紧格式动态线性化无模型自适应控制算法;仿真验证算法的有效性。
% 控制器设计
[u1(:,k),phi1{k}]=KZ([y1(:,k) y1(:,max(1,k-1))],[y1(:,max(1,k-1)) y1(:,max(1,k-2))],xi1(:,k),u1(:,max(1,k-1)),u1(:,max(1,k-2)),phi1{max(1,k-1)},
phi1{1},eta,mu,rho1,lambda,ad(1),D(1),delr,1,k);
[u2(:,k),phi2{k}]=KZ([y2(:,k) y2(:,max(1,k-1))],[y2(:,max(1,k-1)) y2(:,max(1,k-2))],xi2(:,k),u2(:,max(1,k-1)),u2(:,max(1,k-2)),phi2{max(1,k-1)},
phi2{1},eta,mu,rho1,lambda,ad(2),D(2),delr,2,k);
[u3(:,k),phi3{k}]=KZ([y3(:,k) y3(:,max(1,k-1))],[y3(:,max(1,k-1)) y3(:,max(1,k-2))],xi3(:,k),u3(:,max(1,k-1)),u3(:,max(1,k-2)),phi3{max(1,k-1)},
phi3{1},eta,mu,rho1,lambda,ad(3),D(3),delr,3,k);
下面是出现问题的控制器
% 控制器设计
[u1(:,k),phi1{k}]=KZ([y1(:,k) y1(:,max(1,k-1))],[y1(:,max(1,k-1)) y1(:,max(1,k-2))],xi1(:,k),u1(:,max(1,k-1)),u1(:,max(1,k-2)),phi1{max(1,k-1)},phi1{1},eta,mu,rho1,lambda,ad(1),D(1),delr,1,k);
[u2(:,k),phi2{k}]=KZ([y2(:,k) y2(:,max(1,k-1))],[y2(:,max(1,k-1)) y2(:,max(1,k-2))],xi2(:,k),u2(:,max(1,k-1)),u2(:,max(1,k-2)),phi2{max(1,k-1)},phi2{1},eta,mu,rho1,lambda,ad(2),D(2),delr,2,k);
[u3(:,k),phi3{k}]=KZ([y3(:,k) y3(:,max(1,k-1))],[y3(:,max(1,k-1)) y3(:,max(1,k-2))],xi3(:,k),u3(:,max(1,k-1)),u3(:,max(1,k-2)),phi3{max(1,k-1)},phi3{1},eta,mu,rho1,lambda,ad(3),D(3),delr,3,k);
无法执行赋值,因为左侧的大小为 2-by-1,右侧的大小为 2-by-2。
出错 MIMO (line 91)
[u1(:,k),phi1{k}]=KZ([y1(:,k) y1(:,max(1,k-1))],[y1(:,max(1,k-1))
y1(:,max(1,k-2))],xi1(:,k),u1(:,max(1,k-1)),u1(:,max(1,k-2)),phi1{max(1,k-1)},phi1{1},eta,mu,rho1,lambda,ad(1),D(1),delr,1,k);
得知其原因,使能够顺利的跑起来程序
[u1(:,k),phi1{k}]=KZ(
[y1(:,k) y1(:,max(1,k-1))],
[y1(:,max(1,k-1)) y1(:,max(1,k-2))],
xi1(:,k),
u1(:,max(1,k-1)),
u1(:,max(1,k-2)),
phi1{max(1,k-1)},
phi1{1},
eta,
mu,
rho1,
lambda,
ad(1),
D(1),
delr,
1,
k
);
[u2(:,k),phi2{k}]=KZ(
[y2(:,k) y2(:,max(1,k-1))],
[y2(:,max(1,k-1)) y2(:,max(1,k-2))],
xi2(:,k),
u2(:,max(1,k-1)),
u2(:,max(1,k-2)),
phi2{max(1,k-1)},
phi2{1},
eta,
mu,
rho1,
lambda,
ad(2),
D(2),
delr,
2,
k
);
[u3(:,k),phi3{k}]=KZ(
[y3(:,k) y3(:,max(1,k-1))],
[y3(:,max(1,k-1)) y3(:,max(1,k-2))],
xi3(:,k),
u3(:,max(1,k-1)),
u3(:,max(1,k-2)),
phi3{max(1,k-1)},
phi3{1},
eta,
mu,
rho1,
lambda,
ad(3),
D(3),
delr,
3,
k
);
根据报错提示,你的KZ函数求出来的是一个22的矩阵,而你的左侧[u1(:,k),phi1{k}]是一个21的矩阵,因此不能把右侧的值赋给左侧。你的左侧应该使用也使用2*2的矩阵去接受函数的返回值。
从报错的结果上来看是运行的数据存储的矩阵大小不匹配,题主最好把代码完全粘贴一下,这样才能找到具体的错误是哪一步
因左右矩阵类型不匹配导致
左边为21的矩阵,右边为22的矩阵。可以检查下变量定义,是不是数目不一样。
这个问题是因为左右矩阵类型不匹配导致,设置两个相同的数据类型看一下 能否解决
出现这个报错说明矩阵左右两边元素个数不相等,我们要做的是理解两边元素个数为什么不相等,再根据情况修改。我总结了如下步骤:
定位到报错行
查看一下等号左右两边元素个数,这里通过观察可能看不出问题,可以用size函数分别查看两边元素的个数
充分理解等号左右两边变量的类型,到底是数值还是字符数组或字符串数组,有没有元胞数组等……,
搞清楚左右两边是一个完整的矩阵还是单个元素,我见过有人将矩阵和单个元素用等号连接
对容易让人混淆的情形,要着重考虑,比如代码 A = char(ones(1,10)); A(1) = '123' ,左边是字符数组A的第一个元素,该位置只能保存一个字符,而右边是一个字符数组,这个字符数组有3个元素,每个元素代表一个字符,这个操作将包含3个字符的字符数组赋值给只能包含一个字符的位置,这样一来出现“左侧和右侧的元素数目不同”的报错也属正常。修改方案A = string(ones(1,10)); A(1) = "123"这段代码将A修改为字符串数组,‘123’改为“123”,这样就将字符串保存到了字符串数组中
左边为2x1的矩阵,右边为2x2的矩阵,可以分别检查下两边的数据在哪一步变换的,改为相同的类型
如果方便的话可以将代码放在代码块里来看下吗,排版有点乱
21矩阵可以赋值给22矩阵,但是反过来不行