耦合差分的数值解

时间:2014-10-31 02:06:24

标签: matlab differential-equations

所以我有一套我要解决的3种差异。他们可以在我的代码中看到。我的问题是,我想要组合这些代码,这样我就可以有一个关于R的for循环(如图所示。

我有什么:

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并制作几个子图。这有可能吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果不使用匿名函数(这是完成结果的好方法),您也可以直接在ode45 - 调用中传递参数。在初始条件之后,下一个参数是选项,可以留空。选项之后,可以提交其他参数:

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