"DOUBLE cannot convert the input expression into a double array. If the input expression contains a symbolic variable, use the VPA function instead."

4 次查看(过去 30 天)
My command window code is:
syms L C gamma lambda k K X U FOG SOG u1 u2 u3 eps1 eps2;
C=u1^2+3*u2^2+2*u3^2;
L = u1*u2+2*u1*u3+3*u2*u3;
U=[u1 u2];X=[u3];
C=u1^2+3*u2^2+2*u3^2;
gamma=4;
Cx=jacobian(C,X);
Cu=jacobian(C,U);
Lu=jacobian(L,U);
Lx=jacobian(L,X);
lambda_T=-Lx*inv(Cx);
Lbar_u=Lu+lambda_T*Cu;
Lbar_x=Lx+lambda_T*Cx;
Lbar_ux=jacobian(Lbar_u,X);
Lbar_xx=jacobian(Lbar_x,X);
Lbar_xu=jacobian(Lbar_x,U);
Lbar_uu=jacobian(Lbar_u,U);
Lxu=jacobian(Lx,U);
Lux=jacobian(Lu,X);
Lbar_uu_star=Lbar_uu-Lbar_ux*inv(Cx)*Cu-(Cu)'*((Cx)')^(-1)*Lbar_xu+(Cu)'*((Cx)')^(-1)*Lbar_xx*inv(Cx)*Cu;
u3=-1;u1=1;u2=1;
k=1;K=.500330;
FOG=0;SOG=1;
Opt(0,K,1,Lbar_uu_star,L,X,U,C,k,gamma,lambda_T,Cx,Cu,Lx,Lu,Lxu,Lux,Lbar_u,Lbar_uu,Lbar_x,Lbar_xu, Lbar_xx, Lbar_ux,eps1,eps2);
My M-file Opt.m is:
function[] = Opt(FOG,K,SOG,Lbar_uu_star,L,X,U,C,k,gamma,lambda_T,Cx,Cu,Lx,Lu,Lxu,Lux,Lbar_u,Lbar_uu,Lbar_x,Lbar_xu, Lbar_xx, Lbar_ux,eps1,eps2)
while abs(double(subs(C))-double(subs(gamma)))>=(double(subs(eps1)))
X=(double(subs(X)))-inv(double(subs(Cx)))*(double(subs(C))-(double(subs(gamma))));
if abs(double(subs(C))-(double(subs(gamma))))<(double(subs(eps1)))
if abs(double(subs(Lbar_u)))<(double(subs(eps2)))
break;
else
k=k+1;
if FOG == 1
U=(double(subs(U)))-K*(double(subs((Lbar_u)')));
elseif SOG == 1
U=(double(subs(U)))-inv(double(subs(Lbar_uu_star)))*(double(subs(Lbar_u)));
end
end
end
end
L_star=((double(subs(X^2/2))))+(double(subs((U^2)/2)))-2*(double(subs(X)))-2*(double(subs(U)));
X_star=double(subs(X));
U_star=double(subs(U));
if FOG == 1
display('First order gradient method')
elseif SOG == 1
display('Second order gradient method')
end
display(X_star);display(U_star);display(L_star);display(k);
end
errors I get after running the code are:
Error using mupadmex Error in MuPAD command: DOUBLE cannot convert the input expression into a double array.
If the input expression contains a symbolic variable, use the VPA function instead.
Error in sym/double (line 702) Xstr = mupadmex('symobj::double', S.s, 0);
Error in Opt (line 3) while abs(double(subs(C))-double(subs(gamma)))>=(double(subs(eps1)))
I have no Idea what is going on. Any help would be highly appreciated

回答(1 个)

Carlos
Carlos 2013-4-4
The problem comes in
double(subs(C))
From your code
C=u1^2+3*u2^2+2*u3^2;
so when you do
subs(C)
ans =
u1^2 + 3*u2^2 + 2*u3^2
C remains unchanged, so you cannot convert a symbol to a number.
If you did
subs(C,{u1,u2,u3},{1,1,1})
ans =
6
So in conclusion you cannot convert a symbolic expression containing variables into a number.
  4 个评论
upinderjeet
upinderjeet 2013-4-4
Walter and Carlos
Thanks first of all for the quick reply. Actually If you notice the while loop the value of u1,u2 and u3 is getting changed if the certain conditions are met. So I want "C" to acquire the latest value of itself according to the updated values of u1,u2 and u3. So by using "double(subs())" command I want to accomplish that and actually everything worked fine at the end for my previous issues on which walter was helping me but this is similar and related problem but the only differnce is that X and U now are vector parameters unlike the scalar case of the past Walter.
Walter Roberson
Walter Roberson 2013-4-5
When you subs() and expect symbolic variables to be replaced by what is in the workspace, the substitution is limited to variables existing in the current workspace. In your code, u1 and so on are defined in the caller of the routine that does the subs()

请先登录,再进行评论。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by