Plotting 3d ODE

조회 수: 11(최근 30일)
matlab_day
matlab_day 2021년 1월 28일
댓글: Star Strider 2021년 10월 2일
I have to following code designed to plot and ODE system of 3 variables with respect to t.
t_start = 0; t_end = 50000; %set suitable time range
t_duration = [t_start t_end]; %create vector for time
[w(:,1), w(:,2), w(:,3)] = meshgrid([-1:0.1:1;],[-1:0.1:1;], [-1:.1, 1]); %create grid
w_initial = [-1; .1; -.1]; %column vector containing initial values
[t, w] = ode23(@thefunc, t_duration, w_initial);
surf(w(:,1),w(:,2), w(:,3));
function wdot = thefunc(t, w)
a = .5;
b = .4;
c = -.75;
c_0 = -1;
A = .5; %greek variable alpha
wdot = zeros(3, 1);
wdot = [a*w(2)*w(3) - A*w(1).^3;
b*w(3)*w(1) - A*w(2).^3;
c*w(1)*w(2) + w(1)*w(2) - A*w(3) - w(1)*w(2)*(-c_0.^2*b*w(1) - c_0.^2*a*w(2).^2 + c_0*A*w(1)^2 + c_0*A*w(2).^2 - c_0*A+ c)];
end
I get the error message Unable to perform assignment because the size of the left side is 9977-by-1 and the
size of the right side is 21-by-21-by-3. in the line with the meshgrid, and I'm not sure how to fix it.

답변(2개)

Star Strider
Star Strider 2021년 1월 28일
First, delete the meshgrid call, since it is not necessary here. The ode23 call produces vectors, not a surface.
Second, plot this instead:
figure
stem3(w(:,1),w(:,2), w(:,3), '.');
grid on
xlabel('w_1(t)')
ylabel('w_2(t)')
zlabel('w_3(t)')
The stem3 plot gives a bit more information than plot3 would.
.
  댓글 수: 1
Star Strider
Star Strider 2021년 10월 2일
UPDATE — (2 Oct 2021 at 10:46)
With the online Run feature now enabled (not available until June 2021), the code becomes —
t_start = 0; t_end = 50000; %set suitable time range
t_duration = [t_start t_end]; %create vector for time
w_initial = [-1; .1; -.1]; %column vector containing initial values
[t, w] = ode23(@thefunc, t_duration, w_initial);
figure
stem3(w(:,1),w(:,2), w(:,3), '.');
grid on
xlabel('w_1(t)')
ylabel('w_2(t)')
zlabel('w_3(t)')
function wdot = thefunc(t, w)
a = .5;
b = .4;
c = -.75;
c_0 = -1;
A = .5; %greek variable alpha
wdot = zeros(3, 1);
wdot = [a*w(2)*w(3) - A*w(1).^3;
b*w(3)*w(1) - A*w(2).^3;
c*w(1)*w(2) + w(1)*w(2) - A*w(3) - w(1)*w(2)*(-c_0.^2*b*w(1) - c_0.^2*a*w(2).^2 + c_0*A*w(1)^2 + c_0*A*w(2).^2 - c_0*A+ c)];
end
With the desired 3D plot.
.

댓글을 달려면 로그인하십시오.


VBBV
VBBV 2021년 10월 2일
t_start = 0; t_end = 5000; %set suitable time range
t_duration = [t_start t_end]; %create vector for time
% [w(:,1), w(:,2), w(:,3)] = meshgrid([-1:0.1:1;],[-1:0.1:1;], [-1:.1, 1]); %create grid
w_initial = [-1; .1; -.1]; %column vector containing initial values
[t, w] = ode23(@thefunc, t_duration, w_initial);
plot(t,w(:,1),t,w(:,2),t,w(:,3),'linewidth',2); grid
function wdot = thefunc(t, w)
a = .5;
b = .4;
c = -.75;
c_0 = -1;
A = .5; %greek variable alpha
wdot = zeros(3, 1);
wdot = [a*w(2)*w(3) - A*w(1).^3;
b*w(3)*w(1) - A*w(2).^3;
c*w(1)*w(2) + w(1)*w(2) - A*w(3) - w(1)*w(2)*(-c_0.^2*b*w(1) - c_0.^2*a*w(2).^2 + c_0*A*w(1)^2 + c_0*A*w(2).^2 - c_0*A+ c)];
end
simple plot would also suffice, if you know axis variables correctly

Community Treasure Hunt

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

Start Hunting!

Translated by