Matlab放置函数错误

时间:2015-10-22 03:14:14

标签: matlab symbolic-math eigenvalue state-space

这里有趣的问题。在我们学校的Windows服务器上,Matlab可以很好地执行以下代码中的place函数并返回分配给变量K的1x4矩阵。但是,Linux服务器和我个人计算机上的Matlab(Windows 8.1)都会返回多个错误。状态空间矩阵的解决方案是正确的。我也试过简单地创建一个具有Double类型而不是符号矩阵的A和B矩阵,但无济于事。错误如下:

Error using symengine
Cannot prove '(0.00000000000011152837950971767051666806677642 < 5.0227916840119976230900756087285) < 2' literally. To test the statement
mathematically, use isAlways.

Error in sym/logical (line 360)
            X = mupadmex('symobj::logical',A.s,9);

Error in sym/any (line 417)
                X = any(logical(A));

Error in place (line 77)
if any(mult>m)

我试图执行的相关代码是:

syms theta thetadot y ydot u s;

I2 = 0.05;
I1 = 0.2;
m2 = 2;
r = 0.11;
a = 0.1;
g = 9.81;

x0 = [20 * pi / 180 0.2 0 0];

W = [I1 + I2 + m2 * (y^2 + r^2) m2 * r + I2 / a; m2 * r + I2 / a m2 + I2 / a^2];

qdd = W^(-1) * ([u; 0] - (m2 * [2*y*thetadot*ydot; -y*thetadot^2] - m2*g*        [r*sin(theta) + y*cos(theta); sin(theta)]));
qd = [thetadot; ydot];

xdot = [qd; qdd];
eq = [0 0 0 0 0 ];

x3bytheta = subs(diff(qdd(1), theta), {theta, y, thetadot, ydot, u}, eq);
x3byy = subs(diff(qdd(1), y), {theta, y, thetadot, ydot, u}, eq);
x3bythetadot = subs(diff(qdd(1), thetadot), {theta, y, thetadot, ydot, u}, eq);
x3byydot = subs(diff(qdd(1), ydot), {theta, y, thetadot, ydot, u}, eq);

x4bytheta = subs(diff(qdd(2), theta), {theta, y, thetadot, ydot, u}, eq);
x4byy = subs(diff(qdd(2), y), {theta, y, thetadot, ydot, u}, eq);
x4bythetadot = subs(diff(qdd(2), thetadot), {theta, y, thetadot, ydot, u}, eq);
x4byydot = subs(diff(qdd(2), ydot), {theta, y, thetadot, ydot, u}, eq);

x3byu = subs(diff(qdd(1), u), {theta, y, thetadot, ydot, u}, eq);
x4byu = subs(diff(qdd(2), u), {theta, y, thetadot, ydot, u}, eq);

A = [0 0 1 0; 0 0 0 1; x3bytheta x3byy x3bythetadot x3byydot; x4bytheta x4byy x4bythetadot x4byydot];
B = [0; 0; x3byu; x4byu];

K = place(vpa(A, 3), vpa(B, 3), [-1, -2, -1+2j, -1-2j]);

1 个答案:

答案 0 :(得分:0)

行为上的差异来自R2015a update to the Symbolic Toolbox(最后一项),并引用了symbolic gt的当前文档:

  

在以前的版本中,gt在某些情况下评估了仅涉及符号数字且返回逻辑10的不等式。要获得与先前版本相同的结果,请在isAlways中包含不等式。例如,使用isAlways(A > B)

即使两个操作数都是常数,符号比较仍然存在;也就是说,没有参加过建筑会议,这是一个相当大的疏忽和古怪的行为。

不幸的是,由于place来自&#34; double - 首先使用&#34;透视,该函数依赖于逻辑的总和来产生数字输出,而不是符号表达式。

我可以看到两种方法来解决这种情况:

  1. 除非你真的需要变量精度算术,因为系统的病态性质是不可避免的,所以只需将AB作为双精度投射,你已经注意到了它。
  2. 如果确实需要变量精度算术,请创建place函数的本地副本,并在isAlways中包含所有相关的逻辑比较以评估比较。我发现的兴趣点是(如果不准确,接近)60,105,117和123.