【问题标题】:Euler method doesn't give correct output欧拉方法没有给出正确的输出
【发布时间】: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 中实现追加。 // 思考uuHist 的区别。 TtHist 也是如此。
  • 非常感谢!对于 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 变量作为当前值和状态向量,并在每次循环后使用它们来更新历史数组会更有意义。

标签: matlab numerical-methods


【解决方案1】:

一个最小的简单实现可能看起来像

function [tHist ,uHist] = ForwardEuler(f,tspan ,u0,nsteps)
    tHist = linspace(tspan(1), tspan(2), nsteps+1);
    h = tHist(2)-tHist(1);
    uHist = zeros(nsteps+1,length(u0));
    uHist(1,:)=u0;
    for i = 1:nsteps
        uHist(i+1,:) = uHist(i,:) + h*f(tHist(i),uHist(i,:));
    end%for
end%function

用圆方程测试例程

[T,U] = ForwardEuler(@(t,u)[u(2), -u(1)], [0,6.5], [1,0], 60);
plot(U(:,1),U(:,2));

这会产生预期的向外螺旋。

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2015-08-20
    • 2020-05-06
    相关资源
    最近更新 更多