- 积分
- 0
- 注册时间
- 2010-10-4
- 仿真币
-
- 最后登录
- 1970-1-1
|
本帖最后由 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);
那位能帮我看看是怎么回事嘛?
程序如下:-
- clc;clear all;
- %input rule
- %q1=x1  q2=y1 q3=phi1;
- %q4=x2  q5=y2 q6=phi2;
- syms q1 q2 q3 q4 q5 q6 t
- x=[0.5,-0.866,5.236,1.5,-1,6.14]
- 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]
- [FF]=MyP_test(e,x,0.5,2,2);
复制代码 MyP_test程序:-
- function [P,V,A]=MyP_test(e,x,deltaT,totalT,BadyNum, tol, epsilon, max1)
- syms t
- %Initialize The Variables
- % Input  e:  Nonlinear Algebraic Equations;
- %   x:   Initial Value;
- %   tol:  Solution Error Tolerance; epsilon:  Equation Error Tolerance;
- %   max1: Maximum Number of Iteration allowed;
- %           deltaT
- %           totalT
- %           BadyNum
- %Out  P:  Solution of Equations;
- %   iter:  Number of Iterations;  err:  Error
- %   Tolerance;
- if nargin<2
-     error('At least two input parameters')
- end
- if nargin<3||isempty(deltaT)
-     deltaT=1;
- end
- if nargin<4||isempty(totalT)
-     totalT=2;
- end
- if nargin<5||isempty(BadyNum)
-     BadyNum=2;
- end
- if nargin<6||isempty(tol)
-     tol=10e-4;
- end
- if nargin<7||isempty(epsilon)
-     epsilon=10e-4;
- end
- if nargin<8||isempty(max1)
-     max1=25;
- end
- for ii=1:numel(e)
-     qq(ii)=strcat({'q'},num2str(ii))    ;%qq is is to calculate Jacobian Matrix
- end
- for ii=1:numel(e)
- qqq(ii)=sym(['q',num2str(ii)]);      %qqq is for the formation of Jacobian Matrix  
- end
- %Jacobian Matrix
- Jq=jacobian(e,qqq);   
- %%Velocity Equ
- Jt=jacobian(e,t);
- nu=-Jt;                 
- [dq]=Jq\nu;
- %%Acceleration Equ
- for kk=1:length(x)
-     Jqt=diff(Jq,qqq(kk));
-     Jqq(:,kk)=Jqt(:,kk);
- end
- gamma=-Jqq*dq.^2-2*diff(Jq,t)*dq-diff(Jt,t);   
- [ddq]=Jq\gamma;
- %Assembly
- jj=1;
- for t = 0 : deltaT : totalT
-     for ii=1:length(x)
-     syms(['q',num2str(ii)]);
-     end
- % NEWTON-RAPHSON METHOD FOR NONLINEAR EQUATIONS
- ee=subs(e);
- arrayfun(@(q)(assignin('base', qq{q}, x(q))),1:length(x));
- A=subs(Jq);
- b = -subs(ee);
- for k = 1 : max1
-     xx=A\b;
-     Q = x.' - xx;
-     arrayfun(@(q)(assignin('base', qq{q}, Q(q))),1:length(Q));
-     Z = -subs(ee);
-     err = norm(Q-x');
-     relerr = err/(norm(Q)+eps);
-     x = Q;
-     b = Z;
-     iter = k;
-     if (err<tol)  || (relerr<tol)  || (abs(b)<epsilon)
-         break;
-     end
- end
- arrayfun(@(q)(assignin('base', qq{q}, x(q))),1:length(x));
- P(:,jj)=x;
- V(:,jj)=subs(dq);
- A(:,jj)=subs(ddq);
- jj=jj+1;
- end
复制代码 |
|