多步法求解微分方程数值解

对于求解一个较大的系统来说,由于单步法所需要的信息较小导致精度不高,从而需要使用多步法来填补单步法的不足之处。常见的多步法有:Adams显示格式与Adams预测校正格式等。

Matalb代码:

1、Adams方法

function [x,y]=Adams4(f1,tspan,h,x0,y0)
x=(tspan(1):h:tspan(2))‘;%等分区间
n=length(x);
y=zeros(n,1);%存储y值
x(1)=x0;
y(1)=y0;
%使用Rungekutta4方法,为Adams4方法的启动赋初值。
for j=1:3
K1=feval(f1,x(j),y(j));
K2=feval(f1,x(j)+h/2,y(j)+h/2*K1);
K3=feval(f1,x(j)+h/2,y(j)+h/2*K2);
K4=feval(f1,x(j)+h,y(j)+h*K3);
y(j+1)=y(j)+(h/6)*(K1+2*K2+2*K3+K4);
end
fn=feval(f1,x(1:4),y(1:4));
beta=[-9;37;-59;55]./24;
for j=1:n-4
y(j+4)=y(j+3)+h.*(fn‘)*beta;
fn=[fn(2:4);feval(f1,x(j+4),y(j+4))];
end

2、Adams校正格式

function [x,y]=Adams4_jiaozheng(f1,tspan,h,x0,y0)
x=(tspan(1):h:tspan(2))‘;%等分区间
n=length(x);
y=zeros(n,1);%存储y值
x(1)=x0;
y(1)=y0;
%使用Rungekutta4方法,为Adams4_jiaozheng方法的启动赋初值。
for j=1:3
K1=feval(f1,x(j),y(j));
K2=feval(f1,x(j)+h/2,y(j)+h/2*K1);
K3=feval(f1,x(j)+h/2,y(j)+h/2*K2);
K4=feval(f1,x(j)+h,y(j)+h*K3);
y(j+1)=y(j)+(h/6)*(K1+2*K2+2*K3+K4);
end
fn=feval(f1,x(1:4),y(1:4));
beta=[-9;37;-59;55]/24;
beta1=[1;-5;19;9]/24;
%Adams4_jiaozheng方法
for j=1:n-4
y(j+4)=y(j+3)+h*fn‘*beta;
fn=[fn(2:4);feval(f1,x(j+4),y(j+4))];
y(j+4)=y(j+3)+h*fn‘*beta1;
fn=[fn(1:3);feval(f1,x(j+4),y(j+4))];
end
时间: 2024-11-03 21:37:02

多步法求解微分方程数值解的相关文章

本学期微分方程数值解课程总结(matlab代码)

最简单求解一个微分方程数值解:Euler法 function [x,y]=Euler_method(dufun,span,h,x0,y0) %EuLer格式, %求解方程y'=dufun(x,y);其中x \in[a,b];y0为初始值:n为自变量的离散个数:y为求解结果 x=span(1):h:span(2); n=length(x); y=zeros(1,n);%存放数值的解 x(1)=x0; y(1)=y0; for i=1:n-1 y(i+1)=y(i)+h.*feval(dufun,x

关于本科毕业论文《Laguerre小波在数值积分与微分方程数值解中的应用》存在的问题与小结

本科的毕业设计<Laguerre小波在数值积分与微分方程数值解中的应用>是通过Laguerre小波函数来近似表达某个需要求积分或解微分方程的函数,将原函数很难求得函数用小波函数表达出来,这样在求解数值积分时就容易了.但用Laguerre小波逼近的函数有一定的误差性,这里的误差取决于小波函数的两个变量.在编写程序时由于未能根据用户的需要调节小波函数的两个变量,这就造成了此程序的局限性和误差不够好.另外对于错误的输入没有正确的提示,这也会造成用户的时间的浪费.从软件工程的角度来说这个程序并没有良好

欧拉法求解微分方程

by Conmajia 2014 原文是我在2014年写的,用C# 完成,这里改成JavaScript了,特基础.当然最方便的还是用数学库,或者Matlab.Mathematics这些数学软件(如果你只求值的话),或者可以换成C.Java.Go.Erlang任何其他的语言实现.欧拉(Euler)和中心差分逼近,是最朴素的想法,可惜代数精度太低了,而龙格库塔的稳定性又是个问题.总之只能用来计算普通的东西,高大上问题一般还是使用广义$\alpha$,Wilson-$\Theta$之类的,利用系数调节

解微分方程+ode求解器

该命令中可以用D表示微分符号,其中D2表示二阶微分,D3表示三阶微分,以此类推. 求精确解 1.微分方程 r=dsolve('eqn1','eqn2',...,'cond1','cond2',...,'var'). 解释如下:eqni表示第i个微分方程,condi表示第i个初始条件,var表示微分方程中的自变量,默认为t. >> dsolve('Dy=3*x^2','y(0)=2','x') ans =  x^3 + 2 2.微分方程组 >> [x,y]=dsolve('Dx=y'

matlab求解时滞微分方程

matlab求解时滞微分方程,dde23调用格式: sol = dde23(ddefun,lags,history,tspan); --ddefun函数句柄,求解微分方程y'=f(t,y(t),y(t-τ1),...,y(t-τk))         必须写成下面形式: dydt =ddefun(t,y,Z); 其中t对应当前时间t,y为列向量,近似于y(t):Z(:,j)近似于y(t-τj) --lags为延迟时间,为正常数. 例:方程中包含y1(t-0.2)和y2(t-1),则可以表示为la

三种初步简易的方法求解数值问题 of C++

1. “二分法解方程” 在二分法中,从区间[a,b]开始,用函数值f(a)与f(b)拥有相反的符号.如果f在这个区间连续,则f的图像至少在x=a,x=b之间穿越x轴一次,因此方程f(x)=0在[a,b]之间至少有一个解,通过逐步对[a,b]区间进行二分处理,选取在那一部分改变了符号,逐步缩小方程解的更小区域. 1 /************************************************************************/ 2 /*二分法 解方程 */ 3

构造了一种难解的非线性一阶常微分方程,边值特殊;但可用非常规方法求解

求解微分方程的方法是不是可以增添新类型了?

【分享】近4000份数学学习资源免费分享给大家

一直以来喜欢收集数学类的教程资源,于是费了好大劲从万千合集站上扒拉了下来,总结归类了一下,一共有将近4000本电子书.经测试,均可免费下载,可能会弹出小广告,可不必理会之.[仅供学术学习和交流,请无用于商业用途.]另外,如有可能,还请尽量支持正版纸质书.   数学史(54)     数学史.rar 55.6 MB   数学的起源与发展.rar 4.3 MB   费马大定理—一个困惑了世间智者358年的谜.pdf 9.5 MB   通俗数学名著译丛14-无穷之旅:关于无穷大的文化史.pdf 14.

(转)网上摘抄:计算数学研究方向及网上资料

计算数学目的为物理学和工程学作计算.主要研究方向包括: 数值泛函分析:连续计算复杂性理论:数值偏微与有限元:非线性数值代数及复动力系统: 非线性方程组的数值解法:数值逼近论:计算机模拟与信息处理等:工程问题数学建模与计算等等. 目前发展最好的方向已经与应用数学的CAGD 方向合二为一.现在最热的方向应该是微分方程的数值求解.数值代数和流形学习,数值计算名校:西安交通大学.北京大学.大连理工大学 从计算数学的字面来看,应该与计算机有密切的联系,也强调了实践对于计算数学的重要性. 也许Parlett