Not enough input arguments in function Matlab - 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');

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

Matlab: Error with arguments using ode solver

There is no specific error, it just simply says "error" and shows a line in ode45 that supposedly is not in line with what I have written. If someone could give me a quickfix to this problem I would be greatful. Code and error message presented below:
Code:
tstart = 0;
tfinal = 10;
y0 = [0.18; 0.10; 0; 0];
[t,y] = ode45(#secondODE,[tstart tfinal], y0);
function dy = secondODE(t,y)
dy = zeros(4,1);
dy(1) = y(2);
dy(2) = -c/A2*y(1);
dy(3) = y(4);
dy(4) = D2/B2 + c*C2/(A2*B2)*y(1);
end
Error message:
Error in ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
Error in bJAa (line 4)
[t,y] = ode45(#secondODE,[tstart tfinal], y0);

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');

Too Many Input Arguments Matlab ode45

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.