MATLAB ODE求解器随处可见0

时间:2013-10-17 18:51:41

标签: matlab numerical ode

我的代码在我的解决方案向量中给我零,但我不知道为什么。我已经将耦合的二阶ODE分解为4个一阶ODE。

我的功能定义为xp.m

function zprime = f(t,z)
a = 1;
b = 1;
c = 1.5;

zprime = zeros(4,1);

zprime(1) = z(2);
zprime(2) = -a*z(1) + b*(z(3) - z(1));
zprime(3) = z(4);
zprime(4) = -c*(z(3) - z(1));
end

我使用以下命令在matlab中运行它:

[t,z] = ode45('xp',[1,100],[0 0 0 0]);

因为我的初始条件都是0.这是我的初始条件给出0解决方案还是别的?当我更改ic时,解决方案会按预期更改。

由于

2 个答案:

答案 0 :(得分:4)

对于您的特定情况,使用I.C.s z_0 = [0,0,0,0],解决方案应该是稳定的,值为z_out = [0,0,0,0]。当您插入z = z_0并通过ODE解算器运行它时,只需看一下您的函数。

zprime(1) = z(2);                       % --->  0
zprime(2) = -a*z(1) + b*(z(3) - z(1));  % ---> -a*(0) + b*(0)
zprime(3) = z(4);                       % ---> 0
zprime(4) = -c*(z(3) - z(1));           % ---> -c*(0-0) = 0

请记住数值解的一般前提。您采取初始条件,并将其输入衍生公式。这会告诉您要解决的函数的斜率。您可以使用该斜率来确定函数在未来某个时间(或附近的位置或类似位置)的值,然后将其反馈到导数公式中并重新开始。

不同方法(前向/后向欧拉,RK4,...)之间的唯一主要区别是您用于确定当前位置的斜率的方法。

答案 1 :(得分:2)

你的实际问题与数学有关,而不是Matlab或编程。如果你在函数f中插入零,你会立即看到除了零之外它没有其他答案。您应该查找equilibrium pointsfixed points。即使均衡不稳定(想象一下山顶),一个完全没有干扰的状态(外部输入,数值误差)将永远保持平衡。如果您要使用微分方程,最好知道如何找到平衡点,然后如何计算在这些点评估的雅可比矩阵以确定系统属性。如果您在这方面还有其他问题,我建议您前往math.stackexchange.com

此外,您正在使用旧方案来调用集成功能。您也可以传递参数。将集成功能定义为主函数中的子函数或单独的函数文件(与函数名称相同的文件名 - 您需要的不是f

function zprime = f(t,z,a,b,c)
zprime(1,1) = z(2);
zprime(2,1) = -a*z(1) + b*(z(3) - z(1));
zprime(3,1) = z(4);
zprime(4,1) = -c*(z(3) - z(1));

然后,在您的主要功能中,拨打

a = 1;
b = 1;
c = 1.5;
[t,z] = ode45(@(t,z)f(t,z,a,b,c),[1 100],[0 0 0 0]);