Unable to perform assignment

6 次查看(过去 30 天)
I have code that compiles for t=4. For t greater than 4 the following error message appears:
"Unable to perform assignment because the left and right sides have a different number of elements"
The code is:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t=5;
syms u10 u9 u8 u7 u6 u5 u4 u3 u2 u1;
syms x10 x9 x8 x7 x6 x5 x4 x3 x2 x1;
syms y10 y9 y8 y7 y6 y5 y4 y3 y2 y1;
a12 =0.8;
a13=0.05;
b21 =0.6;
u=[];x=[];y=[];
for j=1:1:t+1
u = [u; sym(['u' num2str(j)])];
x = [x; sym(['x' num2str(j)])];
y = [y; sym(['y' num2str(j)])];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
J(t+1)=0;
for N=t:-1:1
sis1 = x(N)+a12*y(N)-a13*x(N)*y(N);
sis2 = y(N)-a12*y(N)+b21*u(N)+a13*x(N)*y(N);
Func =u(N)^2+3*y(N);
JJ(N) = subs(Func + J(N+1), {x(N+1),y(N+1)},{sis1,sis2});
JJ1(N)=simplify(JJ(N));
b1(N) = diff(JJ1(N), u(N));
[p1(N)] = solve(b1(N), u(N));
[p(N)] = simplify(p1(N));
J1(N) = subs(JJ(N), {u(N)}, {p(N)});
J(N) = simplify(J1(N));
end
Unable to perform assignment because value of type 'sym' is not convertible to 'double'.

Caused by:
Error using mupadengine/feval2char
Unable to convert expression containing symbolic variables into double array. Apply 'subs' function first to substitute values for variables.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Thanks.
  2 个评论
Dyuman Joshi
Dyuman Joshi 2024-4-18
Dynamically defining variables is not a good idea, as you have done here -
syms u10 u9 u8 u7 u6 u5 u4 u3 u2 u1;
syms x10 x9 x8 x7 x6 x5 x4 x3 x2 x1;
syms y10 y9 y8 y7 y6 y5 y4 y3 y2 y1;
and here -
u=[];x=[];y=[];
for j=1:1:t+1
u = [u; sym(['u' num2str(j)])];
x = [x; sym(['x' num2str(j)])];
y = [y; sym(['y' num2str(j)])];
end
A better method is to define a symbolic array like this, so that you can define all of them in a single command (as I have done below) -
syms u [1 10]
u
u = 
And use indexing to access the individual variables -
u(1)
ans = 
%Define them collectively in a single command
syms u x y [1 10]
As for the error occuring in the 2nd for loop, it is not clear to me what the objective is or what you want to do, thus I can not suggest anything other than correcting the size of preallocated variable.
JRC
JRC 2024-4-18
Thank you for the symbolic command that simplifies the expression, but did not solve the problem. The problem is in looping since I cannot compile for t equal to 5, for example.

请先登录,再进行评论。

采纳的回答

Walter Roberson
Walter Roberson 2024-4-18
移动:Walter Roberson 2024-4-18
t=5;
syms u10 u9 u8 u7 u6 u5 u4 u3 u2 u1;
syms x10 x9 x8 x7 x6 x5 x4 x3 x2 x1;
syms y10 y9 y8 y7 y6 y5 y4 y3 y2 y1;
a12 =0.8;
a13=0.05;
b21 =0.6;
u=[];x=[];y=[];
for j=1:1:t+1
u = [u; sym(['u' num2str(j)])];
x = [x; sym(['x' num2str(j)])];
y = [y; sym(['y' num2str(j)])];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
J(t+1) = sym(0);
P1 = zeros(1,t,'sym');
for N=t:-1:1
fprintf('N = %d\n', N);
sis1 = x(N)+a12*y(N)-a13*x(N)*y(N);
sis2 = y(N)-a12*y(N)+b21*u(N)+a13*x(N)*y(N);
Func =u(N)^2+3*y(N);
JJ(N) = subs(Func + J(N+1), {x(N+1),y(N+1)},{sis1,sis2});
JJ1(N)=simplify(JJ(N));
b1(N) = diff(JJ1(N), u(N));
sol = solve(b1(N), u(N));
if isempty(sol)
fprintf('warning: for N = %d there are no solutions\n', N);
p1(N) = sym(NaN);
else
if numel(sol) > 1
fprintf('warning: for N = %d, there are %d solutions\n', N, numel(sol));
else
fprintf('warning: for N = %d, there is the expected single solution\n', N);
end
p1(N) = sol(1);
end
[p(N)] = simplify(p1(N));
J1(N) = subs(JJ(N), {u(N)}, {p(N)});
J(N) = simplify(J1(N));
end
N = 5
warning: for N = 5, there is the expected single solution
N = 4
warning: for N = 4, there is the expected single solution
N = 3
warning: for N = 3, there is the expected single solution
N = 2
warning: for N = 2, there is the expected single solution
N = 1
warning: for N = 1, there are 5 solutions

更多回答(0 个)

Community Treasure Hunt

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

Start Hunting!

Translated by