chunshui2003 发表于 2010-11-29 15:42

符号表达式中能否应用“sign”函数

因为要求一个微分方程的Jacobian矩阵,所以将里面的变量以符号表达式给出。但其中的一项包含“sign”函数,而在书写表达式时提示错误。比如:

syms x y
a = sign(x*y)

然后出现提示“??? Undefined function or method 'sign' for input arguments of type 'sym'.”

但sign确实是matlab中存在的函数,如果用数值代替x和y则没有任何问题。
请问这是为什么?应该如何处理呢?

rocwoods 发表于 2010-11-29 16:10

有些输入参数是数值型的函数,在符号运算时,MATLAB并没有重载它,sigh函数就是其中之一。自己另写一个吧

chunshui2003 发表于 2010-11-29 18:50

回复 2 # rocwoods 的帖子

感谢吴老师的建议,我再试试其他的。

chunshui2003 发表于 2010-11-30 13:04

回复 2 # rocwoods 的帖子

吴老师:
          您好!
          您昨天说的数值型函数“sign”在进行符号预算时matlab无法重载的问题我又查了一些资料,但仍然没有好的解决办法。您说的再重新写一个,我没有明白是什么意思。因为要求解方程的Jacobian矩阵,并且油膜力的表达式非常复杂,所以不得不采用符号形式。将相关的符号和表达式列出,请指点该如何处理:



syms m1 m2 c1 c2 Ke e0
syms e0 Rr Lr delta_0 cz Rb Lb mu
syms mu_0 Kj Ij Fj omega                                 % 已知参数


syms    u1 u2 u3 u4 u5 u6 u7 u8 u9                        % 未知参数,系统变量


e = sqrt(u1.^2 + u3.^2);
F_coeffi = Rr * Lr *pi *mu_0 *Fj^2 /delta_0.^2;
Fx = F_coeffi * (1/2 * e + 5/8 * e.^3) * u1./e;
Fy = F_coeffi * (1/2 * e + 5/8 * e.^3) * u3./e;         % 不平衡磁拉力



sigma = mu * omega * Rb * Lb * (Rb/cz)^2 * (Lb/2/Rb)^2;
A1 = u7 + 2*u6;
A2 = u5 - 2*u8;

alpha = atan(A1./A2) - pi/2* sign(A1./A2) - pi/2* sign(A1);                        %就是这里不知道该如何处理


E = sqrt(u5.^2 +u7.^2);
E_minus = sqrt(1 -E.^2);
B1 = u7*cos(alpha) - u5*sin(alpha);
B2 = u5*cos(alpha) + u7*sin(alpha);
G = 2./E_minus * ( pi/2 + atan(B1./ E_minus) );
V = (2 + B1 * G) ./E_minus.^2;
S = B2 ./ ( 1 - B2.^2 );

F_oil_same = -sqrt( A2.^2 + A1.^2 ) ./ E_minus.^2;
f_x = F_oil_same * ( 3* u5 *V - sin(alpha) * G - 2 *cos(alpha)*S );
f_y = F_oil_same * ( 3* u7 *V + cos(alpha) * G - 2 *sin(alpha)*S );   %油膜力的无量纲表达式
fx = sigma * f_x;
fy = sigma * f_y;            %非线性油膜力

%%%%%%%%%               系统运动微分方程            %%%%%%%%%%
uu1 = u2;
uu2 = -c1/(m1*omega) * u2 - Ke/(m1*omega^2) * u1 + Ke * cz/(m1*omega^2*delta_0)*u5 + e0 * cos(u9)/delta_0 + Fx/(m1*omega^2*delta_0);
uu3 = u4;
uu4 = -c1/(m1*omega) * u4 - Ke/(m1*omega^2) * u3 + Ke * cz/(m1*omega^2*delta_0)*u7 + e0 * sin(u9)/delta_0 + Fy/(m1*omega^2*delta_0);
uu5 = u6;
uu6 = -c2/(m2*omega) * u6 + Ke * delta_0/(2*m2*omega^2*cz) * u1 - Ke/(2*m2*omega^2) * u5 + fx/(m2*omega^2 *cz);
uu7 = u8;
uu8 = -c2/(m2*omega) * u8 + Ke * delta_0/(2*m2*omega^2*cz) * u3 - Ke/(2*m2*omega^2) * u7 + fy/(m2*omega^2 *cz);
uu9 = 1;




rocwoods 发表于 2010-11-30 14:14

本帖最后由 rocwoods 于 2010-11-30 14:36 编辑

x不为0的情况下,sign(x) 等价于x./abs(x)
如果把x = 0的情况也考虑进去就是
x./(abs(x)+(x==0))
abs是支持符号运算的。

chunshui2003 发表于 2010-11-30 15:41

回复 5 # rocwoods 的帖子

非常感谢吴老师的帮助,又学到了新的东西!
页: [1]
查看完整版本: 符号表达式中能否应用“sign”函数