Matlab 耦合dif方程的数值解
我有一组3个微分方程要解。它们可以在我的代码中看到。我的问题是,我想组合这些代码,这样就可以有一个关于R的for循环(如下所示) 我所拥有的:Matlab 耦合dif方程的数值解,matlab,differential-equations,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(['Plo
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)])
球在哪里
`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并生成几个子批。这可能吗?您可以使用匿名函数来实现这一点 更改
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)
是一个具有输入t
和b
的函数,该函数调用ball.m
,其值在前一行中指定为R
。因此,您可以为循环构造,如下所示:
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
在不使用匿名函数的情况下(这是完成结果的好方法),您也可以在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
[T,Y]=ode45(@ball[0.5*T2],[0-10],[0-10],]R);
在函数调用中,将函数更改为函数dr=ball(T,b,R)
(在函数中删除R=0.2
)