MATLAB Matlab ODE-Solver and Constant Params

  • Thread starter Thread starter S. Moger
  • Start date Start date
  • Tags Tags
    Constant Matlab
AI Thread Summary
The discussion centers around improving a MATLAB function for solving differential equations using ode45. The initial implementation of the function, pizzaode, includes parameters defined within the function itself, leading to concerns about code clarity and organization. The user successfully refactors the code by creating a new function, pizzamaker, which allows parameters to be passed as arguments. However, there is a desire to avoid nested functions due to their complexity and the local scope of variables. Suggestions include using global variables to share parameters across functions, though this approach is met with some skepticism regarding its practicality and cleanliness. The conversation emphasizes that while code aesthetics are important, functionality should take precedence, particularly in MATLAB, where simplicity can often suffice.
S. Moger
Messages
52
Reaction score
2
Hey,

Code:
function dy = pizzaode(t, y)
    a=2;
    b=0.5;
    d=4;
    u=y(1);
    v=y(2);
    dy = nan(2,1);
    dy(1) = u*(1-u) - a*u*v/(u+d);
    dy(2) = b*v*(1-v/u);
end

Code:
[t,y] = ode45(@pizzaode, [0 100], [u(1);v(1)]);

This works but it's crap.

Why?

Code:
    a=2;
    b=0.5;
    d=4;

- Ugly code.

I want to set the params outside the function.

So ok, I did this:

Code:
function [t,y] = pizzamaker(a, b, d, u0, v0)
    

[t,y] = ode45(@pizzaode, [0 100], [u0;v0]);

function dy = pizzaode(t, y)

    u=y(1);
    v=y(2);
    dy = nan(2,1);
    dy(1) = u*(1-u) - a*u*v/(u+d);
    dy(2) = b*v*(1-v/u);
end


end


And that's nice because it works. But how would I do this without this strange nesting?
 
Physics news on Phys.org
Of course function has its own workspace. Variables are local to the function.

I'm not sure whether this will work. Try insert the statement
global a b d

in your function pizzaode.

Then before you call the function ode45 you must have the following statements
global a b d
a=2; b=0.5; d=4;
 
I would ideally want to pass them through the function pointer (or what it is) in the ode45 function call. Global variables are no fun thing either.
 
Doing it globally is the best solution I could find for a similar problem.

Don't be obsessive this is MATLAB - not C++, if it does your job, why bother?
 
sokrates said:
Doing it globally is the best solution I could find for a similar problem.

Don't be obsessive this is MATLAB - not C++, if it does your job, why bother?

:) Indeed...
 

Similar threads

Back
Top