Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB ODE解算器给出0';到处都是_Matlab_Numerical_Ode - Fatal编程技术网

MATLAB ODE解算器给出0';到处都是

MATLAB ODE解算器给出0';到处都是,matlab,numerical,ode,Matlab,Numerical,Ode,我的代码在任何地方都给我零作为解向量,但我不知道为什么。我把一个耦合的二阶常微分方程分解成4个一阶常微分方程 我将我的函数定义为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

我的代码在任何地方都给我零作为解向量,但我不知道为什么。我把一个耦合的二阶常微分方程分解成4个一阶常微分方程

我将我的函数定义为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时,解决方案也会改变,正如预期的那样


感谢您的特殊情况,对于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
记住数值解的一般前提。取一个初始条件,并将其输入到导数的公式中。这将告诉您要求解的函数的斜率。使用该斜率确定未来某个时间(或附近位置或类似位置)函数的值,然后将其反馈到导数公式中,然后重新开始


不同方法(向前/向后Euler,RK4,…)之间唯一的主要区别是用于确定当前位置坡度的方法。

对于您的特殊情况,对于I.C.s
z_0=[0,0,0,0]
,解决方案应该是稳定的,其值为
z_out=[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
记住数值解的一般前提。取一个初始条件,并将其输入到导数的公式中。这将告诉您要求解的函数的斜率。使用该斜率确定未来某个时间(或附近位置或类似位置)函数的值,然后将其反馈到导数公式中,然后重新开始


不同方法(向前/向后Euler,RK4,…)之间唯一的主要区别是用于确定当前位置坡度的方法。

您的实际问题更多地与数学有关,而不是与Matlab或编程有关。如果您在函数
f
中插入了零,您会立即看到,除了零之外,它无法给出任何其他答案。你应该向上或向下看。即使平衡是不稳定的(想象一下山顶),在没有干扰(外部输入、数值误差)的情况下,恰好处于该点的状态也将永远保持平衡。如果你要研究微分方程,最好知道如何找到平衡点,然后如何计算在这些点上计算的雅可比矩阵,以确定系统属性。如果你在这方面还有其他问题,我建议你去

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

然后,在主函数中,调用

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

你的实际问题更多地与数学有关,而不是Matlab或编程。如果您在函数
f
中插入了零,您会立即看到,除了零之外,它无法给出任何其他答案。你应该向上或向下看。即使平衡是不稳定的(想象一下山顶),在没有干扰(外部输入、数值误差)的情况下,恰好处于该点的状态也将永远保持平衡。如果你要研究微分方程,最好知道如何找到平衡点,然后如何计算在这些点上计算的雅可比矩阵,以确定系统属性。如果你在这方面还有其他问题,我建议你去

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

然后,在主函数中,调用

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