Drexel dragonThe Math ForumDonate to the Math Forum



Search All of the Math Forum:

Views expressed in these public forums are not endorsed by Drexel University or The Math Forum.


Math Forum » Discussions » Software » comp.soft-sys.matlab

Topic: simple harmonic oscillator using ode45 function
Replies: 9   Last Post: May 28, 2013 9:04 AM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
Steven Lord

Posts: 17,944
Registered: 12/7/04
Re: simple harmonic oscillator using ode45 function
Posted: Jan 24, 2013 9:44 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply



"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.




Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© Drexel University 1994-2014. All Rights Reserved.
The Math Forum is a research and educational enterprise of the Drexel University School of Education.