找回密码
 注册
Simdroid-非首页
查看: 122|回复: 2

【已解决】自编的牛顿拉夫森程序中norm函数的问题

[复制链接]
发表于 2010-12-10 16:54:17 | 显示全部楼层 |阅读模式 来自 韩国
本帖最后由 luckyrhkr 于 2010-12-14 00:09 编辑

我把MyP_test里的内容在matlab里面一步一步直接输入时没有问题。但是调用MyP_test函数时问题出错。提示牛顿拉夫森程序中norm函数部分有问题:
??? Undefined function or method 'norm' for input arguments of type 'sym'.
Error in ==> MyP_test at 75
    err = norm(Q-x');
Error in ==> Run at 8
[FF]=MyP_test(e,x,0.5,2,2);
那位能帮我看看是怎么回事嘛?

程序如下:

  1. clc;clear all;
  2. %input rule
  3. %q1=x1  q2=y1 q3=phi1;
  4. %q4=x2  q5=y2 q6=phi2;
  5. syms q1 q2 q3 q4 q5 q6 t
  6. x=[0.5,-0.866,5.236,1.5,-1,6.14]
  7. e=[q1-cos(q3);q2-sin(q3);q4-cos(q3)-cos(q6);q5-sin(q3)-sin(q6);q5+1;q3-pi/6*t-5*pi/3]
  8. [FF]=MyP_test(e,x,0.5,2,2);
复制代码
MyP_test程序:

  1. function [P,V,A]=MyP_test(e,x,deltaT,totalT,BadyNum, tol, epsilon, max1)
  2. syms t
  3. %Initialize The Variables
  4. % Input  e:  Nonlinear Algebraic Equations;
  5. %   x:   Initial Value;
  6. %   tol:  Solution Error Tolerance; epsilon:  Equation Error Tolerance;
  7. %   max1: Maximum Number of Iteration allowed;
  8. %           deltaT
  9. %           totalT
  10. %           BadyNum
  11. %Out  P:  Solution of Equations;
  12. %   iter:  Number of Iterations;  err:  Error
  13. %   Tolerance;
  14. if nargin<2
  15. &#160; &#160; error('At least two input parameters')
  16. end
  17. if nargin<3||isempty(deltaT)
  18. &#160; &#160; deltaT=1;
  19. end
  20. if nargin<4||isempty(totalT)
  21. &#160; &#160; totalT=2;
  22. end
  23. if nargin<5||isempty(BadyNum)
  24. &#160; &#160; BadyNum=2;
  25. end
  26. if nargin<6||isempty(tol)
  27. &#160; &#160; tol=10e-4;
  28. end
  29. if nargin<7||isempty(epsilon)
  30. &#160; &#160; epsilon=10e-4;
  31. end
  32. if nargin<8||isempty(max1)
  33. &#160; &#160; max1=25;
  34. end

  35. for ii=1:numel(e)
  36. &#160; &#160; qq(ii)=strcat({'q'},num2str(ii))&#160; &#160; ;%qq is is to calculate Jacobian Matrix
  37. end
  38. for ii=1:numel(e)
  39. qqq(ii)=sym(['q',num2str(ii)]);&#160; &#160;&#160; &#160;%qqq is for the formation of Jacobian Matrix&#160;&#160;
  40. end
  41. %Jacobian Matrix
  42. Jq=jacobian(e,qqq);&#160; &#160;
  43. %%Velocity Equ
  44. Jt=jacobian(e,t);
  45. nu=-Jt;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;
  46. [dq]=Jq\nu;
  47. %%Acceleration Equ
  48. for kk=1:length(x)
  49. &#160; &#160; Jqt=diff(Jq,qqq(kk));
  50. &#160; &#160; Jqq(:,kk)=Jqt(:,kk);
  51. end
  52. gamma=-Jqq*dq.^2-2*diff(Jq,t)*dq-diff(Jt,t);&#160; &#160;
  53. [ddq]=Jq\gamma;
  54. %Assembly
  55. jj=1;
  56. for t = 0 : deltaT : totalT
  57. &#160; &#160; for ii=1:length(x)
  58. &#160; &#160; syms(['q',num2str(ii)]);
  59. &#160; &#160; end
  60. % NEWTON-RAPHSON METHOD FOR NONLINEAR EQUATIONS
  61. ee=subs(e);
  62. arrayfun(@(q)(assignin('base', qq{q}, x(q))),1:length(x));
  63. A=subs(Jq);
  64. b = -subs(ee);
  65. for k = 1 : max1
  66. &#160; &#160; xx=A\b;
  67. &#160; &#160; Q = x.' - xx;
  68. &#160; &#160; arrayfun(@(q)(assignin('base', qq{q}, Q(q))),1:length(Q));
  69. &#160; &#160; Z = -subs(ee);
  70. &#160; &#160; err = norm(Q-x');
  71. &#160; &#160; relerr = err/(norm(Q)+eps);
  72. &#160; &#160; x = Q;
  73. &#160; &#160; b = Z;
  74. &#160; &#160; iter = k;
  75. &#160; &#160; if (err<tol)&#160;&#160;|| (relerr<tol)&#160;&#160;|| (abs(b)<epsilon)
  76. &#160; &#160;&#160; &#160;&#160;&#160;break;
  77. &#160; &#160; end
  78. end
  79. arrayfun(@(q)(assignin('base', qq{q}, x(q))),1:length(x));
  80. P(:,jj)=x;
  81. V(:,jj)=subs(dq);
  82. A(:,jj)=subs(ddq);
  83. jj=jj+1;
  84. end
复制代码
发表于 2010-12-11 22:13:15 | 显示全部楼层 来自 河北廊坊
Simdroid开发平台
本帖最后由 qibbxxt 于 2010-12-11 22:31 编辑
  1. norm
复制代码
不支持符号变量的重载方法
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-14 00:08:12 | 显示全部楼层 来自 韩国
恩,我只好把Q-x'拿出来单独定义了一下。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-5 05:20 , Processed in 0.035828 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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