2015-01-02 285 views
2

我在開發我的GUI來解決微分方程時遇到了問題,而且找不到該錯誤。函數Matlab中沒有足夠的輸入參數

我試圖解決的公式定義爲:

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

我收到以下錯誤:

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 

如何解決此錯誤?

回答

3

求解器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代碼應該是這樣的:

%% 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'); 
+0

感謝您的耐心knedlsepp。它的工作,但請你解釋我爲什麼這樣做: ** xprimefixedTandOmega = @(t,x)xprime(t,x,T,Omega); ** –

+0

好吧!非常感謝 –

+0

這條線修正了'T'和'Ω'值。想想你是否是求解者:「*我想得到一個函數f(t,x),我知道第一個值是時間,第二個值是此時的值,然後我會做我的魔法並返回解決方案到x'= f(t,x)*「。當你傳入一個具有4個以上參數的函數時,求解器ode45會認爲:「*嗯,我通過了一個帶有4個參數的函數,我知道第一個是時間,第二個是這個時間的值,但是我不知道其他兩個參數是什麼。「然後它只嘗試使用前兩個=>錯誤:」*沒有足夠的輸入參數。*「 – knedlsepp

相關問題