2014-10-31 90 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