# I need to run a surface diagram for variables using any 2 parameters. The following is the code for 2D plots. Please help me to run surf plot in MATLAB.

2 views (last 30 days)
T K on 20 Dec 2022
Moved: Voss on 28 Dec 2022
Error that appear when run the code:
Error in proj (line 20)
surf(a_vec,t,squeeze(X(:,1,:))) ;
Code below:
options = odeset('RelTol',1e-6,'Stats','on');
%initial conditions
Xo = [0.5;0.7;2];
% Choose parameters t and a?
tspan =linspace(0,100);
a_vec = 0.01:0.005:0.03;
for idx = 1:numel(a_vec)
% Collect all X values into a 3D matrix. Additional parameters to
% TestFunction can be added after ode45 options
[t,X(:,:,idx)] = ode45(@TestFunction,tspan,Xo,options,a_vec(idx));
end
34 successful steps 0 failed attempts 205 function evaluations 34 successful steps 0 failed attempts 205 function evaluations 34 successful steps 0 failed attempts 205 function evaluations 34 successful steps 0 failed attempts 205 function evaluations 34 successful steps 0 failed attempts 205 function evaluations
% figure
% plot(t, X(:,1), 'red')
% hold on % keeps all three plots on the axes
% plot(t, X(:,2), 'blue')
% plot(t, X(:,3), 'red')
figure
surf(a_vec,t,squeeze(X(:,1,:))) ;
% Squeeze removes dimensions of size 1, turning this slice into a 2d matrix
function [dx_dt]= TestFunction(~,x,a)
r=0.05; k=0.1; %a=0.02;
m=0.02; b=0.2; eta=0.06; h=1;
dx_dt(1)=r.*x(1).*(1-(x(1)./k))-a.*x(1).*x(3)+x(3).*eta;
dx_dt(2)=a.*x(1).*x(3)-m.*x(2)-b.*x(2)+h.*eta;
dx_dt(3)=b.*x(2)-eta.*x(3)-r.*x(1);
dx_dt = dx_dt';
end

Karim on 20 Dec 2022
Hi see below for some comments in the code on how to set the dimmensions to call the surf command.
options = odeset('RelTol',1e-6,'Stats','on');
% initial conditions
Xo = [0.5; 0.7; 2];
% choose parameters t and a
tspan = linspace(0,100);
a_vec = 0.01 : 0.005 : 0.03;
% ease the coding and readability
num_t = numel(tspan);
num_a = numel(a_vec);
num_x = numel(Xo);
% allocate output
X = zeros(num_t,num_x,num_a);
for idx = 1:num_a
% Collect all X values into a 3D matrix. Additional parameters to
% TestFunction can be added after ode45 options
[t,X(:,:,idx)] = ode45(@TestFunction,tspan,Xo,options,a_vec(idx));
end
34 successful steps 0 failed attempts 205 function evaluations 34 successful steps 0 failed attempts 205 function evaluations 34 successful steps 0 failed attempts 205 function evaluations 34 successful steps 0 failed attempts 205 function evaluations 34 successful steps 0 failed attempts 205 function evaluations
% make sure we have the proper dimmensions before calling surf
plot_t = repmat(t,1,num_a);
plot_a = repmat(a_vec,num_t,1);
plot_x = squeeze(X(:,1,:));
% create the surf plot
figure
surf(plot_t,plot_a,plot_x)
xlabel('t values')
ylabel('a values')
zlabel('x values')
grid on
function [dx_dt]= TestFunction(~,x,a)
r=0.05; k=0.1; %a=0.02;
m=0.02; b=0.2; eta=0.06; h=1;
dx_dt(1)=r.*x(1).*(1-(x(1)./k))-a.*x(1).*x(3)+x(3).*eta;
dx_dt(2)=a.*x(1).*x(3)-m.*x(2)-b.*x(2)+h.*eta;
dx_dt(3)=b.*x(2)-eta.*x(3)-r.*x(1);
dx_dt = dx_dt';
end
Karim on 22 Dec 2022
Moved: Voss on 28 Dec 2022
you are welcome, if it works you can consider to accept my answer so that it might help other people as well.
T K on 22 Dec 2022
Moved: Voss on 28 Dec 2022
Certainly, naturally