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.