函数Matlab中的输入参数不足
我在开发GUI以解微分方程时遇到问题,我找不到错误 我试图解决的方程定义如下:函数Matlab中的输入参数不足,matlab,Matlab,我在开发GUI以解微分方程时遇到问题,我找不到错误 我试图解决的方程定义如下: T*x'+x = kSigma*heaviside(t-t0) + kSin*sin(Omega*t+alpha*pi/180). 我尝试过的方法是: function lsg = DGLvar(t,T,Omega) x = 1; kSin = 1; kSigma = 5; t0 = 0; alpha = 0; lsg = 1/T * (-x + kSigma*heaviside
T*x'+x = kSigma*heaviside(t-t0) + kSin*sin(Omega*t+alpha*pi/180).
我尝试过的方法是:
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) );
在GUI中,代码如下所示:
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')
%% 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');
我得到以下错误:
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
如何解决此错误?解算器
ode45
需要一个函数f(t,x)
作为输入,并使用该函数求解方程x'=f(t,x)
您需要使用x
作为函数DGLvar
的参数。我还建议将其重命名为xprime
,因为这更具描述性
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) );
GUI代码如下所示:
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')
%% 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');
谢谢你的耐心。它起作用了,但是你能解释一下你为什么这么做吗:xprimefixedTandOmega=@(t,x)xprime(t,x,t,Omega);好的,明白了!多谢了,这行代码修复了
T
和Omega
的值。假设你是解算器:“我想得到一个函数f(t,x)。我知道第一个值是时间,第二个值是此时的值。然后我会变魔术,将解返回到x'=f(t,x)”。当你传入一个超过4个参数的函数时,解算器ode45
会想:“嗯,我传入了一个有4个参数的函数。我知道第一个是时间,第二个是此时的值,但我不知道其他两个参数是什么。”然后它尝试只使用前两个=>错误:“输入参数不够。”