声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2223|回复: 5

[混合编程] 符号表达式中能否应用“sign”函数

[复制链接]
发表于 2010-11-29 15:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

syms x y
a = sign(x*y)

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

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

使用道具 举报

发表于 2010-11-29 16:10 | 显示全部楼层
有些输入参数是数值型的函数,在符号运算时,MATLAB并没有重载它,sigh函数就是其中之一。自己另写一个吧
 楼主| 发表于 2010-11-29 18:50 | 显示全部楼层
回复 2 # rocwoods 的帖子

感谢吴老师的建议,我再试试其他的。
 楼主| 发表于 2010-11-30 13:04 | 显示全部楼层
回复 2 # rocwoods 的帖子

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



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


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


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



  9. sigma = mu * omega * Rb * Lb * (Rb/cz)^2 * (Lb/2/Rb)^2;
  10.   A1 = u7 + 2*u6;
  11.   A2 = u5 - 2*u8;
  12.   
  13. alpha = atan(A1./A2) - pi/2* sign(A1./A2) - pi/2* sign(A1);                          %[color=red]就是这里不知道该如何处理[/color]


  14. E = sqrt(u5.^2 +u7.^2);
  15. E_minus = sqrt(1 -E.^2);
  16. B1 = u7*cos(alpha) - u5*sin(alpha);
  17. B2 = u5*cos(alpha) + u7*sin(alpha);
  18. G = 2./E_minus * ( pi/2 + atan(B1./ E_minus) );
  19. V = (2 + B1 * G) ./  E_minus.^2;
  20. S = B2 ./ ( 1 - B2.^2 );

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

  26. %%%%%%%%%               系统运动微分方程            %%%%%%%%%%
  27.   uu1 = u2;
  28.   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);
  29.   uu3 = u4;
  30.   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);
  31.   uu5 = u6;
  32.   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);
  33.   uu7 = u8;
  34.   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);
  35.   uu9 = 1;

复制代码



发表于 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是支持符号运算的。

评分

1

查看全部评分

 楼主| 发表于 2010-11-30 15:41 | 显示全部楼层
回复 5 # rocwoods 的帖子

非常感谢吴老师的帮助,又学到了新的东西!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-10 22:24 , Processed in 0.059511 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表