微分方程的数值解法与程序实现
实验二_基于Matlab的微分方程数值解法

实验二微分方程数值解法一.实验原理及实验内容:对微分方程描述的控制系统,利用欧拉法、二阶龙格-库塔法、四阶龙格-库塔法分别编写M文件,进行数值计算和作图。
1.分别用欧拉法、二阶龙格-库塔法、四阶龙格-库塔法求下面系统的输出响应y(t)在0≤t≤1上,h=0.1时的数值解。
'2,(0)1=-=y y y要求保留4位小数,并将三种方法的结果与真解2=进行比较。
()ty t e-2.若为如2y y y==何编程计算?',(0)1二.实验仪器:计算机Matlab软件三.实验数据记录:程序一:disp('欧拉算法');y=1;h=0.1;for i=0:0.1:1disp(y);y=y+h*(-2*y);enddisp('欧拉算法');ydisp('精确解');yy=exp(-2*t)h=0.1;disp('函数的2阶数值解为');disp('y=');y=1;for t=0:h:1;disp(y);k1=-2*y;k2=-2*(y+k1*h);y(i+1)=y(i)+(k1+k2)*h*1/2;endh=0.1;disp('函数的4阶数值解为');disp('y=');y=1;for t=0:h:1;disp(y);k1=-2*y;k2=-2*(y+k1*h*1/2);k3=-2*(y+k2*h*1/2);k4=-2*(y+k3*h);y=y+h*1/6*(k1+2*k2+2*k3+k4); end>>程序2:t=0:0.1:1;n=length(t);y(1)=1;h=0.1;for i=1:n-1y(i+1)=y(i)+h*(y(i)*y(i)); enddisp('欧拉算法');ydisp('精确解');yy=exp(-2*t)h=0.1;disp('函数的2阶数值解为');disp('y=');y=1;for t=0:h:1;disp(y);k1=y*y;k2=(y+k1*h)^2;y=y+(k1+k2)*h*1/2;endh=0.1;disp('函数的4阶数值解为');disp('y=');y=1;disp(y);k1=y*y;k2=(y+k1*h*1/2)^2;k3=(y+k2*h*1/2)^2;k4=(y+k3*h)^2;y=y+h*1/6*(k1+2*k2+2*k3+k4); end。
19章 微分方程数值解

第19章常微分方程初值问题数值解Euler方法Euler方法算法1.输入函数f(x,y)、初值y0、自变量区间端点a,b步长h2.计算节点数n和节点x k3.用Euler公式y n+1= y n+h f(x n,y n) 求数值解Euler方法程序Clear[x,y,f]f[x_,y_]= Input["函数f(x,y)="]y0=Input["初值y0 ="]a=Input["左端点a="]b=Input["右端点b="]h=Input["步长h="]n=(b-a)/h;For[i=0,i<n,i++,xk=a+i*h;y1=y0+h*f[xk,y0];Print["y(",xk+h//N,")=",y1//N];y0=y1]说明:本程序用Euler公式求常微方程初值问题数值解。
程序执行后,按要求通过键盘、自变量区间端点a,b步长h后,计算机则给出常微方程依次输入输入函数f(x,y)、初值y初值问题数值解。
程序中变量说明f[x,y]:存放函数f(x,y)y0: 存放初值y0及数值解a:存放自变量区间左端点b: 存放自变量区间右端点n: 存放节点个数h: 存放节点步长xk:存放节点xiy1: 存放数值解注:(1)语句Print["y(",xk+h//N,")=",y1//N]是将数值解用6位有效数字显示出来,如果要显示n位数有效数字,可以将语句改为Print["y(",xk+h//N,")=",N[y1,n]](2)Mathematica中有求微分方程初值问题数值解的命令,形式为:NDSolve[ {y’[x]==f[x,y[x]],y[a]==y0}, y, {x, a, b}]由N DSolve 命令得到的解是以{{未知函数名->InterpolatingFunction[range, <>]}}的形式给出的,其中的InterpolatingFunction[range, <>]是所求的插值函数表示的数值解, range 就是所求数值解的自变量范围。
微分方程的数值求解方法步骤

微分方程的数值求解方法步骤常微分方程数值解法(numerical methods for ordinary differential equations)计算数学的一个分支。
是解常微分方程各类定解问题的数值方法。
现有的解析方法只能用于求解一些特殊类型的定解问题,实用上许多很有价值的常微分方程的解不能用初等函数来表示。
简介常常须要建议其数值求解。
所谓数值求解,就是所指在解区间内一系列线性点处得出真解的近似值。
这就催生了数值方法的产生与发展。
定义做为数值分析的基础内容,常微分方程数值数学分析的研究已发展得相当明朗,理论上也十分健全,各类存有实用价值的算法已经创建,并已构成计算机软件。
它处置问题的思路与方法常可以用作略偏微分方程的数值解。
主要研究以下三类定解问题的数值数学分析:初值问题、两点边值问题与特征值问题。
初值问题的数值数学分析应用领域广为,就是常微分方程数值数学分析的主要内容。
在这方面存有突出贡献的学者当发推达赫奎斯特(dahlquist,g.)、巴特赫尔(butcher,j.c.)及吉尔(gear,c.w.)等人。
两点边值问题及特征值问题的研究相对较为脆弱,其中凯勒尔(keller,h.b.)的工作影响很大。
基本途径结构常微分方程数值算法的基本途径存有:1、用差商替代导数。
将微分问题中未知函数及其导数分别用在某些离散点处函数值的组合与差商近似替代。
2、数值积分法。
将微分问题转变为等价的分数方程问题,用各种数值积分公式近似计算未明函数的分数。
3、待定系数法。
把欲构造的计算公式写成在离散点函数值之线性组合的待定系数形式,利用函数的泰勒展开式与对公式的精度要求,确定公式的系数。
4、平均值余量法。
根据微分方程余量极小化后的建议,确认计算公式。
基本问题常微分方程数值数学分析研究的基本问题存有:1、构造计算公式;2、研究算法的相容性、精度阶与收敛性,估算局部与整体截断误差;3、研究在计算过程中舍入误差传播与积累的规律,即方法的稳定性问题;4、算法的数值同时实现问题,力图以较小的排序工作量与可信的软件系统,在计算机上得出满足用户精度建议的计算结果。
微分方程的数值解法

微分方程的数值解法微分方程是描述自然界中众多现象和规律的重要数学工具。
然而,许多微分方程是很难或者无法直接求解的,因此需要使用数值解法来近似求解。
本文将介绍几种常见的微分方程数值解法。
1. 欧拉方法欧拉方法是最简单的数值解法之一。
它将微分方程转化为差分方程,通过计算离散点上的导数来逼近原方程的解。
欧拉方法的基本思想是利用当前点的导数值来估计下一个点的函数值。
具体步骤如下:首先,将自变量区间等分为一系列的小区间。
然后,根据微分方程的初始条件,在起始点确定初始函数值。
接下来,根据导数的定义,计算每个小区间上函数值的斜率。
最后,根据初始函数值和斜率,递推计算得到每个小区间上的函数值。
2. 龙格-库塔方法龙格-库塔方法是一种常用的高阶精度数值解法。
它通过进行多次逼近和修正来提高近似解的准确性。
相比于欧拉方法,龙格-库塔方法在同样的步长下可以获得更精确的解。
具体步骤如下:首先,确定在每个小区间上的步长。
然后,根据微分方程的初始条件,在起始点确定初始函数值。
接下来,根据当前点的导数值,使用权重系数计算多个中间点的函数值。
最后,根据所有中间点的函数值,计算出当前点的函数值。
3. 改进欧拉方法(改进的欧拉-克罗默法)改进欧拉方法是一种中阶精度数值解法,介于欧拉方法和龙格-库塔方法之间。
它通过使用两公式递推来提高精度,并减少计算量。
改进欧拉方法相对于欧拉方法而言,增加了一个估计项,从而减小了局部截断误差。
具体步骤如下:首先,确定在每个小区间上的步长。
然后,根据微分方程的初始条件,在起始点确定初始函数值。
接下来,利用欧拉方法计算出中间点的函数值。
最后,利用中间点的函数值和斜率,计算出当前点的函数值。
总结:微分方程的数值解法为我们研究和解决实际问题提供了有力的工具。
本文介绍了欧拉方法、龙格-库塔方法和改进欧拉方法这几种常见的数值解法。
选择合适的数值解法取决于微分方程的性质以及对解的精确性要求。
在实际应用中,我们应该根据具体情况选择最合适的数值解法,并注意控制步长以尽可能减小误差。
微分方程数值解使用数值方法求解微分方程

微分方程数值解使用数值方法求解微分方程微分方程是描述自然现象中变化的数学模型,它是数学和科学研究中的重要工具。
然而,许多微分方程并没有精确的解析解,因此需要使用数值方法来近似求解。
本文将介绍一些常用的数值方法来求解微分方程,包括欧拉方法、改进的欧拉方法和龙格-库塔方法。
一、欧拉方法欧拉方法是最简单、最基础的数值方法之一。
它基于微分方程解的定义,通过离散化自变量和因变量来逼近解析解。
假设我们要求解的微分方程为dy/dx = f(x, y),初始条件为y(x0) = y0。
将自变量x分割成若干个小区间,步长为h,得到x0, x1, x2, ..., xn。
根据微分方程的定义,我们可以得到递推公式 yn+1 = yn + h*f(xn, yn)。
用代码表示即为:```def euler_method(f, x0, y0, h, n):x = [x0]y = [y0]for i in range(n):xn = x[i]yn = y[i]fn = f(xn, yn)xn1 = xn + hyn1 = yn + h*fnx.append(xn1)y.append(yn1)return x, y```二、改进的欧拉方法欧拉方法存在着局部截断误差,即在每个小区间上的误差。
改进的欧拉方法是对欧拉方法的改进,可以减小截断误差。
它的递推公式为yn+1 = yn + h*(f(xn, yn) + f(xn+1, yn+1))/2。
用代码表示即为:```def improved_euler_method(f, x0, y0, h, n):x = [x0]y = [y0]for i in range(n):xn = x[i]yn = y[i]fn = f(xn, yn)xn1 = xn + hyn1 = yn + h*(fn + f(xn1, yn + h*fn))/2x.append(xn1)y.append(yn1)return x, y```三、龙格-库塔方法龙格-库塔方法是一种更加精确的数值方法,它通过计算多个递推式的加权平均值来逼近解析解。
某些常微分方程数值解法与程序实现

毕业设计说明书题目:某些常微分方程数值解法与程序实现学院:年级、专业:学生:学号:指导教师:完成日期:目录摘要 (4)引言 (6)1 准备知识 (6)1.1 微分方程的解 (6)1.2 常微分方程的初值问题及其解的存在唯一性 (6)1.3 常微分方程的收敛性与稳定性 (7)1.4 MATLAB开发工具简介 (8)1.5 用户图形界面GUI制作 (8)2常微分方程数值解 (9)2.1 Euler法 (9)2.2 改进Euler法 (10)2.3 Runge-Kutta法 (11)3 算法及程序流程图 (15)3.1Euler方法 (15)3.1.1Euler法的算法设计 (15)3.1.2 Euler法的程序流程图 (16)3.2 改进Euler法 (19)3.2.1 改进Euler法的算法设计 (19)3.2.2 改进Euler法的程序流程图 (20)3.3 Runge-Kutta方法 (21)3.3.1 Runge-Kutta法的算法设计 (21)3.3.2 Runge-Kutta法的程序流程图 (23)4 基于MATLAB的程序界面设计 (27)4.1 用户图形界面GUI说明及详细操作过程 (27)4.2.1 Euler向前法 (28)4.2.2 Euler向后法 (29)4.2.3 改进Euler法 (30)4.2.4 二阶Runge-Kutta方法 (32)4.2.5 三阶Runge-Kutta方法 (33)4.2.5 四阶Runge-Kutta方法 (34)4.2.6 综合比较 (36)4.2用户图形界面源程序 (37)5结论 (43)总结与体会 (44)谢辞 (44)参考文献 (45)摘要随着社会的不断发展与进步,微分方程逐渐在越来越多的现实生活中得到了非常广泛的应用,但是,我们根据问题建立的微分方程模型中,只有非常少的模型能够得到对应的解析解,因此,通过对常微分方程数值解的剖析,我们能够更加清楚的认识和了解常微分方程。
常微分方程的数值解法及其应用

引 言自然界中很多事物的运动规律可用微分方程来刻画。
常微分方程是研究自然科学和社会科学中的事物、物体和现象运动、演化和变化规律的最为基本的数学理论和方法。
物理、化学、生物、工程、航空航天、医学、经济和金融领域中的许多原理和规律都可以描述成适当的常微分方程,如牛顿的运动定律、万有引力定律、机械能守恒定律,能量守恒定律、人口发展规律、生态种群竞争、疾病传染、遗传基因变异、股票的涨幅趋势、利率的浮动、市场均衡价格的变化等,对这些规律的描述、认识和分析就归结为对相应的常微分方程描述的数学模型的研究。
因此,常微分方程的理论和方法不仅广泛应用于自然科学,而且越来越多的应用于社会科学的各个领域。
它的学术价值是无价的,应用价值是立竿见影的。
求一阶常微分方程的解是数学工作者的一项基本的且重要的工作。
由于国内外众多数学家的努力,使此学科基本上形成了一套完美的学科体系;由于该问题比较复杂且涉及的面广,使得有些问题的解析解很难求出,而对于一些典型的微分方程(如线性方程、某些特殊的一阶非线性方程等)可以运用基本方法求出其解析解,并在理论上可以根据初值问题的条件把其中的任意常数完全确定下来。
然而,在生产实际和科学研究中所遇到的微分方程往往很复杂,在很多情况下都不可能给出解的解析表达式,有时即使能求出形式的解,也往往因计算量太大而不实用,而且高次代数方程求根也并不容易,所以用求解析解的方法来计算微分方程的数值解往往是不适宜的。
实际上,对于解微分方程初值问题,一般只要求得到解在若干个点上的近似解或者解的便于计算的近似表达式(只要满足规定的精度就行)。
所以,研究数学建模中常微分方程模型理论性数值解法迫在眉睫。
本文研究的数值解法主要是针对常微分方程初值问题多种数值解法精度比较而言。
从而得到更常用的数值解法在微分方程模型中的应用。
在自然科学和经济的许多领域中。
常常会遇到一阶常微分方程的初值问题b x a y x y y x f dx dy ≤≤⎪⎩⎪⎨⎧==.)(),,(00 这里),(y x f 是充分光滑,即关于x 或y 满足李普希茨条件的二元函数,0y 是给定的初始值,00)(y x y =称为初始条件。
微分方程数值解法实验报告

微分方程数值解法实验报告姓名: 班级: 学号:一:问题描述求解边值问题:()2(sin cos cos sin (0,1)(0,1)0,(,)x y u e x y x y G u x y G ππππππ+⎧⎫∆=+⎪⎪∈=⨯⎨⎬⎪⎪=∈∂⎩⎭(x,y) 其精确解为)sin()sin(),()(y x e y x u y x πππ+=问题一:取步长h=k=1/64,1/128,作五点差分格式,用Jacobi 迭代法,Gauss_Seidel 迭代法,SOR 迭代法(w=1.45)。
求解差分方程,以前后两次重合到小数点后四位的迭代值作为解的近似值,比较三种解法的迭代次数以及差分解)128/1,64/1)(,(=h y x u h 与精确解的精度。
问题二:取步长h=k=1/64,1/128,作五点差分格式,用单参数和双参数PR 法解差分方程,近似到小数点后四位。
与SOR 法比较精度和迭代步数。
问题三:取步长h=k=1/64,1/128,作五点差分格式,用共轭梯度法和预处理共轭梯度法解差分方程,近似到小数点后四位。
与SOR法与PR 法比较精度和迭代步数。
二.实验目的:分别使用五点差分法(Jacobi 迭代,Gauss_Seidel 迭代,SOR迭代),PR 交替隐式差分法(单参数,双参数),共轭梯度法,预共轭梯度法分别求椭圆方程的数值解。
三.实验原理:(1) Jacobi 迭代法设线性方程组(1)的系数矩阵A 可逆且主对角元素均不为零,令 并将A 分解成(2) 从而(1)可写成令其中. (3) 以为迭代矩阵的迭代法(公式)(4)称为雅可比(Jacobi)迭代法(公式),用向量的分量来表示,(4)为(5) 其中为初始向量. (2) Guass-Seidel 迭代法由雅可比迭代公式可知,在迭代的每一步计算过程中是用的全部分量来计算的所有分量,显然在计算第i 个分量时,已经b Ax =nn a ,...,a ,a 2211()nn a ,...,a ,a diag D 2211=()D D A A +-=()b x A D Dx +-=11f x B x +=b D f ,A D I B 1111--=-=1B ()()111f x B x k k +=+⎩⎨⎧[],...,,k ,n ,...,i x a b a x n ij j )k (j j i i ii )k (i 21021111==∑-=≠=+()()()()()Tn x ,...x ,x x 002010=()k x ()1+k x ()1+k i x计算出的最新分量没有被利用,从直观上看,最新计算出的分量可能比旧的分量要好些.因此,对这些最新计算出来的第次近似的分量加以利用,就得到所谓解方程组的高斯—塞德(Gauss-Seidel )迭代法.把矩阵A 分解成(6)其中,分别为的主对角元除外的下三角和上三角部分,于是,方程组(1)便可以写成 即其中(7)以为迭代矩阵构成的迭代法(公式)(8)称为高斯—塞德尔迭代法(公式),用 量表示的形式为(3) SOR 迭代(4) 交替方向迭代法(PR 法)迭代格式为:()()1111+-+k i k x ,...,x 1+k ()1+k x ()1+k j x U L D A --=()nn a ,...,a ,a diag D 2211=U ,L --A ()b Ux x L D +=-22f x B x +=()()b L D f ,U L D B 1212---=-=2B ()()221f x B x k k +=+⎩⎨⎧[],...,,k ,n ,,i x a x a b a x i j n i j )k (j ij )k (j ij i ii )k (i 21021111111==∑∑--=-=+=++Λ))1(()(1D R L D T ωωω-+-=-b )(1--=L D d ωωhu πμωcos )11/(22opt =-+=2121,,1,1,1,,122L L L L u u u L u u u j i j i j i j i j i j i +==+-=+-+-+-对于单参数PR 法,对于多参数,(5) 共轭梯度法 算法步骤如下: [预置步]任意,计算,并令取:指定算法终止常数,置,进入主步;[主步] (1)如果,终止算法,输出;否则下行;(2)计算:(3)计算:(4)置,转入(1).(6) 预共轭梯度法b uL I uL I b u L I uL I k k k k k k k k k k ττττττ+-=++-=++++211122211)()()()(hh optπτsin 22=2sin a ....2,1)11(421k 221h k a h k πρρτ==+-=--其中[预置步]任意,计算,并令取:指定算法终止常数,置,进入主步;[主步](1)计算:,(2)如果,转入(3).否则,终止算法,输出计算结果(3)计算:(4)置,转入(1)注:在算法[主步]中,引入变量,及,可以简化计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微分方程的数值解法与程序实现
微分方程是数学中的重要概念,广泛应用于各个领域。
解微分方程有多种方法,其中一种常用的方法是数值解法。
本文将介绍微分方程的数值解法以及如何用程序实现。
我们来了解一下微分方程的概念。
微分方程描述了变量之间的关系,其中包含了未知函数及其导数。
一般形式的微分方程可以写作:
dy/dx = f(x, y)
其中,y是未知函数,x是自变量,f(x, y)是已知函数。
解微分方程的目标是找到函数y(x)的表达式,使得方程左边的导数等于右边的已知函数。
对于一些简单的微分方程,可以通过代数方法求解得到解析解。
但是,对于复杂的微分方程,往往很难找到解析解。
这时候就需要使用数值解法来近似求解。
数值解法的基本思路是将微分方程转化为差分方程,然后通过逐步逼近的方法求解。
差分方程是离散的,可以使用计算机程序来实现。
常用的数值解法有欧拉法、改进的欧拉法、龙格-库塔法等。
以欧拉法为例,我们来看一下具体的实现过程。
欧拉法的基本思想是通过一阶导数来表示微分方程的变化率。
具体步骤如下:
1. 将微分方程转化为差分方程:dy/dx ≈ (y(i+1) - y(i)) / Δx,其中Δx是步长。
2. 根据初始条件,设置初始值y(0)。
3. 通过迭代计算,求解差分方程:y(i+1) = y(i) + f(x(i), y(i)) * Δx,其中f(x(i), y(i))是在(x(i), y(i))处的导数值。
4. 重复步骤3,直到达到所需的精度或计算次数。
通过上述步骤,我们可以得到微分方程的数值解。
下面,我们来具体实现一个用于求解微分方程的程序。
假设我们要求解的微分方程为dy/dx = x^2,初始条件为y(0) = 1,步长Δx = 0.1。
程序的实现如下:
```python
def euler_method(x0, y0, dx, n):
x = [x0]
y = [y0]
for i in range(n):
x.append(x[i] + dx)
y.append(y[i] + dx * x[i]**2)
return x, y
x0 = 0
y0 = 1
dx = 0.1
n = 10
x, y = euler_method(x0, y0, dx, n)
for i in range(n+1):
print("x = {:.1f}, y = {:.4f}".format(x[i], y[i]))
```
运行以上程序,将得到微分方程的数值解。
输出结果如下:
```
x = 0.0, y = 1.0000
x = 0.1, y = 1.0000
x = 0.2, y = 1.0100
x = 0.3, y = 1.0400
x = 0.4, y = 1.0900
x = 0.5, y = 1.1600
x = 0.6, y = 1.2500
x = 0.7, y = 1.3600
x = 0.8, y = 1.4900
x = 0.9, y = 1.6400
x = 1.0, y = 1.8100
```
从输出结果可以看出,欧拉法逐步逼近了微分方程的解,并得到了数值解。
当步长越小时,数值解越接近解析解。
除了欧拉法,还有其他的数值解法可以用于求解微分方程。
根据具体的问题和需求,选择合适的数值解法可以提高计算精度和效率。
本文介绍了微分方程的数值解法以及如何用程序实现。
数值解法通过将微分方程转化为差分方程,并通过迭代计算来求解,可以近似得到微分方程的解。
程序实现可以通过编程语言来实现,其中欧拉法是常用的数值解法之一。
通过选择合适的数值解法,我们可以更好地解决实际问题。