I need to plot the following functions but I receive this error "Invalid indexing or function definition. When defining a function ensure that the arguments are symbolic variables ...."
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
mohsen
am 8 Mär. 2016
Kommentiert: Walter Roberson
am 8 Mär. 2016
x = 2:30;
y = 40:60;
u = @(x,y) 10*sin(200*x)+0.1*cos(10*y)+(100*x)./y;
v = @(x,y) 10*cos(200*x)+0.1*sin(10*y)-100*(x./y);
syms x y
ex = diff(u,x);
ey = diff(v,y);
Gxy = diff(v,x)+diff(u,y);
[X,Y] = meshgrid(x,y);
Z = ex(X,Y);
figure(1)
mesh(X, Y, Z)
[X,Y] = meshgrid(x,y);
Z = ey(X,Y);
figure(2)
mesh(X, Y, Z)
[X,Y] = meshgrid(x,y);
Z = Gxy(X,Y);
figure(3)
mesh(X, Y, Z)
0 Kommentare
Akzeptierte Antwort
Walter Roberson
am 8 Mär. 2016
You have defined
x = 2:30;
y = 40:60;
but then you have
syms x y
That is equivalent to
x = sym('x');
y = sym('y');
which is to say that it overwrites x and y, and afterwards they are no longer numeric. But afterwards you sometimes treat them as symbols and sometimes treat them as numeric. In particular,
[X,Y] = meshgrid(x,y);
attempts to treat them as numeric.
You also have
u = @(x,y) 10*sin(200*x)+0.1*cos(10*y)+(100*x)./y;
v = @(x,y) 10*cos(200*x)+0.1*sin(10*y)-100*(x./y);
ex = diff(u,x);
ey = diff(v,y);
The two diff() lines attempt to take the symbolic differentiation of a MATLAB function handle. You probably cannot do that. You can differentiate a symbolic expression, and you might be able to differentiate a symbolic function, but probably not a function handle.
ex = diff(u(x,y), x);
ey = diff(v(x,y), y)
would invoke the function handles on the symbolic parameters x and y, giving a symbolic expression as a result, and that symbolic expression can be differentiated.
2 Kommentare
Walter Roberson
am 8 Mär. 2016
With x and y numeric and u a function handle, u(x,y) would be numeric, so diff(u(x,y),x) would be a numeric difference rather than a symbolic difference. When you request a numeric difference, the second parameter must be the number of times the difference is to be taken, not a variable indicating a direction. That is not going to be what you want. You need to be using symbolic expressions and to have x and y being symbolic. What you should be doing is renaming your numeric uses of x and y.
Note: you do not need to define x or y before defining a function handle that uses those names as parameters in @(x,y) . Your first need for your numeric x and y is in your meshgrid(). You also do not need to recalculate the meshgrid() since you are not changing X or Y or the numeric x or y between your meshgrid() calls. So you could just eliminate your use of x and y as numeric and directly call
[X, Y] = meshgrid(2:30, 40:60);
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Assumptions finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!