2014-10-31 80 views
0

所以我有一套我想解決的3個微分方程。他們可以在我的代碼中看到。我的問題是,我想這些代碼結合起來,這樣我可以有一個用於相對於迴路R(我們將會看到耦合difeq的數值解

我有什麼:

T2 = 1; 
[T,Y] = ode45(@ball, [0 5*T2] ,[0 0 -10]); 
figure 
plot(T,Y(:,1),'-r',T,Y(:,2),'-g',T,Y(:,3),'-b') 
legend('x(t)','y(t)','z(t)') 
xlabel('Time (in units of T2)') 
title(['Plot for RT2 = ',num2str(R)]) 

凡@ball是

`function dr = ball(t,b) 

T2 = 1; 
T1 = T2/2; 
d = 0; 
R = 0.2; 

dr = zeros(3,1); 
dr(1) = (-1/T2)*b(1)-d*b(2); 
dr(2) = (-1/T2)*b(2) + d*b(1) + R*b(3); 
dr(3) = (-1/T1)*b(3) - R*b(2) ; 

end` 

我要的是一個單獨的程序,將做到這一點,但讓我有一個for循環,所以我可以改變R和一對夫婦的次要情節。這可能嗎?

+0

''[T,Y] = ode45(@ball,[0 5 * T2],[0 0 -10],[],R);' '在函數調用中將函數改爲''function dr = ball(t,b,R)''(除去函數中的'R = 0.2'')也應該這樣做 – Nras 2014-10-31 07:51:50

回答

1

您可以使用匿名功能爲此。

變化ball.m去除硬編碼R並與輸入參數替換:

function dr = ball(t,b,R) 

T2 = 1; 
T1 = T2/2; 
d = 0; 
%// etc. 

,然後用這個替換您的ode45電話:

R=0.4; 
[T,Y] = ode45(@(t,b) ball(t,b,R), [0 5*T2] ,[0 0 -10]); 

其中@(t,b) ball(t,b,R)是一個功能輸入tb,調用ball.m,並在前一行中指定值R。所以,你可以構建for循環如下:

for R=0.2:.02:1 %// or whatever range you want 
    [T,Y] = ode45(@(t,b) ball(t,b,R), [0 5*T2] ,[0 0 -10]); 
    %// etc. 
end 
0

沒有一個匿名函數(這是得到你的結果做一個體面的方式)的使用,也可以直接在ode45 -call傳遞參數。在初始條件後,下一個參數是選項,可以留空。選項後,可以提交其他參數:

function main 

T2 = 1; 
opt = []; % // no further options 
R = 0.2; % // the parameter R to give to the function ball 
[T,Y] = ode45(@ball, [0 5*T2] ,[0 0 -10], opt, R); %% // added opt and R as parameter 
figure 
plot(T,Y(:,1),'-r',T,Y(:,2),'-g',T,Y(:,3),'-b') 
legend('x(t)','y(t)','z(t)') 
xlabel('Time (in units of T2)') 
title(['Plot for RT2 = ',num2str(R)]) 

end 


function dr = ball(t,b, R) 

T2 = 1; 
T1 = T2/2; 
d = 0; 
% R = 0.2; % // not needed anymore 

dr = zeros(3,1); 
dr(1) = (-1/T2)*b(1)-d*b(2); 
dr(2) = (-1/T2)*b(2) + d*b(1) + R*b(3); 
dr(3) = (-1/T1)*b(3) - R*b(2) ; 

end