Solving nonlinear DE by reduction of order on matlab

Nice of you all to answer my question.
I tried to graph the nonlinear ordinary DE in a textbook(Advanced Engineering Mathematics 6th Ed by Zill Wright).\
the DE is like this.
dy/dx = u
du/dx = x + y - y^2
Written the codes like below, but only gained 2 graphs each.
[sourcecode]
function dydt = odesys(t, y)
dydt(1) = y(1);
dydt(2) = t + y(2) - y(2)^2;
dydt = [dydt(1); dydt(2)];
end
[command]
[t, y] = ode45(@odesys, [-1 1], [-1 1])
plot(t, y);
grid
I want to get the graph as on the textbook, like the picture right below.(In case of copyright, I couldn't get original picture in the book)
What is wrong with my code?

 Accepted Answer

There are some typos in your description of the problem. Here the correct version
% your ODE - note that (y(1) and y(2) are exchanged)
odesys = @(t,y)[y(2); t+y(1)-y(1)^2];
% soluiton - note that the time span is [0 10] and the initial conditions
% are set for t = 0;
[t, y] = ode45(odesys, [0 10], [-1 1]);
% plot
figure, plot(t,y(:,1));
grid on

3 Comments

Appreciate your help! Can I ask you two things more?
  1. The function ode45 has the 2x1 size vector input, and returning 2x1 size vector output to the variable y as far as I know. But how could it possible for the plot function to use 2x1 vector output(from the ode45 function) as it draws the graph on ty plane? In other words, if the plot function matches the two input variable to one-to-one on ty plane, is it normal to draw two graphs rather than one?
  2. About the function handler. What does the 'handler' mean? I once read the instruction for the handler, but I can't fully grasp what does it mean. Is it a kind of function pointer(or reference variable) pointing to anonymous function?
My pleasure. Regarding your questions
  1. the return outputs are the arrays t and y. The dimensions of t are Nx1, being N the number of time steps. This number is not known a priori, since ode45 uses adaptive step size. The dimensions of y is NxM, where M is the number of variables in your ODE. In this case M = 2. I understood you wanted only y(:,1), that is the variable y in your model.
  2. your way to call ode45 was correct, because you defined your ODE as an external function. I defined the model inline with an anonymous function. The data type of the anonymous function is a function_handle, so the @ symbol was not required in the call.
Thank you again! Very helpful for me to be handling MATLAB better. Have a good day!

Sign in to comment.

More Answers (0)

Categories

Products

Release

R2020b

Community Treasure Hunt

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

Start Hunting!