【发布时间】:2021-12-31 15:54:32
【问题描述】:
我正在尝试为 Forward Euler 方法编写 MATLAB 代码,但我认为输出不完全正确。
这是我的代码:
function [t ,u] = Euler(f,tspan ,u0,n)
T = [tspan(1) :n: tspan(2)];
u = zeros(1,n);
u(n) = u0;
h = (tspan(2) - tspan(1))/n;
for i= 1: n
u(i+1) = u(i) + h*f(T(i),u(i));
t = [u(i+1)*T(i)];
u = [u(i+1)];
end
end
【问题讨论】:
-
请注意,
u(i)将始终是标量(u的数据的元素i按列优先顺序排列)。如果要寻址向量,则需要矩阵或二维数组表示法,u(i,:)。 // 请参阅stackoverflow.com/questions/27657685/…,了解如何在 Matlab 中实现追加。 // 思考u和uHist的区别。T和tHist也是如此。 -
非常感谢!对于 uHist 和 tHist,我真的不知道我还应该做什么。来自。我能想到的问题是,近似值应该是 u(i+1) * T(i)。至于 uHist,我不知道 p 应该从哪里来,也不知道该怎么做。是不是,对于我给出的每个 ODE,列是该行的近似值,每个函数 1:p ?
-
p 是 ODE 系统的维数,采用一阶公式。据我了解,您的代码不仅应处理标量一阶方程。数组 u 和 T 已经是 uHist 和 tHist 应该包含的内容。我看不出你从哪里得到
u(i+1) * T(i)产品的想法。 -
好吧,确实可以读错。它实际上意味着存储计算近似值的时间
t_n,即“近似时间”,而不是乘法运算。 -
不完全是。它是 tHist=T 和 uHist=u,历史变量将包含算法期间计算的时间和近似值的列表。将 t 和 u 变量作为当前值和状态向量,并在每次循环后使用它们来更新历史数组会更有意义。