欧拉';s显式法在MATLAB上的应用实例

欧拉';s显式法在MATLAB上的应用实例,matlab,math,numerical-methods,differential-equations,Matlab,Math,Numerical Methods,Differential Equations,这是我在MATLAB上为Euler显式方法编写的代码 function [t,x] = meuler(f, intervalo, x0, N) h = (intervalo(2)-intervalo(1))/N; t = intervalo(1):h:intervalo(2); x(:,1) = x0(:); for i = 1:N x(i+1,:) = x(i,:) + h*(f(t(i),x(i,:))); end 它采用另一个文件中定义的函数f。当我尝试使用以下函数运行代码时 f

这是我在MATLAB上为Euler显式方法编写的代码

function [t,x] = meuler(f, intervalo, x0, N)
h = (intervalo(2)-intervalo(1))/N;
t = intervalo(1):h:intervalo(2);
x(:,1) = x0(:);
for i = 1:N
    x(i+1,:) = x(i,:) + h*(f(t(i),x(i,:)));
end
它采用另一个文件中定义的函数
f
。当我尝试使用以下函数运行代码时

function f = funccorazon(t,x)
f1 = x(2);
f2 = 16*x(1)+4*sin(2*t);
f=[f1;f2];
我得到这个错误

>> meuler(@funccorazon, [0 2*pi], [0 2], 1000)
Attempted to access y(2); index out of bounds because numel(y)=1.

Error in funccorazon (line 2)
f1 = y(2);

我不知道为什么。显然,当我使用
ode45
求解微分方程时,似乎没有出现任何问题。如果有任何帮助,我们将不胜感激。谢谢大家!

错误的原因是您需要使用行向量而不是列向量

首先,在函数调用中,将输入x0定义为行向量:

meuler(@funccorazon, [0 2*pi], [0,2], 1000)
其次,在funccorazon函数中,类似地定义输出f:

f=[f1,f2];
最后,在meuler函数中进行以下更改:

x = zeros(N,2);
x(1,:) = x0;

非常感谢。现在可以了。有一件事,我为什么要使用行向量呢?并不是说我喜欢列向量,而是想知道为什么。没有具体的理由选择行而不是列。重要的是选择其中一个并在整个程序中保持一致。最重要的误差应该是最后一个,因为计数指数和向量分量指数的混合直接导致了观测到的误差。