微分方程-第一章习题5实验报告
常微分方程实验报告
常微分方程实验报告一、实验目的常微分方程是数学分析和实际应用中非常重要的一部分,本次实验的主要目的是通过实际操作和计算,深入理解常微分方程的概念、性质和求解方法,并能够将其应用到实际问题中,提高我们解决数学问题和实际应用问题的能力。
二、实验原理常微分方程是指含有一个自变量和一个未知函数及其导数的等式。
求解常微分方程的方法有很多,常见的有变量分离法、一阶线性方程的求解方法(如常数变易法)、恰当方程的求解方法(通过积分因子)等。
对于一阶常微分方程,形如\(y' + p(x)y = q(x)\)的方程,可以使用积分因子\(e^{\int p(x)dx}\)来求解。
对于可分离变量的方程,形如\(g(y)dy = f(x)dx\),可以通过分别积分求解。
三、实验内容(一)一阶常微分方程的求解1、求解方程\(y' + 2xy = 2x\)首先,计算积分因子\(e^{\int 2xdx} = e^{x^2}\),然后将方程两边乘以积分因子得到:\((ye^{x^2})'= 2xe^{x^2}\)两边积分可得\(ye^{x^2} = e^{x^2} + C\),解得\(y =1 + Ce^{x^2}\)2、求解方程\(xy' y = x^2\)将方程化为\(y' \frac{y}{x} = x\),这里\(p(x) =\frac{1}{x}\),积分因子为\(e^{\int \frac{1}{x}dx} =\frac{1}{x}\)。
方程两边乘以积分因子得到\((\frac{y}{x})'= 1\),积分可得\(\frac{y}{x} = x + C\),即\(y = x^2 + Cx\)(二)二阶常微分方程的求解1、求解方程\(y'' 2y' + y = 0\)特征方程为\(r^2 2r + 1 = 0\),解得\(r = 1\)(二重根),所以通解为\(y =(C_1 + C_2x)e^x\)2、求解方程\(y''+ 4y = 0\)特征方程为\(r^2 + 4 = 0\),解得\(r =\pm 2i\),所以通解为\(y = C_1\cos(2x) + C_2\sin(2x)\)(三)应用常微分方程解决实际问题1、考虑一个物体在受到与速度成正比的阻力作用下的运动,其运动方程为\(m\frac{dv}{dt} = kv\)(其中\(m\)为物体质量,\(k\)为阻力系数),求解速度\(v\)随时间\(t\)的变化。
高等数学数学实验报告(两篇)
引言概述:高等数学数学实验报告(二)旨在对高等数学的相关实验进行探究与研究。
本次实验报告共分为五个大点,每个大点讨论了不同的实验内容。
在每个大点下,我们进一步细分了五到九个小点,对实验过程、数据收集、数据分析等进行了详细描述。
通过本次实验,我们可以更好地理解高等数学的概念和应用。
正文内容:一、微分方程实验1.利用欧拉法求解微分方程a.介绍欧拉法的原理和步骤b.详细阐述欧拉法在实际问题中的应用c.给出具体的实例,展示欧拉法的计算步骤2.应用微分方程建立模型求解实际问题a.介绍微分方程模型的建立方法b.给出一个具体的实际问题,使用微分方程建立模型c.详细阐述模型求解步骤和结果分析3.使用MATLAB求解微分方程a.MATLAB求解微分方程的基本语法和函数b.给出一个具体的微分方程问题,在MATLAB中进行求解c.分析结果的准确性和稳定性二、级数实验1.了解级数的概念和性质a.简要介绍级数的定义和基本概念b.阐述级数收敛和发散的判别法c.讨论级数的性质和重要定理2.使用级数展开函数a.介绍级数展开函数的原理和步骤b.给出一个函数,使用级数展开进行近似计算c.分析级数近似计算的精确度和效果3.级数的收敛性与运算a.讨论级数收敛性的判别法b.介绍级数的运算性质和求和法则c.给出具体的例题,进行级数的运算和求和三、多元函数极值与最值实验1.多元函数的极值点求解a.介绍多元函数的极值点的定义和求解方法b.给出一个多元函数的实例,详细阐述求解过程c.分析极值点对应的函数值和意义2.多元函数的条件极值与最值a.讨论多元函数的条件极值的判定法b.给出一个具体的多元函数,求解其条件极值和最值c.分析条件极值和最值对应的函数值和意义3.利用MATLAB进行多元函数极值与最值的计算a.MATLAB求解多元函数极值与最值的基本语法和函数b.给出一个多元函数的具体问题,在MATLAB中进行求解c.分析结果的准确性和可行性四、曲线积分与曲面积分实验1.曲线积分的计算方法与应用a.介绍曲线积分的定义和计算方法b.给出一个具体的曲线积分问题,详细阐述计算过程c.分析曲线积分结果的几何意义2.曲线积分的应用举例a.讨论曲线积分在实际问题中的应用b.给出一个实际问题,使用曲线积分进行求解c.分析曲线积分结果的实际意义和应用价值3.曲面积分的计算方法与应用a.介绍曲面积分的定义和计算方法b.给出一个具体的曲面积分问题,详细阐述计算过程c.分析曲面积分结果的几何意义五、空间解析几何实验1.空间曲线的参数方程表示与性质a.介绍空间曲线的参数方程表示和性质b.给出一个具体的空间曲线,转化为参数方程表示c.分析参数方程对应的几何意义和性质2.平面与空间直线的位置关系a.讨论平面与空间直线的位置关系的判定方法b.给出一个具体的平面与空间直线的问题,判定其位置关系c.分析位置关系对应的几何意义和应用实例3.空间直线与平面的夹角和距离计算a.介绍空间直线与平面的夹角和距离的计算方法b.给出一个具体的空间直线和平面,计算其夹角和距离c.分析夹角和距离计算结果的几何意义总结:通过本次高等数学数学实验报告(二),我们深入了解了微分方程、级数、多元函数极值与最值、曲线积分、曲面积分以及空间解析几何的相关概念和应用。
微分方程数值解法实验报告
微分方程数值解法实验报告2篇微分方程数值解法实验报告(一)在实际科学与工程问题中,我们经常会遇到微分方程的求解。
然而,许多微分方程往往没有解析解,这就需要我们利用数值方法来获得近似解。
本篇实验报告将介绍两种常见的微分方程数值解法:欧拉方法和改进的欧拉方法。
一、欧拉方法欧拉方法是最简单的微分方程数值解法之一。
其基本原理为离散化微分方程,将微分方程中的导数用差商代替。
设要求解的微分方程为dy/dx = f(x, y),步长为h,则可用以下公式进行递推计算:y_{n+1} = y_n +hf(x_n, y_n)二、算法实现为了对欧拉方法进行数值实验,我们以一阶线性常微分方程为例:dy/dx = x - y, y(0) = 1步骤如下:(1)选择合适的步长h和求解区间[a, b],这里我们取h=0.1,[a, b] = [0, 1];(2)初始化y_0 = 1;(3)利用欧拉方法递推计算y_{n+1} = y_n + 0.1(x_n - y_n);(4)重复步骤(3),直到x_n = 1。
三、实验结果与讨论我们通过上述步骤得到了在[0, 1]上的近似解y(x)。
下图展示了欧拉方法求解的结果。
从图中可以看出,欧拉方法得到的近似解与精确解有一定的偏差。
这是因为欧拉方法只是通过递推计算得到的近似解,并没有考虑到更高阶的误差。
所以在需要高精度解时,欧拉方法并不理想。
四、改进的欧拉方法针对欧拉方法的不足,我们可以考虑使用改进的欧拉方法(也称为改进的欧拉-柯西方法)。
它是通过利用前后两个步长欧拉方法得到的结果作为差商的中间项,从而提高了求解精度。
一阶线性常微分方程的改进欧拉方法可以表示为:y_{n+1} = y_n + h(f(x_n, y_n) + f(x_{n+1}, y_n + hf(x_n,y_n)))/2五、算法实现与结果展示将改进的欧拉方法应用于前述的一阶线性常微分方程,我们同样选择h=0.1,[a, b] = [0, 1]。
微分方程数值解实验报告
微分方程数值解实验报告实验目的:掌握微分方程数值解的基本方法,能够利用计算机编程求解微分方程。
实验原理:微分方程是自然科学与工程技术中常见的数学模型,它描述了变量之间的关系及其随时间、空间的变化规律。
解微分方程是研究和应用微分方程的基础,但有很多微分方程无法找到解析解,只能通过数值方法进行求解。
本实验采用欧拉方法和改进的欧拉方法求解微分方程的初值问题:$$\begin{cases}\frac{dy}{dt}=f(t,y)\\y(t_0)=y_0\end{cases}$$其中,$f(t,y)$是给定的函数,$y(t_0)=y_0$是已知的初值条件。
欧拉方法是最基本的数值解法,其步骤如下:1.给定$t_0$和$y_0$2.计算$t_{i+1}=t_i+h$,其中$h$是步长3. 计算$y_{i+1}=y_i+hf(t_i,y_i)$4.重复步骤2、3直到达到终止条件改进的欧拉方法是对欧拉方法进行改进,通过利用函数$y(t)$在$t+\frac{1}{2}h$处的斜率来更准确地估计$y_{i+1}$,其步骤如下:1.给定$t_0$和$y_0$2.计算$t_{i+1}=t_i+h$,其中$h$是步长3. 计算$y_*=y_i+\frac{1}{2}hf(t_i,y_i)$4. 计算$y_{i+1}=y_i+hf(t_i+\frac{1}{2}h,y_*)$5.重复步骤2、3、4直到达到终止条件实验步骤:1.编写程序实现欧拉方法和改进的欧拉方法2.给定微分方程和初值条件3.设置步长和终止条件4.利用欧拉方法和改进的欧拉方法求解微分方程5.比较不同步长下的数值解与解析解的误差6.绘制误差-步长曲线,分析数值解的精度和收敛性实验结果:以一阶常微分方程$y'=3ty+t$为例,给定初值$y(0)=1$,取步长$h=0.1$进行数值求解。
利用欧拉方法求解微分方程得到的数值解如下:\begin{array}{cccc}t & y_{\text{exact}} & y_{\text{Euler}} & \text{误差} \\ \hline0.0&1.000&1.000&0.000\\0.1&1.035&1.030&0.005\\0.2&1.104&1.108&0.004\\0.3&1.212&1.217&0.005\\0.4&1.360&1.364&0.004\\0.5&1.554&1.559&0.005\\0.6&1.805&1.810&0.005\\0.7&2.131&2.136&0.005\\0.8&2.554&2.560&0.006\\0.9&3.102&3.107&0.006\\1.0&3.807&3.812&0.005\\\end{array}利用改进的欧拉方法求解微分方程得到的数值解如下:\begin{array}{cccc}t & y_{\text{exact}} & y_{\text{Improved Euler}} & \text{误差} \\\hline0.0&1.000&1.000&0.000\\0.1&1.035&1.035&0.000\\0.2&1.104&1.103&0.001\\0.3&1.212&1.211&0.001\\0.4&1.360&1.358&0.002\\0.5&1.554&1.552&0.002\\0.6&1.805&1.802&0.003\\0.7&2.131&2.126&0.005\\0.8&2.554&2.545&0.009\\0.9&3.102&3.086&0.015\\1.0&3.807&3.774&0.032\\\end{array}误差-步长曲线如下:实验结论:通过对比欧拉方法和改进的欧拉方法的数值解与解析解的误差,可以发现改进的欧拉方法具有更高的精度和收敛性。
微分方程实验报告参考模板
理学院 信息与计算科学教研室 实验报告课程名称 数学建模 实验名称 微分方程模型 实验地点 校2机房 日期 2011.4.11【实验目的】1、学会用Matlab 求简单微分方程的解析解。
2、学会用Matlab 求微分方程的数值解。
【实验要求】1、独立完成各个实验任务;2、实验的过程保存成 .m 文件,以备检查;3、完成实验报告。
【实验内容】1、求下列方程的通解。
2、设警方对司机饮酒后驾车时血液中酒精含量的规定为不超过80%(mg/ml)。
现有一起交通事故,在事故发生3个小时后,测得司机血液中酒精含量是56%(mg/ml), 又过两个小时后,测得其酒精含量降为40%(mg/ml),试判断:事故发生时,司机是否违反了酒精含量的规定?【实验步骤】(主要包含问题分析、求解过程、实验结果、结果分析等,按课程要求完成)一、第一题1、求解过程2、实验结果⎪⎩⎪⎨⎧===++15)0(,0)0(0294'22y y y dx dy dx y d二、第二题1、问题分析设在D时刻的酒精浓度为X,设t时刻的酒精浓度为X(t),在t到&t时刻内酒精浓度为X(t+&t)-X(t)-kX(t)kt;dx/dt=-kt通解:2、求解过程3、实验结果4、结果分析x(3)=c1*e^(-3k)=56x(5)=c1*e^(-5k)=40e^(2k)=7/5 k=0.17x0*e^(-3*0.17)=56 算得x0=93.2所以酒精含量超标了【实验小结】(主要包含实验心得等)因为有了前几次上机的经验,所以这次的实验没有那么盲目。
在做第一小题时,由于老师在课件上讲解过,所以我们很顺利的就完成了。
当拿到第二小题时,有了做第一题的基础,所以有了些须思路。
但是在做题的时候还是遇到了很多的问题,也包括一些小马虎的问题,例如少编写了一个分号或是括号等;在不断的编写,调试错误的过程中,最终把这两道题做了出来。
通过这次的实验,我对Matlab软件更加熟识,并学会了用Matlab求简单微分方程的解析解以及求微分方程的数值解。
微分方程数值方法实验报告
微分方程数值方法实验报告微分方程数值方法实验报告一、实验目的1、了解Euler法及梯形法的基本原理,能用其解决常微分方程初值问题,并把计算结果用图形表示出来。
2、理解4阶RK法基本计算步骤,能编程实现算法并解决相关常微分方程初值问题。
3、了解MATLAB主要功能和基本特征,熟悉MATLAB操作环境。
掌握MATLAB常用函数的使用以及图形处理。
二、实验题目对于初值问题u’=u,u(0)=1,在区间[0,1]上,用Euler法,梯形法及RK方法进行计算,取步长h=0.1,0.2,0.5,试比较(1)用同样步长,三种方法中哪一个精度最好;(2)对同一种方法一不同步长进行计算,哪一个结果最好。
三、实验内容1、步长为h=0.1时,用三种方法计算题目1)、MATLAB程序Euler法:>> a=0;b=1;h=0.1;N=(b-a)/h;y=zeros(N+1,1);y(1)=1;x=a:h:b;>> for i=2:N+1y(i)=y(i-1)+h*y(i-1);end求得:y = (1 1.1 1.21 1.331 1.4641 1.6105 1.7716 1.9487 2.1436 2.3579 2.5937)’梯形法:>> z=zeros(N+1,1);>> z(1)=1;>> for i=2:N+1v1=z(i-1);t=z(i-1)+h*v1;v2=t;z(i)=z(i-1)+h/2*(v1+v2);end1求得:z = (1 1.105 1.2205 1.3476 1.4873 1.641 1.8101 1.99622.2008 2.4258 2.6734)’RK法:>> w=zeros(N+1,1);>> w(1)=1;>> for i=2:N+1K1=w(i-1);K2=w(i-1)+K1*h/2;K3=w(i-1)+K2*h/2;K4=w(i-1)+K3*h;w(i)=w(i-1)+h*(K1+2*K2+2*K3+K4)/6;end求得:w =(1 1.1052 1.2214 1.3499 1.4918 1.6487 1.8221 2.01382.2255 2.4596 2.7183)’>> plot(x,y)>> hold on>> plot(x,z,':')>> plot(x,w,'--')>> plot(x,exp(x),'*')>> title('相同步长下三种方法与准确解的对比')>> legend('Euler法','梯形法','四阶RK法','准确解') 2)、图形对比相同步长下三种方法与准确解的对比2.82.62.42.221.81.6Euler法1.4梯形法四阶RK法1.2准确解1 00.10.20.30.40.50.60.70.80.9123)、结果分析由图得出三种方法中四阶RK法经确度最高,梯形法次之,Euler法精确度最差。
微分方程数值解实验报告
微分方程数值解实验报告微分方程数值解实验报告一、引言微分方程是数学中一类重要的方程,广泛应用于各个科学领域。
在实际问题中,往往难以得到微分方程的解析解,因此需要借助数值方法来求解。
本实验旨在通过数值解法,探索微分方程的数值解及其应用。
二、数值解法介绍常用的微分方程数值解法有欧拉法、改进欧拉法、四阶龙格-库塔法等。
在本实验中,我们将采用改进欧拉法进行数值解的求取。
改进欧拉法是一种一阶的显式迭代法,其基本思想是将微分方程的导数用差商来近似表示,并通过迭代逼近真实解。
具体迭代公式如下:\[y_{n+1} = y_n + h \cdot f(x_n + \frac{h}{2}, y_n + \frac{h}{2} \cdot f(x_n, y_n))\]其中,\(y_n\)表示第n步的近似解,\(h\)表示步长,\(f(x_n, y_n)\)表示微分方程的导数。
三、实验步骤1. 确定微分方程及初始条件在本实验中,我们选择经典的一阶常微分方程:\[y' = -2xy\]并给定初始条件\(y(0) = 1\)。
2. 设置步长和迭代次数为了得到较为准确的数值解,我们需要合理选择步长和迭代次数。
在本实验中,我们将步长设置为0.1,迭代次数为10。
3. 迭代计算数值解根据改进欧拉法的迭代公式,我们可以通过编写计算程序来求解微分方程的数值解。
具体计算过程如下:- 初始化:设定初始条件\(y_0 = 1\),并给定步长\(h = 0.1\)。
- 迭代计算:使用改进欧拉法的迭代公式,通过循环计算得到\(y_1, y_2, ...,y_{10}\)。
- 输出结果:将计算得到的数值解输出,并进行可视化展示。
四、实验结果与分析通过以上步骤,我们得到了微分方程的数值解\(y_1, y_2, ..., y_{10}\)。
将这些数值解进行可视化展示,可以更直观地观察到解的变化趋势。
根据实验结果,我们可以发现随着迭代次数的增加,数值解逐渐逼近了真实解。
第5次实验报告(常微分方程初值问题的数值解法)
班级: 学号: 姓名: 成绩:实验5 常微分方程初值问题的数值解法实验1实验目的1)熟悉欧拉法、改进欧拉法和龙格-库塔法的原理。
2)根据以上方法,编程求解常微分方程初值问题。
2 实验内容(1)编写程序,用以上各种方法求解教材P232例7-1、习题6、11的初值问题。
(2) 使用系统自带的函数dsolve 和ode45求例7-1的符号解析解和数值解。
3实验原理求解微分方程初值问题00(,)()y f x y y x y '=⎧⎨=⎩ (1) 欧拉法(显式):10(,)n n n n n y y hf x y x x nh +=+⎧⎨=+⎩(2) 改进欧拉法(0)1(0)111(,)(,)(,)2n n n n n n n n n n y y hf x y h y y f x y f x y ++++⎧=+⎪⎨⎡⎤=++⎪⎣⎦⎩ (3) 经典龙格-库塔法(四阶)11234121324300(22)6(,)(,)22(,)22(,)()i i i i i i i i i i h y y K K K K K f x y h h K f x y K h h K f x y K K f x h y hK y y x +⎧=++++⎪⎪=⎪⎪=++⎪⎨⎪=++⎪⎪⎪=++⎪=⎪⎩4实验步骤1)建立函数文件,根据各公式编写程序;2)上机调试程序,运行程序进行计算,记录计算结果;3)分析各公式计算结果,比较各公式的优缺点。
5 程序设计欧拉法改进欧拉法function Euler1(x0,y0,h,n)%(x0,y0):方程的初值%h:步长%n:计算的步数for i=1:nx=x0+h;yp=y0+h*f(x0,y0);yc=y0+h*f(x,yp);y=(yp+yc)/2;x %在屏幕显示每一步的x值y %在屏幕显示每一步计算的方程的数值解 x0=x;y0=y;end经典龙格-库塔法1)函数function f=f(x,y) f=y-2*x/y;end6总结注:若要更改matlab计算的数值类型,可以通过在matlab中设置实现:File -> Preferences ->Array Editor窗口中,Format 下方将Default array format设置为:long解微分方程的MATLAB命令MATLAB中主要用dsolve求微分方程的符号解析解,ode45求数值解。
《数学实验》实验报告——用Mathematica软件解微分方程
例1
求解下列微分方程: 1)
y 2 (1 y) (2 y) 2
In[1]:= DSolve[(y[x]^2)(1-y'[x]) (2-y'[x])^2,y[x],x] Out[1]=
书中结果为: y x c 1/( x c) ,其中 c 为任意常数。 y z 2) z y In[1]:= DSolve[{y'[x] z[x],z'[x] -y[x]},{y[x],z[x]},x] Out[1]= {{y[x]C[1] Cos[x]+C[2] Sin[x],z[x]C[2] Cos[x]-C[1] Sin[x]}} 3)
中 1 2 3 为任意常数。 例 2 求常微分方程 y′= x2 + y2,满足初始条件 y(0)= 0 的数值解。 In[1]:= s1=NDSolve[{y'[x]==x^2+y[x]^2,y[0]==0},y,{x,-2,2}] Out[1]= {{yInterpolatingFunction[{{-2.,2.}},<>]}} In[2]:= y=y/.s1[[1]] Out[2]= InterpolatingFunction[{{-2.,2.}},<>] In[3]:= Plot[y[x],{x,-2,2},AspectRatioAutomatic,PlotRange{-1.5,1.5}]
例1 求解下列微分方程: 1) 2) 3)
y 2 (1 y) (2 y) 2
y z z y y 3 y 3 y y ( x 5)e x
例2 求常微分方程 y′= x2 + y2,满足初始条件 y(0)= 0 的数值解 例3 求函数 t 5 和 et sint 的拉氏变换 例 4 用拉氏变换解微分方程:
微分方程实验报告
微分方程实验报告实验名称:不同数值方法解常微分方程的数值精度实验目的:比较同一数值方法不同刨分数解常微分方程的数值精度,比较不同数值方法在相同刨分数下解常微分方程的数值精度,并将他们与理论数值精度相比;求出截断误差。
实验要求:1.编写程序求解微分方程000(,)()du f x u x x b dx u x u ⎧=⎪<≤⎨⎪=⎩其中f 是x 和u 的已知函数,0u 是给定初值。
2.至少用下列方法实验步骤:一. 初值问题:(),5.11,11,222≤<⎪⎩⎪⎨⎧=-='x u u xx u u 解析解:()3122334⎪⎪⎭⎫ ⎝⎛-=x x x u .二. 解:对该问题,10=u ,00=x ,mh x m =。
0125.0=h1. Euler 公式:1(,),0,1,m m m m u u hf x u m +=+=2. 梯形法公式:111[(,)(,)]/2,0,1,m m m m m m u u h f x u f x u m +++=++=3. 三阶Heun 公式:21131132(3)/4(,),(/3,/3),(2/3,2/3),0,1,m m m m m m m m u u hf k k k f x u k f x h u hk k f x h u hk m +=++==++=++=4. 四阶Runge-Kutta 公式:211234113243(22)/6(,),(/2,/2),(/2,/2),(,),0,1,m m m m m m m m m u u hf k k k k k f x u k f x h u hk k f x h u hk k f x h u hk m +=++++==++=++=++=5. 四阶Adams 外插公式:(显式)),(,4,3,24/)9375955/(3211m m m m m m m m m u x f f m f f f f h u u ==-+-+=---+6. 四阶Gear 公式:11231(4836163)/2512/25,3,4,m m m m m m u u u u u hf m +---+=-+-+=理论数值精度p=4;其中,m u 作为()m u x 的近似值(m=1,2,…)三.计算方法的数值精度 首先取步长h 进行计算,得到()u x 在b 点的近似值()h u b ,根据误差估计,得()()ph h e u b u b M h =-≈,其中p 是方法的阶。
微分方程数值解法实验报告
微分方程数值解法实验报告实验题目:数值解微分方程的实验研究引言:微分方程是描述自然现象、科学问题和工程问题中变量之间的关系的重要数学工具。
然而,大部分微分方程很难找到解析解,因此需要使用数值方法来近似求解。
本实验旨在研究数值解微分方程的方法和工具,并通过实验验证其有效性和准确性。
实验步骤:1.了解微分方程的基本概念和求解方法,包括欧拉法、改进的欧拉法和龙格-库塔法。
2. 配置实验环境,准备实验所需的工具和软件,如Python编程语言和相关数值计算库。
3.选择一种微分方程进行研究和求解,可以是一阶、二阶或更高阶的微分方程。
4.使用欧拉法、改进的欧拉法和龙格-库塔法分别求解选定的微分方程,并比较其结果的准确性和稳定性。
5.计算数值解与解析解之间的误差,并进行误差分析和讨论。
6.对比不同数值解法的性能,包括计算时间和计算精度。
7.结果展示和总结,根据实验结果对数值解方法进行评价和选取。
实验结果:以一阶线性常微分方程为例,我们选择经典的“衰减振荡”问题进行实验研究。
该问题的微分方程形式为:dy/dt = -λy其中,λ为正实数。
我们首先使用Python编程语言实现了欧拉法、改进的欧拉法和龙格-库塔法。
进一步,我们选择了λ=0.5和初始条件y(0)=1,使用这三种数值解法求解该微分方程,并比较结果的准确性。
通过对比数值解和解析解可以发现,在短时间内,欧拉法、改进的欧拉法和龙格-库塔法的结果与解析解非常接近。
但随着时间的增加,欧拉法的结果开始偏离解析解,而改进的欧拉法和龙格-库塔法仍然能够提供准确的近似解。
这是因为欧拉法采用线性逼近的方式,误差随着步长的增加而累积,而改进的欧拉法和龙格-库塔法采用更高阶的逼近方式,可以减小误差。
为了更直观地比较不同方法的性能,我们还计算了它们的计算时间。
实验结果显示,欧拉法计算时间最短,而龙格-库塔法计算时间最长。
这表明在计算时间要求较高的情况下,可以选择欧拉法作为数值解方法。
微分方程数值解实验报告
微分方程数值解法课程设计报告班级:姓名:学号:成绩:2017年 6月 21 日摘要自然界与工程技术中的很多现象,可以归结为微分方程定解问题。
其中,常微分方程求解是微分方程的重要基础内容。
但是,对于许多的微分方程,往往很难得到甚至不存在精确的解析表达式,这时候,数值解提供了一个很好的解决思路。
,针对于此,本文对常微分方程数值解法进行了简单研究,主要讨论了一些常用的数值解法,如欧拉法、改进的欧拉法、Runge—Kutta方法、Adams法以及椭圆型方程、抛物型方程的有限差分方法等,通过具体的算例,结合MATLAB求解画图,初步给出了一般常微分方程数值解法的求解过程。
同时,通过对各种方法的误差分析,让大家对各种方法的特点和适用范围有一个直观的感受。
关键词:微分方程数值解、MATLAB目录摘要 (2)目录 (3)第一章常微分方程数值解法的基本思想与原理 (4)1.1常微分方程数值解法的基本思路 (4)1.2用matlab编写源程序 (4)1.3常微分方程数值解法应用举例及结果 (5)第二章常系数扩散方程的经典差分格式的基本思想与原理 (6)2.1常系数扩散方程的经典差分格式的基本思路 (6)2.2 用matlab编写源程序 (7)2.3常系数扩散方程的经典差分格式的应用举例及结果 (8)第三章椭圆型方程的五点差分格式的基本思想与原理 (10)3.1椭圆型方程的五点差分格式的基本思路 (10)3.2 用matlab编写源程序 (10)3.3椭圆型方程的五点差分格式的应用举例及结果 (12)第四章总结 (12)参考文献 (12)第一章常微分方程数值解法的基本思想与原理1.1常微分方程数值解法的基本思路常微分方程数值解法(numerical methods forordinary differential equations)计算数学的一个分支.是解常微分方程各类定解问题的数值方法.现有的解析方法只能用于求解一些特殊类型的定解问题,实用上许多很有价值的常微分方程的解不能用初等函数来表示,常常需要求其数值解.所谓数值解,是指在求解区间内一系列离散点处给出真解的近似值.这就促成了数值方法的产生与发展.1.2用matlab编写源程序龙格库塔法:M文件:function dx=Lorenz(t,x)%r=28,sigma=10,b=8/3dx=[-10*(x(1)-x(2));-x(1)*x(3)+28*x(1)-x(2);x(1)*x(2)-8*x(3)/3];运行程序:x0=[1,1,1];[t,y]=ode45('Lorenz',[0,100],x0);subplot(2,1,1) %两行一列的图第一个plot(t,y(:,3))xlabel('time');ylabel('z');%画z-t图像subplot(2,2,3) %两行两列的图第三个plot(y(:,1),y(:,2))xlabel('x');ylabel('y'); %画x-y图像subplot(2,2,4)plot3(y(:,1),y(:,2),y(:,3))xlabel('x');ylabel('y');zlabel('z');%画xyz图像欧拉法:h=0.010;a=16;b=4;c=49.52;x=5;y=10;z=10;Y=[];for i=1:800x1=x+h*a*(y-x);y1=y+h*(c*x-x*z-y);z1=z+h*(x*y-b*z);x=x1;y=y1;z=z1;Y(i,:)=[x y z];endplot3(Y(:,1),Y(:,2),Y(:,3));1.3常微分方程数值解法的应用举例及结果应用举例:⎪⎪⎪⎩⎪⎪⎪⎨⎧-=--=--=)()()()()()()()()())()(()(t bz t y t x dt t dz t z t x t y t rx dt t dy t y t x a dt t dx a=10,b=8/3,0<r<+∞,当1<r<24.74时,Lorenz 方程有两个稳定的不动点c()1(-r b ,)1(-r b ,r-1)和c '(-)1(-r b ,-)1(-r b ,r-1),一个稳定的不动点0=(0,0,0),当r>24.74时,c 和c '都变成不稳定的,此时存在混沌和奇怪吸引子。
微分先行实验报告
一、实验目的1. 理解微分的概念,掌握微分的基本运算方法。
2. 通过实验加深对微分几何意义和物理意义的理解。
3. 培养学生动手操作能力和实验分析能力。
二、实验仪器1. 计算机及软件:MATLAB、Excel等。
2. 集成电路实验箱。
3. 导线、开关、电压表、电流表、电阻等实验器材。
三、实验步骤步骤一:实验准备1. 熟悉实验原理和实验步骤。
2. 准备实验所需仪器和材料。
3. 安装并启动实验软件。
步骤二:实验操作1. 微分的几何意义(1) 准备实验数据:选取一条曲线,记录其上若干点的坐标。
(2) 在曲线上选取一点,过该点作曲线的切线,测量切线斜率。
(3) 利用微分公式计算该点的微分值。
(4) 比较切线斜率和微分值,分析其关系。
2. 微分的物理意义(1) 准备实验数据:测量一段直线的长度、宽度、厚度等。
(2) 利用微分公式计算长度的微分、宽度的微分、厚度的微分。
(3) 分析微分值与实际测量值的关系。
3. 微分运算(1) 选择一个函数,利用微分公式计算其一阶导数和二阶导数。
(2) 利用MATLAB或Excel等软件绘制函数图像,观察导数的几何意义。
(3) 分析导数与原函数的关系。
步骤三:实验数据记录与分析1. 将实验过程中测量的数据记录在表格中。
2. 对实验数据进行处理和分析,得出结论。
3. 撰写实验报告,总结实验结果。
四、实验结论1. 通过实验,加深了对微分概念的理解,掌握了微分的基本运算方法。
2. 实验结果表明,微分在几何和物理学中具有广泛的应用。
3. 微分可以描述曲线的局部变化趋势,为研究曲线的性质提供了一种有效方法。
4. 微分在物理学中可以描述物体的运动规律,为研究物体的运动提供了一种有效方法。
五、反思与体会1. 本次实验让我对微分有了更深入的认识,明白了微分在数学和物理学中的重要性。
2. 在实验过程中,我学会了如何运用微分公式进行计算,提高了自己的动手操作能力。
3. 通过实验,我明白了理论与实践相结合的重要性,只有将所学知识运用到实际中,才能真正掌握知识。
微分方程数值解上机报告-常微分方程初值问题数值解法
第一章 常微分方程初值问题数值解法实验一1、实验题目试用(a)欧拉格式(b)中点格式 (c)预报—校正格式 (d)经典四级四阶R-K 格式 编程计算方程:(]()⎪⎩⎪⎨⎧=∈+=112,1222y x y x x y dx dy 2、程序#include<iostream.h> #include<stdlib.h> #include<math.h> const int N=11;double fund(double x,double y); void Euler(double a,double h,double y[]); void Center(double a,double h,double y[]); void YuJiao(double a,double h,double y[]); void SjSj(double a,double h,double y[]); void Adams(double a,double h,double y[]); void main() { double a,b,h,y[N]; int i; char option;cout<<"请输入定义域区间[a,b]:\n";cin>>a>>b;cout<<"请输入初值y[0]:\n";cin>>y[0];h=(b-a)/(N-1);cout<<"a:欧拉法\nb:中心法\nc:预报-校正格式\n";cout<<"d:经典四级四阶R-K格式\n";cout<<"e:Adams预报-修正格式\nf:退出\n";label: cout<<"请选择算法:";cin>>option;switch(option){case 'a': Euler(a,h,y);break;case 'b': Center(a,h,y);break;case 'c': YuJiao(a,h,y);break;case 'd': YuJiao(a,h,y);break;case 'e': Adams(a,h,y);break;case 'f': exit(1);break;default : {cout<<"选择有错,重新选择!\n";goto label;}}cout<<"计算结果为:\n xn\t\tyn"<<endl;for(i=0;i<N;i++)cout<<" "<<a+i*h<<"\t\t"<<y[i]<<endl;}void Euler(double a,double h,double y[]){int i;for(i=1;i<N;i++){y[i]=y[i-1]+h*fund(a+(i-1)*h,y[i-1]);}}void Center(double a,double h,double y[]){int i;double w;for(i=1;i<N;i++){w=fund(a+(i-1)*h,y[i-1]);y[i]=y[i-1]+h*fund(a+(i-1)*h/2,w*h/2+y[i-1]);}}void YuJiao(double a,double h,double y[]){int i;double sun;double y_Begin[N]={y[0]};for(i=1;i<N;i++){y_Begin[i]=y_Begin[i-1]+h*fund(a+(i-1)*h,y_Begin[i-1]);}for(i=1;i<N;i++){while(fabs(y_Begin[i]-sun)>0.0001){sun=y[i-1]+h/2.0*(fund(a+(i-1)*h,y[i-1])+fund(a+i*h,y_Begin[i]));y_Begin[i]=sun;}y[i]=sun;}}void SjSj(double a,double h,double y[]){int i;double k1,k2,k3,k4;for(i=1;i<N;i++){k1=fund(a+(i-1)*h,y[i-1]);k2=fund(a+(i-1)*h+h/2,y[i-1]+h*k1/2);k3=fund(a+(i-1)*h+h/2,y[i-1]+h*k2/2);k4=fund(a+(i-1)*h+h,y[i-1]+h*k3);y[i]=y[i-1]+h/6*(k1+2*k2+2*k3+k4);}}void Adams(double a,double h,double y[]){int i;double me,x[N];double k1,k2,k3,k4;for(i=0;i<N;i++){x[i]=a+i*h;y[i]=y[0];}for(i=1;i<4;i++){k1=fund(a+(i-1)*h,y[i-1]);k2=fund(a+(i-1)*h+h/2,y[i-1]+h*k1/2);k3=fund(a+(i-1)*h+h/2,y[i-1]+h*k2/2);k4=fund(a+(i-1)*h+h,y[i-1]+h*k3);y[i]=y[i-1]+h/6*(k1+2*k2+2*k3+k4);}for(i=4;i<N;i++){me=y[i-1]+h/24*(55*fund(x[i-1],y[i-1])-59*fund(x[i-2],y[i-2])+37*fund(x[i-3],y[i-3])-9*fund(x[i-4],y[i-4]));while(fabs(me-y[i])>0.0001){y[i]=y[i-1]+h/24*(9*fund(x[i],me)+19*fund(x[i-1],y[i-1])-5*fund(x[i-2],y[i-2])+fund(x[i-3],y[i-3] ));me=y[i];}}}double fund(double x,double y){double s;s=y/(2*x)+x*x/2/y;return s;}3、试验结果及分析(i)运算结果(ii)结果分析在使用欧拉法数值求解过程中,其计算过程非常简单,即由y 可直接计算出1y ,由1y 可直接计算出,,2 y 无需用迭代方法求解任何方程,就可求出近似解ny 。
华工数学实验报告 微分方程
《数学实验》报告学院:电子信息学院专业班级:信息工程电联班学号:姓名:实验名称:微分方程实验日期:2016/04/19M 01. 实验目的了解求微分方程解析解的方法 了解求微分方程数值解的方法 了解 dsolve,ode45 指令的使用方法 2. 实验任务1.用dsolve 函数求解下列微分方程(2)()()2()(0)1,(0)0y x y x y x y y '''=+⎧⎨'==⎩2. 我辑私雷达发现,距离d 处有一走私船正以匀速a 沿直线行驶,缉私舰立即以最大速度(匀速v )追赶。
若用雷达进行跟踪,保持船的瞬时速度方向始终指向走私船,则辑私舰的运动轨迹是怎么的?是否能够追上走私船?如果能追上,需要多长时间?3. 实验过程3.1实验原理 3.1.1任务一dsolve(‘equation ’,’condition ’,’v ’)(1) equation 是方程式,condition 是条件,v 是自变量(缺省为t )(2)若不带条件,则解中带积分常数 (3)如果没有显示解,则系统尝试给出隐式解 (4)如果无隐式解,则返回空符号。
3.1.2任务二以0S 为原点建立坐标系。
设缉私船出发的起点坐标为00(x ,y ),根据题意22200x y d +=,经过时间t ,走私船到达S(at,0),缉私船到达M(x,y),追赶时,缉私船总是向走私船所在的位置追赶,设在t+dt 时刻,缉私船到达'(,)M x dx y dy ++,则M,M ’,S 三点一图2 dt 时刻追击图由图可知,0dy y dx at x-=- (1)即dxyat x dy-=- (2)此即缉私船的追辑模型。
方程(2)两边对y 求导,得22d x dt y a dy dy-= (3)又因为缉私船的速度恒为v ,因此222dy dx v dt dt ⎛⎫⎛⎫=+ ⎪ ⎪⎝⎭⎝⎭(4)即dy dt=(5)把方程(5)代入(3),并结合初始条件:00000()'()x y x x x y y =⎧⎪⎨=⎪⎩,可知,求解模型(2),即求解如下模型0000''()'()yx x y x x x y y ⎧⎪=⎪⎪=⎨⎪⎪=⎪⎩(6)其中ak v=为常数。
常微分方程 课程实习报告
福建农林大学计算机与信息学院(数学类课程)课程实习报告课程名称:常微分方程课程实习实习题目:常微分方程数值求解问题的实习姓名:上官火玉系:信息与计算科学专业:信息与计算科学年级:2008学号:081152048指导教师:陈永雪职称:讲师2010 年12 月 1 日福建农林大学计算机与信息学院数学类课程实习报告结果评定目录1. 实习的目的和任务 (1)2. 实习要求 (1)3. 实习地点 (1)4. 主要仪器设备 (1)5. 实习内容 (1)5.1 用不同格式对同一个初值问题的数值求解及其分析 (1)5.1.1求精确解 (1)5.1.2用欧拉法求解 (3)5.1.3用改进欧拉法求解 (5)5.1.4用4级4阶龙格—库塔法求解 (7)5.1.5 问题讨论与分析 (10)5.2 一个算法不同不长求解同一个初值问题及其分析 (12)6. 结束语 (13)参考文献 (13)常微分方程课程实习1.实习的目的和任务目的:通过课程实习能够应用MATLAB软来计算微分方程(组)的数值解;了解常微分方程数值解。
任务:通过具体的问题,利用MATLAB软件来计算问题的结果,分析问题的结论。
2.实习要求能够从案例的自然语言描述中,抽象出其中的数学模型;能够熟练应用所学的数值解计算方法;能够熟练使用MATLAB软件;对常微分方程数值解有所认识,包括对不同算法有所认识和对步长有所认识。
3.实习地点数学实验室4.主要仪器设备计算机、Microsoft Windows XPMatlab 6.55.实习内容5.1 用欧拉方法,改进欧拉方法,4阶龙格—库塔方法分别求下面微分方程的初值dy/dx=y+x+1 y(0)=1 x∈[0,2]5.1.1求精确解首先可以求得其精确解为:y=3*exp(x)-x-25.1.1 程序代码:>> x=0:0.1:2;>> y=3*exp(x)-x-2>> plot(x,y,'b*-');>> Data=[x',y']y =Columns 1 through 91.0000 1.2155 1.4642 1.74962.0755 2.44622.86643.3413 3.8766Columns 10 through 184.47885.1548 5.91256.76047.70798.76569.9451 11.2591 12.7218Columns 19 through 2114.3489 16.1577 18.1672Data =0 1.00000.1000 1.21550.2000 1.46420.3000 1.74960.4000 2.07550.5000 2.44620.6000 2.86640.7000 3.34130.8000 3.87660.9000 4.47881.0000 5.15481.1000 5.91251.2000 6.76041.3000 7.70791.4000 8.76561.5000 9.94511.6000 11.25911.7000 12.72181.8000 14.34891.9000 16.15772.0000 18.1672>>00.20.40.60.81 1.2 1.4 1.6 1.825.1.2 用欧拉法求解程序如下:建立函数文件cwfa1.mfunction [x,y]=cwfa1(fun,x_span,y0,h)x=x_span(1):h:x_span(2);y(1)=y0;for n=1:length(x)-1y(n+1)=y(n)+h*feval(fun,x(n),y(n)); endx=x';y=y';在MATLAB输入以下程序:>> clear all>> fun=inline(' y+x+1');>> [x,y]=cwfa1(fun,[0,2],1,0.1);>> [x,y]>> plot(x,y,'r*-')结果及其图象:ans =0 1.00000.1000 1.20000.2000 1.43000.3000 1.69300.4000 1.99230.5000 2.33150.6000 2.71470.7000 3.14620.8000 3.63080.9000 4.17381.0000 4.78121.1000 5.45941.2000 6.21531.3000 7.05681.4000 7.99251.5000 9.03171.6000 10.18491.7000 11.46341.8000 12.87981.9000 14.44772.0000 16.182500.20.40.60.81 1.2 1.4 1.6 1.825.1.3用改进欧拉法求解:程序如下:建立函数文件cwfa2.mfunction [x,y]=cwfa2(fun,x_span,y0,h)x=x_span(1):h:x_span(2);y(1)=y0;for n=1:length(x)-1k1=feval(fun,x(n),y(n));y(n+1)=y(n)+h*k1;k2=feval(fun,x(n+1),y(n+1));y(n+1)=y(n)+h*(k1+k2)/2;endx=x';y=y';在MATLAB输入以下程序:>> clear all>> fun=inline(' y+x+1');>> [x,y]=cwfa2(fun,[0,2],1,0.1); >> [x,y]>> plot(x,y,'r+-')结果及其图象:ans =0 1.00000.1000 1.21500.2000 1.46310.3000 1.74770.4000 2.07270.5000 2.44230.6000 2.86130.7000 3.33470.8000 3.86840.9000 4.46851.0000 5.14221.1000 5.89721.2000 6.74191.3000 7.68581.4000 8.73931.5000 9.91391.6000 11.22241.7000 12.67871.8000 14.29851.9000 16.09882.0000 18.0987>>00.20.40.60.81 1.2 1.4 1.6 1.825.1.4 用4阶龙格—库塔求解程序如下:建立函数文件cwfa3.mfunction [x,y]=cwfa3(fun,x_span,y0,h)x=x_span(1):h:x_span(2);y(1)=y0;for n=1:length(x)-1k1=feval(fun,x(n),y(n));k2=feval(fun,x(n)+h/2,y(n)+h/2*k1);k3=feval(fun,x(n)+h/2,y(n)+h/2*k2);k4=feval(fun,x(n+1),y(n)+h*k3);y(n+1)=y(n)+h*(k1+2*k2+2*k3+k4)/6;endx=x';y=y';在MATLAB输入以下程序:>> clear all;>> fun=inline(' y+x+1');>> [x,y]=cwfa3(fun,[0,2],1,0.1); >> [x,y]>> plot(x,y, 'b+-')结果及其图象:ans =0 1.00000.1000 1.21550.2000 1.46420.3000 1.74960.4000 2.07550.5000 2.44620.6000 2.86640.7000 3.34130.8000 3.87660.9000 4.47881.0000 5.15481.1000 5.91251.2000 6.76031.3000 7.70791.4000 8.76561.5000 9.94511.6000 11.25911.7000 12.72181.8000 14.34891.9000 16.15772.0000 18.1671>>00.20.40.60.81 1.2 1.4 1.6 1.825.1.5 问题讨论与分析由以上数值分析结果绘制表格:x=0:0.1:2;y1 = [1.0000 1.2155 1.4642 1.7496 2.0755 2.4462 2.8664 3.3413 3.8766 4.4788 5.1548 5.9125 6.7604 7.7079 8.7656 9.9451 11.2591 12.7218 14.3489 16.1577 18.1672];>> y1=[1.0000 1.2155 1.4642 1.7496 2.0755 2.4462 2.8664 3.3413 3.8766 4.4788 5.1548 5.9125 6.7604 7.7079 8.7656 9.9451 11.2591 12.7218 14.3489 16.1577 18.1672];>> y2=[1.0000 1.2000 1.4300 1.6930 1.9923 2.3315 2.7147 3.1462 3.6308 4.1738 4.7812 5.4594 6.2153 7.0568 7.9925 9.0317 10.1849 11.4634 12.8798 14.4477 16.1825];>> y3=[1.0000 1.2150 1.2192 1.4631 1.7477 2.0727 2.4423 2.8613 3.8684 4.4685 5.1422 5.8972 6.7419 7.6858 8.7393 9.9139 11.2224 12.6787 14.2985 16.0988 18.0987];>> y4=[1.0000 1.2155 1.4642 1.7496 2.0755 2.4462 2.8664 3.3413 3.8766 4.4788 5.1548 5.9125 6.7603 7.7079 8.7656 9.9451 11.2591 12.7218 14.3489 16.1577 18.1671 ];>> plot(x,y1,'r+-')>> hold on,plot(x,y2,'b-')>> plot(x,y1,'r+-')>> hold on,plot(x,y3,'b-')>> plot(x,y1,'r+-')>> hold on,plot(x,y4,'b-')00.20.40.60.81 1.2 1.4 1.6 1.8200.20.40.60.81 1.2 1.4 1.6 1.8200.20.40.60.81 1.2 1.4 1.6 1.82由上表和图可以看出欧拉法误差最大,而改进欧拉和龙格—库塔方法误差相对较小,并且龙格—库塔方法误差最小且大部分值都跟精确值相同。
微分方程实验报告(迎风-格式)信息科学
在Matlab命令窗口中输入命令:
u2 = peLaxW(-2,0.02,11,0,1,25)
运行程序得到实验结果为:
>> u2 = peLaxW(-2,0.02,11,0,1,25)
u2 =
Columns 1 through 8
0.6909 1.2720 1.7492 1.9402 1.7721 1.3091 0.7280 0.2508
其中 为网格剖分的步长。
数值求解流程(图):
采用Matlab程序设计语言编程实现该问题的数值求解。取 轴方向的网格步长为 轴方向的网格步长为 , 为给定的常系数它的值为2。计算 在 的近似解。
首先定义函数
function f=IniU(x)
f=1+sin(2*pi*x);
然后在Matlab命令窗口中输入命令:
实验小结:
本次实验,使我感觉到对流方程定解问题的难度相对于上次实验有点加大了。使用Lax-Wendroff格式来解决这个问题,我就知道了它的基本原理和一些基本的操作步骤,收获还是有的。
附Matlab程序代码:
首先定义函3;sin(2*pi*x);
然后
function u = peLaxW(a,dt,n,minx,maxx,M)
Columns 9 through 11
0.0598 0.2279 0.6909
实验结果分析:
通过调用程序计算 在 的近似解,由于n=11,当t=0.1时,M=5,调用u1= peLaxW(-2,0.02,11,0,1,5)计算得到t=0.1时的11个网格点对应的近似解。当t=0.5时,M=25, 故调用u2= peLaxW(-2,0.02,11,0,1,25)计算得到t=0.5时的11个网格点对应的近似解,它们的结果都是比较逼近的。并且在网格比小于等于1/2时,这个格式是比较稳定的。
微分方程数学实验报告
j=i;
elseiff(x)*f(a)>0
a=X(i);
j=i+1;
end
end
end
b=X(j);
k=k+பைடு நூலகம்;
e=b-a;
end
if(b-a)<d
w=a
else
w=(a+b)/(p-1)
end
k
运行结果:
(输入函数形式)fx=x-0.8
(输入二分法下限)a=0
(输入二分法上限)b=1
输入误差限d=0.001
d =
1.0000e-003
输入p分法的p值,p=10
p =
10
w =
0.7999
k =
4
4、实验总结
6、教师评语及评分
0.7969
x0 =
0.8047
x0 =
0.8008
x0 =
0.7988
x0 =
0.7998
(2)P分法
symsx;fun=input('(输入函数形式)fx=');
a=input('(输入二分法下限)a=');
b=input('(输入二分法上限)b=');
d=input('输入误差限d=')%二分法求根
p=input(‘输入p分法的p值,p=’)
f=inline(fun);%修改需要求解的inline函数的函数体
X=[1:p];
e=b-a;
k=0;
whilee>d
h=(b-a)/(p-1);
fori=0:p-1
X(i+1)=a+(h*i);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章习题5实验报告一、实验目的通过用Euler 法、中点格式、预报-校正格式、Adams 预报—修正格式等算法求解一阶常微分方程初值问题000(,),()y f x y x x X y x y '=<<⎧⎪⎨=⎪⎩ 的数值解,经典四级四阶R-K 法是高精度单步法,四阶Adams 预估-校正法是线性多步法,这两个算法较实验一算法精度要高。
通过本次实验,掌握R-K 法的编程要领,掌握多步法初值的准备方法,深刻领会微分方程数值解的实质,体会单步法和线性多步法各自的优缺点,熟练掌握各算法的计算机实现过程,并能从理论及实验结果分析各种算法的优缺点。
二、实验内容用Euler 法、中点格式、预报-校正格式、经典四级四阶R-K 格式、Adams 预报—修正格式算法求解一阶常微分方程初值问题22d ,(1,2]22(1)1xy x x dy x y y ⎧=+∈⎪⎨⎪=⎩的数值解,其精确解为y = 三、算法1 Euler 法100(,)(),1,2,,j j j j y y hf x y y y x j N+=+⎧⎪⎨==⎪⎩ 其中0X x N h -⎡⎤=⎢⎥⎣⎦,h 为步长。
2 中点格式10(,(,))22(),1,2,,j j j j j j h h y y hf x y f x y y y x j N+⎧=+++⎪⎨⎪==⎩ 3 预报-校正格式1(0)(0)11100(,)((,)(,))2(),1,2,,j j j j j j j j j j y y hf x y h y y f x y f x y y y x j N++++⎧=+⎪⎪⎪=++⎨⎪⎪==⎪⎩4 四级四阶格式:11234121324300y (22)6(,)(,),0,1,2,,122(,)22(,)()j j j j j j j j j j h y K K K K K f x y h h K f x y K j N h h K f x y K K f x h y hK y x y +⎧=++++⎪⎪=⎪⎪⎪=++⎪=-⎨⎪=++⎪⎪⎪=++⎪=⎪⎩5 Adams 预报—修正格式 ()()()()⎪⎩⎪⎨⎧-+-++=--+-+=--+++---+修正格式预报格式2111132101519,924937595524n n n n n n n n n n n n n f f f y x f hy y f f f f h y y其中h 为步长。
四 程序一、Euler 法程序如下: #include <stdio.h>#define LEN 100int Euler(int a,int b,double h) {double y[LEN]={0}; double x[LEN]={0};int i=0;double num=0;num=((b-a)/h)+1;//节点个数//循环计算出各个节点的坐标 for(i=1;i<num;++i) { x[0]=a; x[i]=a+i*h;}//带公式计算各个节点的y的值for(i=0;i<num;i++){y[0]=1;y[i+1]=(y[i]/(2*x[i]))+(x[i]*x[i])/(2*y[i]);}//输出x和yprintf("\n ************************* Euler法求解方程******************************* \n");printf("\n x[n] y[n]\n\n");for(i=0;i<num;i++){printf(" %.4f %.4f\n",x[i],y[i]);}printf("\n ************************* Euler法求解方程******************************** \n\n");return 0;}}二、中点格式程序如下:int Mid(int a,int b,double h){double y[LEN]={0};double x[LEN]={0};int i=0;double num=0;num=((b-a)/h)+1;//节点个数//循环计算出各个节点的坐标for(i=0;i<num;++i){x[0]=a;x[i]=a+i*h;}//带公式计算各个节点的y的值for(i=0;i<num;i++){y[0]=1;y[i+1]=y[i]+h*f((x[i]+h/2),(y[i]+(h/2)*(f(x[i],y[i]))));}//输出x和yprintf("\n ************************* 中点格式求解方程******************************* \n");printf(" x[n] y[n]\n\n");for(i=0;i<num;i++){printf(" %.4f %.4f\n",x[i],y[i]);}printf("\n ************************* 中点格式求解方程******************************* \n\n");return 0;}三、预报——校正格式程序如下:int PreCorr(int a,int b,double h){double y1[LEN]={0};double y[LEN]={0};double x[LEN]={0};int i=0;double num=0;num=((b-a)/h)+1;//节点个数//循环计算出各个节点的坐标for(i=0;i<num;++i){x[0]=a;x[i]=a+i*h;}//带公式计算各个节点的y的值for(i=0;i<num;i++){y[0]=1;//初值为1y1[i+1]=y[i]+h*f(x[i],y[i]);y[i+1]=y[i]+(h/2)*(f(x[i],y[i])+f(x[i+1],y1[i+1]));}//输出x和yprintf("\n *********************** 预报—校正格式求解方程*************************** \n");printf(" x[n] y[n]\n\n");for(i=0;i<num;i++){printf(" %.4f %.4f\n",x[i],y[i]);}printf("\n *********************** 预报—校正格式求解方程*************************** \n\n");return 0;}四、经典四级四阶R-K程序如下:int RungeKutta(int a,int b,double h){double y1[LEN]={0};double y[LEN]={0};double x[LEN]={0};int i=0;double num=0;num=((b-a)/h)+1;//节点个数//循环计算出各个节点的坐标for(i=0;i<num;++i){x[0]=a;x[i]=a+i*h;}//带公式计算各个节点的y的值for(i=0;i<num;i++){double K1=0;double K2=0;double K3=0;double K4=0;y[0]=1;//初值为1K1=f(x[i],y[i]);K2=f((x[i]+h/2),(y[i]+h*K1/2));K3=f((x[i]+h/2),(y[i]+h*K2/2));K4=f((x[i]+h),(y[i]+h*K3));y[i+1]=y[i]+(h/6)*(K1+2*K2+2*K3+K4);}//输出x和yprintf("\n ******************** 经典四级四阶R-K格式求解方程************************* \n");printf(" x[n] y[n]\n\n");for(i=0;i<num;i++){printf(" %.4f %.4f\n",x[i],y[i]);}printf("\n ******************** 经典四级四阶R-K格式求解方程************************* \n\n");return 0;}六、Adams程序如下:int Adams(int a,int b,double h){double y1[LEN] = {0};double y2[LEN] = {0};double y[LEN] = {0};double x[LEN] = {0};int i = 0;double num = 0;double tmp = 0;num = ((b-a)/h)+1;//节点个数//循环计算出各个节点的坐标for(i = 0; i < num; ++i){x[0] = a;x[i] = a + i*h;}for(i = 0; i < num; i++){y2[i] = sqrt(x[i]/2+(x[i]*x[i])/2);}y2[0] = 1;//带公式计算各个节点的y的值for(i = 0; i < 4; i++){double K1 = 0;double K2 = 0;double K3 = 0;double K4 = 0;y[0] = 1;//初值为1K1 = f(x[i],y[i]);K2 = f((x[i]+h/2),(y[i]+h*K1/2));K3 = f((x[i]+h/2),(y[i]+h*K2/2));K4 = f((x[i]+h),(y[i]+h*K3));y[i+1] = y[i]+(h/6)*(K1+2*K2+2*K3+K4);y1[i] = y[i];}for(i = 4;i < num;i++){y1[i+1] = y[i]+(h/24)*(55*f(x[i],y[i])-59*f(x[i-1],y[i-1])+37*f(x[i-2],y[i-2])-9*f(x[i-3],y[i-3]));y[i+1] = y[i]+(h/24)*(9*f(x[i+1],y1[i+1])+19*f(x[i],y[i])-5*f(x[i-1],y[i-1])+f(x[i-2],y[i-2]));}//输出x和yprintf("\n ***********************Adams预报—校正格式求解方程*************************** \n");printf(" x[n] y[n] y(精确解)\n\n");for(i = 0; i < num; i++){printf(" %.4f %.4f %.4f \n",x[i],y[i],y2[i]);}printf("\n **********************Adams预报—校正格式求解方程**************************** \n\n");return 0;}五、精确解程序如下:int ac_solve(int a,int b,double h){double y[LEN]={0};double x[LEN]={0};int i=0;double num=0;num=((b-a)/h)+1;//节点个数//循环计算出各个节点的坐标for(i=1;i<num;++i){x[0]=a;x[i]=a+i*h;}//带公式计算各个节点的y的值for(i=0;i<num;i++){y[i]=sqrt(x[i]/2+(x[i]*x[i])/2);}y[0]=1;//输出x和yprintf("\n **************************** 精确解***********************************\n");printf("\n x[n] y[n]\n\n");for(i=0;i<num;i++){printf(" %.4f %.4f\n",x[i],y[i]);}printf("\n **************************** 精确解***********************************\n\n");return 0;}调用前四个函数#include<stdio.h>#include<math.h>#include "Euler.h"#define LEN 100int main(){int a=1;//区间左端点int b=2;//区间右端点int case_flag=0;double h=0.1;//步长item();scanf("%d",&case_flag);printf("\n");switch(case_flag){case 0:{break;}case 1:{Euler(a,b,h);//Euler法break;}case 2:{Mid(a,b,h);//中点格式break;}case 3:{PreCorr(a,b,h);//预报—校正格式break;}case 4:{RungeKutta(a,b,h);//经典四级四阶R-K格式break;}case 5:{ac_solve(a,b,h);//精确解break;}default:{printf("没有您所选择的序号!!!\n");break;}}return 0;}调用Adams预报—校正格式主函数int main(void){int a = 1;//区间左端点int b = 2;//区间右端点double h = 0.1;//步长Adams(a,b,h);//Adams法return 0;}五、数值结果及分析运算结果可用下面表格表示:由以上表格可知:从表5.1和表5.2可以看出在四种方法中Euler格式计算的方程的解与精确解相差最大,即误差较大;中点格式,预报-校正格式和经典四级四阶R-K格式的误差较小,其中经典四级四阶R-K格式离精确解最近,所以,经典四级四阶R-K格式方法在前四种方法中求解方程的解的误差最小,效果最好。