我的代码在我的解决方案向量中给我零,但我不知道为什么。我已经将耦合的二阶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时,解决方案会按预期更改。
由于
答案 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 points或fixed 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]);