Initial conditions on ODE45 ?

Im trying to solve this IVP: e^y +(t*e^y - sin(y))*(dy/dt)=0 with the initial condition y(2)=1.5.
I was just not sure how to do it with the initial condition with Y(2)=1.5, iknow how to do it if it were y(0)=1.5:
f= @(t,y) (exp(y)+(t.*exp(y)-sin(y))); % This is the function.
[t,y]=ode45(f, [0.5,4], 1.5); % trange is from 0.5 to 4
plot(t,y)
can someone please help me out?

 Accepted Answer

Jan
Jan on 30 Jul 2011
This uses the initial value y(0.5)=1.5 ( not y(0)=1.5):
[t, y] = ode45(f, [0.5, 4], 1.5);
So for y(2)=1.5:
[t, y] = ode45(f, [2, 4], 1.5);
Note: The initial value problem starts at the inital point.
[EDITED]: The call to ODE45 is equivalent, if the problem is formulated in backward direction - an "final value problem": tspan is still [ti, tf], but now ti > tf.

9 Comments

ok thank you for that, but the problem also asks me to plot from the t interval 0.5 to 4....this means anything before t=2 does not show on the graph because I guess there are no values for x and y before that initial condition? how can I do this still using ODE45 and still wtih the initial condition y(2)=1.5?
furthermore....I need to approximate what the value for y is at x=1, 1.5 and 3....
...from what I have read I understand that ODE is a time step numerical solver....I really dont see how it could go backward in time?
Jan
Jan on 30 Jul 2011
You have y(2)=1.5 and you want to get y(0.5). And you want to go backward in time. What about:
[t, y] = ode45(f, [2, 0.5], 1.5)
Take a look in the Runge-Kutta-Algorithm. You will find only linear dependencies to t. So you can run the integrator in reverse direction in theory. MATLAB's ODE45 is smart enough to allow this in practize also.
Another idea is to transform t -> -t in the ODE function and modify the integration limits accordingly.
If you want y to specific times, look at the tspan argument of ODE45. BTW. reading "help ODE45" is a good idea in every case.
I am not exactly sure if you were getting at the same thing, when you say "run the integrator in reverse direction". But Basically this is what I was able to think of.
I have y'(t)=f(t,y(t)) with initial value y(2)=1.5.
I can define z(t)=y(-t).
Then I notice that z(-2)=y(2)=1.5 and z'(t) = -y'(-t)= -f(-t,y(-t))=-f(-t,z(t)).
That is z solves z'(t)=-f(-t,z(t)). Now, how do I use ode45 to find the solution to z'(t)=-f(-t,z(t)) with initial condition z(-2)=1.5 on the interval t=[-2,-1], so hen y(t) on [1,2] can be recovered via y(t)=z(-t)?
Jan
Jan on 31 Jul 2011
@Robin: Did you read my comment above?! Did you read the help text of ODE45? There you find: "tspan: A vector specifying the interval of integration [t0, tf]. To obtain solutions at specific times (all increasing or decreasing), use tspan = [t0, t1, ..., tf]".
So simply use [2.0, 0.5] for tspan to get the y trajectory from t=2 to t=0.5. Then you can check if your t -> -t transformation lead to the same result (which is correct at first glance).
I've figured it out. Thank you for your help :)
Liu Langtian comments to Jan Simon
right
Example Code
Use ode45() to find the approximate values of the solution at t in the range of 1 to 3
function ydot = eqns(t,y)
ydot=(t-exp(-t))/(y+exp(y));
end
###################################
%%Code
[t1,y1]=ode45(@eqns,[1.5 1], 0.5);
hold on;
[t2,y2]=ode45(@eqns,[1.5 3], 0.5);
hold off
t=[t1;t2];
y=[y1;y2];
plot(t,y,'-o')

Sign in to comment.

More Answers (1)

Subha Fernando
Subha Fernando on 26 Oct 2011
let say function is dy/dt = y (t-y).
If initial condition is given at y(1) = 0.5 not at y(0) then we define the RHS as
function output = funcRHS(t, y) output = y *(t-y); end
%then u can call
hold on ode45('funcRHS', [1, -1], 0.5) ode45('funcRHS', [1,5], 0.5)
%Here you can see and read the initial value at y(0) also

Asked:

on 30 Jul 2011

Community Treasure Hunt

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

Start Hunting!