MATLAB代码帮助。反向欧拉法
这是我用这个方法数值求解A的代码。然而,结果与我课本上的结果不一致,有时甚至荒谬地不一致。代码有什么问题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; %
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