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代码帮助。反向欧拉法_Matlab_Numerical Methods_Freemat - Fatal编程技术网

MATLAB代码帮助。反向欧拉法

MATLAB代码帮助。反向欧拉法,matlab,numerical-methods,freemat,Matlab,Numerical Methods,Freemat,这是我用这个方法数值求解A的代码。然而,结果与我课本上的结果不一致,有时甚至荒谬地不一致。代码有什么问题 function [x,y] = backEuler(f,xinit,yinit,xfinal,h) %f - this is your y prime %xinit - initial X %yinit - initial Y %xfinal - final X %h - step size n = (xfinal-xinit)/h; %

这是我用这个方法数值求解A的代码。然而,结果与我课本上的结果不一致,有时甚至荒谬地不一致。代码有什么问题

function [x,y] = backEuler(f,xinit,yinit,xfinal,h)

    %f - this is your y prime
    %xinit - initial X
    %yinit - initial Y
    %xfinal - final X
    %h - step size

    n = (xfinal-xinit)/h; %Calculate steps

    %Inititialize arrays...
    %The first elements take xinit and yinit corespondigly, the rest fill with 0s.
    x = [xinit zeros(1,n)];
    y = [yinit zeros(1,n)];

    %Numeric routine
    for i = 1:n
        x(i+1) = x(i)+h;
        ynew = y(i)+h*(f(x(i),y(i)));
        y(i+1) = y(i)+h*f(x(i+1),ynew);
    end
end

我能发现的唯一问题是:

n=(xfinal-xinit)/h
应该是:

n = abs((xfinal-xinit)/h)
以避免负阶跃计数。如果在负x方向移动,请确保为函数提供负步长

你的答案可能会偏离,因为你是多么粗略地接近你的答案。为了得到半精确的结果,deltaX必须非常非常小,并且您的步长必须非常小

这不是“向后欧拉方法”,它只是普通的老欧拉方法

如果这是家庭作业,请加上标签。

看一看,特别是第16章,常微分方程的积分。众所周知,欧拉方法存在问题:

欧拉方法不被推荐用于实际应用有几个原因,其中:(i)与其他以等效步长运行的更奇特的方法相比,该方法不太准确,(ii)也不太稳定

因此,除非你知道你的教科书使用的是欧拉方法,否则我不会期望结果匹配。即使是这样,也可能需要使用相同的步长才能得到相同的结果。

除非您真的想通过自己编写的Euler方法求解ODE,否则您应该看看

旁注:您不需要像这样在循环中创建
x(i)
x(i+1)=x(i)+h。相反,您可以简单地编写
x=xinit:h:xfinal。此外,您可能需要编写
n=round(xfinal xinit)/h以避免警告


下面是用MATLAB实现的解算器

ode45基于显式 龙格-库塔(4,5)公式 休眠王子对。这是一个步骤 解算器–在计算y(tn)时,它需要 只有在最短的时间内才能找到解决方案 前一时间点y(tn-1)。在里面 一般来说,ode45是最好的功能 作为第一次尝试应用于大多数 问题

ode23是一个 显式Runge-Kutta(2,3)对 博加基和三叶草。这可能更重要 在原油中比ode45有效 公差和 中等硬度。像ode45,ode23 是一个一步求解器

ode113是一个可变顺序 亚当斯·巴什福思·莫尔顿·佩奇求解器。 它可能比ode45更高效 严格的公差和ODE 文件功能尤其重要 估价昂贵。ode113是一个 多步骤解算器-通常需要 前几步的解 计算电流的时间点 解决方案

上述算法旨在 求解非iff系统。如果他们出现 如果速度过慢,请尝试使用以下方法之一: 下面是僵硬的解算器

ode15s是一个可变顺序解算器 基于数值微分 公式(NDF)。或者,它使用 后向微分公式 (BDFs,也称为齿轮法) 通常效率较低。喜欢 ode113、ode15s是一个多步骤解算器。 当ode45失败或失败时,请尝试ode15s 效率很低,你怀疑吗 问题很难解决,或者在解决问题时 微分代数问题

ode23s基于修改的 罗森布鲁克公式,2阶。因为 它是一个单步解算器,可能是 在原油中比ODE15更有效 公差。它可以解决某些类型的问题 ode15s不适用的僵硬问题 有效

ode23t是 使用“自由”的梯形规则 插入剂。如果 这个问题只是中等程度的僵硬和僵硬 你需要一个没有数值解的解 阻尼。ode23t可以解决DAE问题

ode23tb是 TR-BDF2,隐式Runge-Kutta 第一阶段为 梯形规则一步一秒 落后的阶段 二阶微分公式。 通过构造,相同的迭代 矩阵用于评估两者 舞台。与ODE23一样,此解算器可能 在原油中比ODE15更有效 公差


你的方法是一种新的方法。它既不向后也不向前。:-)

前向欧拉:
y1=y0+h*f(x0,y0)

向后欧拉
在y1:y1-h*f(x1,y1)=y0中求解

你的方法:
y1=y0+h*f(x0,x0+h*f(x0,y0))

您的方法是而不是向后Euler

您不需要在
y1
中求解,只需使用前向欧拉方法估计
y1
。我不想继续分析你的方法,但我相信它确实会表现得很差,甚至与前向欧拉相比,因为你在错误的点上计算函数
f

这是我能想到的最接近你的方法,也是显式的,应该会得到更好的结果。它是:


y1=y0+h/2*(f(x0,y0)+f(x1,x0+h*f(x0,y0))
我认为这个代码可以工作。试试这个

for i =1:n
    t(i +1)=t(i )+dt;
    y(i+1)=solve('y(i+1)=y(i)+dt*f(t(i+1),y(i+1)');
    end 

代码很好。只需在for循环中添加另一个循环。检查一致性的级别

if abs((y(i+1) - ynew)/ynew) > 0.0000000001 
    ynew = y(i+1);
    y(i+1) = y(i)+h*f(x(i+1),ynew);
end

我检查了一个虚拟函数,结果很有希望。

向后Euler是一种隐式方法。你应该在某个时刻解出y=y(i)+h*f(x(i+1),y)
。我不相信你会这么做。@user207442,检查
for
循环中的最后两行,这正是发生的。。。。问题是我不是在解,而是在估计…@James最后两行看起来不像一个方程求解者。谢谢你提供的信息。这是一个大学项目的一部分,否则它会在枫树上点击几下。谢谢奥利弗。。。不幸的是,对我来说你是非常正确的。我在两个不同的数据源中发现了这个数值求解算法,一个是大学的mat