Too Many Input Arguments Matlab ode45 - matlab

I am trying to write a simple Matlab code to model a projectile. Whenever I try to run the code I get an error saying there are too many input arguments. I am running the code with
model1(44.7, 45)
function[] = model1(vel, angle)
close all;
tspan = [0 3];
x0 = [0; 0.915; vel*cos(angle); vel*sin(angle)];
[x] = ode45(#ball, tspan, x0);
function xdot = ball(x)
g = 9.81;
xdot = [x(3); x(4); 0; -g];
end
end
Error using model1/ball
Too many input arguments.
Error in odearguments (line 87)
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 model1 (line 9)
[x] = ode45(#ball, tspan, x0);
I'd appreciate any advice!

The error was (what I also committed many times in the past) that you have to pass the independent variable (time, in this case) too.
function [t, x] = model1(vel, angle)
tspan = [0 3];
x0 = [0; 0.915; vel*cos(angle); vel*sin(angle)];
[t, x] = ode45(#ball, tspan, x0);
end
function xdot = ball(t,x)
g = 9.81;
xdot = [x(3); x(4); 0; -g];
end
I modified your code to return the solution and the corresponding time steps. Moreover, I removed ball to be a nested function.

Related

Why this function not getting called?

%% ----------Chua.m----------
function out = chua(t,in)
x = in(1);
y = in(2);
z = in(3);
alpha = 15.6;
beta = 28;
m0 = -1.143;
m1 = -0.714;
h = m1*x+0.5*(m0-m1)*(abs(x+1)-abs(x-1));
xdot = alpha*(y-x-h);
ydot = x - y+ z;
zdot = -beta*y;
out = [xdot ydot zdot]';
end
% ----------StartChua.m----------
% [t,y] = ode45(#Chua,[0 100],[0.7 0 0]);
% plot3(y(:,1),y(:,2),y(:,3))
% grid
Everytime when I use [t,y] = ode45(#Chua,[0 100],[0.7 0 0]); I get an error:
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);
Also in the code it tells me, the function might be unused. I dont get it, this code should work.
I am on the right path, that I know, also I am not using anthing that can't be compiled.

Error while solving State space equations using ode45

My code should output me a column vector of X at the end of the program.I'm getting a lot of errors.
Please help!
clc;
clear;
t0=0;
tend=.001;
T=[t0 .00005];
T1=[.00005 tend];
temp=1;
X(:,1) = [0;0;0;0];
for k=1:2
for i= temp:50*(k)
[T,X]=ode45(#(T,X)sys(T,X,A1,B1),T,X(:,1));
else
[T1,X1]=ode45(#(T1,X1)sys1(T1,X1,A0,B0),T1,X(:,end));
end
end
temp=50;
end
function Xdot = sys(T,X,A1,B1,U)
Xdot= A1*X + B1*U;
end
function Xdot = sys1(T1,X,A0,B0,U)
Xdot= A0*X + B0*U;
end
The errors are as follows:
Not enough input arguments.
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);
It looks like you are not setting the argument U to the functions sys and sys1.
I have highlighted the corresponding places below with <U missing>:
if sw(i)==0 && X(2,i)> vdon || sw(i)==1 && X(1,i)>0
sw(i+1)=1;
[T,X] = ode45( #(T,X) sys(T,X,A1,B1, <U missing> ), T, X(:,1) );
else
sw(i+1)=0;
[T1,X1] = ode45( #(T1,X1) sys1(T1,X1,A0,B0, <U missing> ), T1, X(:,end) );
end

I am trying to write this function for ode. But it always gives me an error as not enough input arguments. Here is my code associated: [duplicate]

I'm having a problem developing my GUI to solve a differential equation and I can not find the error.
The equation I'm trying to solve is defined by:
T*x'+x = kSigma*heaviside(t-t0) + kSin*sin(Omega*t+alpha*pi/180).
The approach I have tried is:
function lsg = DGLvar(t,T,Omega)
x = 1;
kSin = 1;
kSigma = 5;
t0 = 0;
alpha = 0;
lsg = 1/T * (-x + kSigma*heaviside(t-t0) + kSin*sin(Omega*t+alpha*pi/180) );
In the GUI the code looks like this:
function pushbutton1_Callback(hObject, ~, handles)
t=[0 100];
periode=get(handles.sliderT,'value');
Omega=get(handles.slideromega,'value');
[x,t]=ode45(#DGLvar,t,periode,Omega);
plot(handles.axes2,x,t,'g')
I'm getting the following error:
Error using DGLvar (line 8)
Not enough input arguments.
Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in PT1>pushbutton1_Callback (line 218)
[x,t]=ode45(#DGLvar,t,periode,Omega);
Error in gui_mainfcn (line 95)
feval(varargin{:});
Error in PT1 (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in #(hObject,eventdata)PT1('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating uicontrol Callback
How can I resolve this error?
The solver ode45 expects as input a function f(t,x) and uses this to solve the equation x'=f(t,x).
You need to use x as a parameter for your function DGLvar. I would also recommend renaming it to xprime, as this is more descriptive.
function xp = xprime(t,x,T,Omega)
kSin = 1;
kSigma = 5;
t0 = 0;
alpha = 0;
xp = 1/T * (-x + kSigma*heaviside(t-t0) + kSin*sin(Omega*t+alpha*pi/180) );
The GUI code would look like this:
%% Get the GUI values:
tspan = [0 100];
x0 = 0;
T = get(handles.sliderT, 'value');
Omega = get(handles.slideromega, 'value');
%% Define a function with two parameters #(t,x) for ode45.
xprimefixedTandOmega = #(t,x) xprime(t, x, T, Omega);
%% Solve the equation: x' = xprimefixedTandOmega(t,x), x(0)=0 for t=0...100.
[t,x] = ode45(xprimefixedTandOmega, tspan, x0);
%% Plot the result of solver
plot(handles.axes2, t, x, 'g');

Not enough input arguments in function Matlab

I'm having a problem developing my GUI to solve a differential equation and I can not find the error.
The equation I'm trying to solve is defined by:
T*x'+x = kSigma*heaviside(t-t0) + kSin*sin(Omega*t+alpha*pi/180).
The approach I have tried is:
function lsg = DGLvar(t,T,Omega)
x = 1;
kSin = 1;
kSigma = 5;
t0 = 0;
alpha = 0;
lsg = 1/T * (-x + kSigma*heaviside(t-t0) + kSin*sin(Omega*t+alpha*pi/180) );
In the GUI the code looks like this:
function pushbutton1_Callback(hObject, ~, handles)
t=[0 100];
periode=get(handles.sliderT,'value');
Omega=get(handles.slideromega,'value');
[x,t]=ode45(#DGLvar,t,periode,Omega);
plot(handles.axes2,x,t,'g')
I'm getting the following error:
Error using DGLvar (line 8)
Not enough input arguments.
Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in PT1>pushbutton1_Callback (line 218)
[x,t]=ode45(#DGLvar,t,periode,Omega);
Error in gui_mainfcn (line 95)
feval(varargin{:});
Error in PT1 (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in #(hObject,eventdata)PT1('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating uicontrol Callback
How can I resolve this error?
The solver ode45 expects as input a function f(t,x) and uses this to solve the equation x'=f(t,x).
You need to use x as a parameter for your function DGLvar. I would also recommend renaming it to xprime, as this is more descriptive.
function xp = xprime(t,x,T,Omega)
kSin = 1;
kSigma = 5;
t0 = 0;
alpha = 0;
xp = 1/T * (-x + kSigma*heaviside(t-t0) + kSin*sin(Omega*t+alpha*pi/180) );
The GUI code would look like this:
%% Get the GUI values:
tspan = [0 100];
x0 = 0;
T = get(handles.sliderT, 'value');
Omega = get(handles.slideromega, 'value');
%% Define a function with two parameters #(t,x) for ode45.
xprimefixedTandOmega = #(t,x) xprime(t, x, T, Omega);
%% Solve the equation: x' = xprimefixedTandOmega(t,x), x(0)=0 for t=0...100.
[t,x] = ode45(xprimefixedTandOmega, tspan, x0);
%% Plot the result of solver
plot(handles.axes2, t, x, 'g');

Second Order Diff Eq with ode45 in Matlab

So I need to solve x''(t) = -x(t)^p with initial conditions x(0)= 0 and v(0) = x'(0) = v_o = 1.
The value of the parameter p is 1.
This is what I have:
function [t, velocity, x] = ode_oscilation(p)
y=[0;0;0];
% transform system to the canonical form
function y = oscilation_equation(x,p)
y=zeros(2,1);
y(1)=y(2);
y(2)=-(x)^p;
% to make matlab happy we need to return a column vector
% so we transpose (note the dot in .')
y=y.';
end
tspan=[0, 30]; % time interval of interest
[t,velocity,x] = ode45(#oscilation_equation, tspan, 1);
t = y(:,1);
xposition=y(:,3);
velocity=y(:,2);
end
and this is the error message I receive:
ode_oscillation(1)
Error using odearguments (line 91)
ODE_OSCILLATION/OSCILATION_EQUATION must return a
column vector.
Error in ode45 (line 114)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0,
odeArgs, odeFcn, ...
Error in ode_oscillation (line 17)
[t,velocity,x] = ode45(#oscilation_equation, tspan,1);
There's a few things going wrong here. First, from help ode45:
ode45 Solve non-stiff differential equations, medium order method.
[TOUT,YOUT] = ode45(ODEFUN,TSPAN,Y0) with TSPAN = [T0 TFINAL] integrates
the system of differential equations y' = f(t,y) from time T0 to TFINAL
with initial conditions Y0.
Note that ode45 expects a function f(t,y), where size(t) == [1 1] for time and size(y) == [1 N] or [N 1] for solution values. Your oscilation_equation has the order of input arguments inverted, and you input a constant parameter p instead of time t.
Also, the initial conditions Y0 should have the same size as y; so size(y0) == [N 1] or [1 N]. You just have 1, which is clearly causing errors.
Also, your output arguments t, xposition and velocity will be completely ignored and erroneous, since y is not set as output argument from ode45, and most of all, their names do not correspond to ode_oscilation's output arguments. Also, their order of extracting from columns of y is incorrect.
So, in summary, change everything to this:
function [t, v, x] = ode_oscilation(p)
% initial values
y0 = [0 1];
% time interval of interest
tspan =[0 30];
% solve system
[t,y] = ode45(#(t,y) [y(2); -y(1)^p], tspan, y0);
% and return values of interest
x = y(:,1);
v = y(:,2);
end