Error in using ode45 to solve a second-order ODE

1 次查看(过去 30 天)
I am trying to solve a fairly simple second-order ODE using the ode45 command. I've read the documentation and created a file containing the function to be solved, having reduced it to state space form. The file is called function1dof.m
m = 12.319*0.25*0.036;
g = 386.1; % inch/s^2
L = 8.6; Lc = L/2;
I = 0.653*2;
u = 0.5; % Torque input in lb-in
function func = F(t,x)
func = zeros(2,1);
func(1) = x(2);
func(2) = (1/(Lc^2 + I))*(u - m*g*Lc*sin(x(1)));
end
Then, I created a second .m file, called solver1dof.m, to execute the ode45 command and (hopefully) solve the equation.
clear all
time_period = [0 2];
initial = [0, 0];
[t,x] = ode45(@F, time_period, initial);
However, running solver1dof.m gives an error claiming the function 'F' is undefined:
>> solver1dof
Undefined function or variable 'F'.
Error in odearguments (line 90)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
Error in solver1dof (line 4)
[t,x] = ode45(@F, time_period, initial);
I am unsure on how to proceed, as it seems the function is perfectly well defined, as far as I can tell (obviously, it isn't).

采纳的回答

Steven Lord
Steven Lord 2018-8-23
As stated in this documentation page, "Local functions are only visible within the file where they are defined, both to the script code and other local functions within the file. They are not visible to functions in other files, and cannot be called from the command line." The local function F defined inside the script file function1dof is not visible to script file solver1dof.
If you created a function handle to F inside function1dof, executed function1dof, and used that function handle variable inside solver1dof then the ode45 call inside solver1dof could start. But the variables defined in the script file function1dof are not visible inside the function F, so you will receive an error about an undefined function or variable Lc when ode45 tries to call F using the function handle.
Either move the definitions of those variables into F itself (at which point you might as well just make function1dof a function file rather than a script file) or define them in solver1dof and pass them into F as parameters.
  3 个评论
Steven Lord
Steven Lord 2018-8-23
Now that you've made function1dof into a function file (its first executable line starts with the function keyword) you don't need to execute it first. However, know that MATLAB will know that function by the name function1dof (its file name) as opposed to F (the name used in the function declaration line.) When they differ, the file name trumps the function declaration line.
So you're going to need to use @function1dof in your ode45 call.
Chinmay Sridhar
Chinmay Sridhar 2018-8-23
It works now! Thank you for being patient, I realize these are very simple problems.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Programming 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by