0

我在 MATLAB 中工作,但我对微分方程系统有疑问。我的系统是dvdt = (-2*T)-4*v并且dTdt = 6*T+v我想使用四阶的 Runge-Kutta 来解决它。我写了以下代码:

如果我只运行函数odefun,我的代码就可以工作!但是如果我运行完整的程序,我的代码就不起作用:

clear all

yy=@(t,y)[dvdt;dTdt]
[t,y]= ode45(@(t,y)yy,[0 1.5],[1 1/2 ]);



function res = odefun(t , y )
% i define two variable i will use: v and TT
v = y(1,:);
T = y(2,:);

% i define the two partial derivative:

res(1,:) = dvdt
res(2,:) = dTdt

dvdt = (-2*T)-4*v
dTdt = 6*T+v;

end

这是我的结果。我不知道要写一个正确长度的向量:

使用 odearguments 时出错(第 95 行)@(T,Y)YY 返回长度为 1 的向量,但初始条件向量的长度为 2。@(T,Y)YY 返回的向量和初始条件向量必须具有相同数量的元素。

ode45 错误(第 115 行)

sys_ode 中的错误(第 4 行)[t,y]= ode45(@(t,y)yy,[0 1.5],[1 1/2 ]);

4

1 回答 1

1

y从 ode45 传递到 odefun 是一个扁平的一维数组。像处理二维数组一样分配变量是没有意义的。应该是v=y(1); T=y(2);

在代码块中,您需要观察因果关系。您需要先声明/定义一个变量,然后才能在另一个代码行中使用它。

如果不调用 odefun,您将不会收到错误,因为 odefun 中的每一行在语法上都是正确的。但是,由于语义错误,您会在执行过程中遇到错误。

尝试

clear all

[t,y]= ode45(odefun,[0 1.5],[1 1/2 ]);

function res = odefun(t , y )
    % i define two variable i will use: v and T
    v = y(1);
    T = y(2);

    % i define the two derivatives:
    dvdt = (-2*T)-4*v
    dTdt = 6*T+v;

    res = [ dvdt  dTdt ]
end




于 2019-09-01T16:39:19.330 回答