Date: Jan 24, 2013 9:44 AM
Author: Steven Lord
Subject: Re: simple harmonic oscillator using ode45 function



"Shane " <shane_t@hotmail.co.uk> wrote in message
news:kdrf88$fp6$1@newscl01ah.mathworks.com...
> "Steven_Lord" <slord@mathworks.com> wrote in message
> <kafm1a$c49$1@newscl01ah.mathworks.com>...


*snip*

> Hi Steve back after the winter break seen your help this is the code you
> asked for:

>>> dbtype 1:3 shm0.m
>
> 1 tspan=[0 50];
> 2 init=[-2 0];
> 3 [t,x]= ode45(shm0,tspan,init)


There are three problems here.

The first is that ODE45 expects its first input argument to be a function
handle[*] and you are calling it with whatever the shm0 function returns. If
shm0 returned a function handle, that would be okay. But this ties into the
second and third problems.

The second problem would be that before MATLAB can call ODE45 it needs to
call shm0 to determine what to pass into ODE45 as the first input. Doing
this requires shm0 to call shm0 to determine what to pass into ODE45 as the
first input. Doing this requires shm0 to call shm0 to determine what to pass
into ODE45 as the first input. ... We're going around in circles. You should
not call the ODE solvers and ask them to use the function in which you're
calling them as the ODE function first input. But actually we don't get this
far due to the third problem.

The third problem is that shm0 is a script not a function. That means that
neither this:

[t, x] = ode45(shm0, tspan, init) % Which would require shm0 to return a
value to be used as ODE45's first input, but scripts don't return values.

nor this:

[t, x] = ode45(@shm0, tspan, init) % Which would require shm0 to accept
input arguments and return an output argument when ODE45 calls it, neither
of which scripts do.

will work. If you want to keep shm0 a script, modify your ODE45 call to use
a function handle to a SEPARATE function to evaluate the right-hand side of
your system of ODEs. Personally, so that I could use a subfunction for that
purpose and not have to create a separate file, I'd turn shm0 into a
function.


% begin shm0.m
function [t, x] = shm0
tspan = [0 50];
init = [-2 0];
[t, x] = ode45(@myODEfun, tspan, init);

function yprime = myODEfun(t, y)
% Evaluate the RHS of your ODE system here

% end shm0.m


--
Steve Lord
slord@mathworks.com
To contact Technical Support use the Contact Us link on
http://www.mathworks.com

[*] Yes, I know ODE45 _can_ accept things other than function handles as its
first input, but I recommend that you don't call the ODE solvers with
anything but some flavor ("named" or anonymous) of function handle.