用递推公式计算定积分(matlab版)

合集下载

欧拉法matlab程序

欧拉法matlab程序

欧拉法matlab程序1. 介绍在数学和工程领域中,欧拉法(Euler’s Method)是一种用于数值求解常微分方程的方法。

它是一种简单而有效的方法,通过离散化时间和空间,将微分方程转化为差分方程,在计算机程序中实现求解。

由于其易于理解和实现,欧拉法被广泛用于教学和工程实践中。

在本文中,我们将详细讨论如何使用MATLAB编写欧拉法程序。

我们将探讨欧拉法的原理、步骤、程序实现以及示例应用。

2. 欧拉法的原理欧拉法基于微分方程的初值问题,通过近似求解微分方程得到数值解。

它将连续的问题离散化为离散的差分问题。

对于一阶常微分方程,具有以下形式:dy=f(t,y)dt其中,t是自变量,y是因变量,f(t,y)是给定的函数。

假设我们已经知道初值条件t0和y(t0),以及步长ℎ,则欧拉法通过以下递推公式求解数值解:y n+1=y n+ℎ⋅f(t n,y n)其中,y n是第n步的数值解,t n=t0+n⋅ℎ。

欧拉法的基本原理是通过在每个时间步长上使用切线来逼近函数曲线,从而得到数值解。

该方法的准确性取决于步长的选择,较小的步长可以提高准确性,但增加了计算复杂度。

3. MATLAB实现欧拉法程序的步骤3.1 定义微分方程首先,我们需要定义要求解的微分方程。

在MATLAB中,可以使用一个匿名函数来=−αy,可以定义如下:表示微分方程。

例如,对于一个简单的线性微分方程dydtf = @(t, y) -alpha * y;3.2 设置初始条件和步长接下来,我们需要设置初始条件和步长。

初始条件包括t0和y(t0),步长ℎ表示每个时间步长的间隔。

t0 = 0;y0 = 1;h = 0.1;3.3 迭代计算使用欧拉法进行迭代计算,直到达到所需的终止条件。

在每个时间步长上,根据欧拉法的递推公式,更新数值解。

t = t0;y = y0;while t <= tf % 终止条件为t <= tfy = y + h * f(t, y);t = t + h;end3.4 可视化结果最后,我们可以使用MATLAB的绘图功能将结果可视化。

matlab微分与积分

matlab微分与积分
quadl函数来求定积分。该函数的调用格式 为:
[I,n]=quadl('fname',a,b,tol,trace) 其中参数的含义和quad函数相似,只是用高
阶自适应递推法,该函数可以更精确地求 出定积分的值,且一般情况下函数调用的 步数明显小于quad函数,从而保证能以更 高的效率求出所需的定积分值。
(3) fft(X,[],dim)或fft(X,N,dim):这是对于矩 阵而言的函数调用格式,前者的功能与 FFT(X)基本相同,而后者则与FFT(X,N) 基本相同。只是当参数dim=1时,该函数 作用于X的每一列;当dim=2时,则作用于 X的每一行。
数值微积分以及数值分析
2020/5/17
1
数值微分
数值微分的实现 两种方式计算函数f(x)在给定点的数值导数:1.用多项式或
者样条函数 2. 利用数据的有限差分
在MATLAB中,没有直接提供求数值导数的函数,只有计 算向前差分的函数diff,其调用格式为:
DX=diff(X):计算向量X的向前差分,DX(i)=X(i+1)-X(i), i=1,2,…,n-1。
I=
2.4674
2020/5/17
8
3.Trapz : 计算梯形面积的和来计算定积分 在MATLAB中,对由表格形式定义的函数关系的求定积分
问题用trapz(X,Y)函数。其中向量X,Y定义函数关系 Y=f(X)。
例 用trapz函数计算定积分。 命令如下:
X=1:0.01:2.5; Y=exp(-X); %生成函数关系数据向量 trapz(X,Y) ans =
• Help dell2
2020/5/17
3
数值积分
数值积分基本原理 求解定积分的数值方法多种多样,如简单 的梯形法、辛普生(Simpson)•法、牛顿- 柯特斯(Newton-Cotes)法等都是经常采用 的方法。它们的基本思想都是将整个积分 区i积=1间分,2[问,a…,题b,n]分就,成分其n解中个为x子1=求区a和,间问x[nx+题1i,=x。bi+。1],这样求定

Matlab的实际应用设计(经典)

Matlab的实际应用设计(经典)

课程设计学院:数学学院学号:********姓名:***辅导老师:陈晓红殷明题目一二三四五六七八总具体题目1.11.21.32.12.33.13.23.34.14.24.35.15.25.36.16.27.47.58.18.420题实验一1.1 水手、猴子和椰子问题一、问题描述1.1 水手、猴子和椰子问题:五个水手带了一只猴子来到南太平洋的一个荒岛上,发现那里有一大堆椰子。

由于旅途的颠簸,大家都很疲惫,很快就入睡了。

第一个水手醒来后,把椰子平分成五堆,将多余的一只给了猴子,他私藏了一堆后便又去睡了。

第二、第三、第四、第五个水手也陆续起来,和第一个水手一样,把椰子分成五堆,恰多一只猴子,私藏一堆,再去入睡,天亮以后,大家把余下的椰子重新等分成五堆,每人分一堆,正好余一只再给猴子,试问原先共有几只椰子?二、思考与实验试分析椰子数目的变化规律,利用逆向递推的方法求解这一问题。

三、问题分析用递推算法。

首先分析椰子数目的变化规律,设最初的椰子数为p 0,即第一个水手所处理之前的椰子数,用p 1、p 2、p 3、p4、p 5分别表示五个水手对椰子动了手脚以后剩余的椰子数目,则根据问题有所以p5 = 5x +1利用逆向递推的方法,有但由于椰子数为一正整数,用任意的x作为初值递推出的p0数据不一定是合适的。

在实验中可以用for 循环语句结合break语句来寻找合适的x和p0,对任意的x递推计算出p0,当计算结果为正整数时,结果正确,否则选取另外的x再次重新递推计算,直到计算出的结果p0为正整数为止。

再用x表示最后每个水手平分得到的椰子数,于是有四、源程序n=input('input n:');for x=1:np=5*x+1;for k=1:5p=5*p/4+1;endif p==fix(p)break;endenddisp([x,p]);五、实验结果六、结果分析从理论上分析,由于所以要使得最初的椰子数p 0为整数,必须取 (x +1) 为 4 5( =1024)的倍数,一种简单的处理可取 x = 1023。

matlab梯形法求定积分例题

matlab梯形法求定积分例题

一、介绍在数值计算领域中,求解定积分是一个常见的问题。

定积分的求解可以通过多种方法,其中梯形法是一种常用的数值积分计算方法。

本文将以MATLAB为工具,通过一个具体的例题来介绍使用梯形法求解定积分的步骤和过程。

二、梯形法原理梯形法是一种利用梯形逼近曲线下面积的数值积分方法。

其原理是将积分区间分成若干小段,然后用每一小段上的函数值来逼近这一小段上的曲线下面积,最后将所有小段上的梯形面积相加得到整个积分的近似值。

三、MATLAB代码实现下面我们通过一个具体的例题来演示如何使用MATLAB来实现梯形法求解定积分。

假设我们要求解如下定积分:\[ \int_{0}^{1} 3x^2 dx \]我们定义被积函数,并选择积分区间及分段数。

在MATLAB中,可以通过以下代码来实现:```matlabf = (x) 3*x^2; 定义被积函数a = 0; 积分下限b = 1; 积分上限n = 100; 分段数```我们通过循环计算每一小段上的梯形面积,并将其相加得到定积分的近似值。

具体实现代码如下:```matlabh = (b - a) / n; 计算每一小段的长度x = a:h:b; 生成积分节点y = f(x); 计算积分节点上的函数值T = h * (sum(y) - (y(1) + y(end)) / 2); 使用梯形法计算定积分近似值```我们输出计算结果并进行比较:```matlabexact_value = integral(f, a, b); 精确值error = abs(exact_value - T); 误差fprintf('定积分的近似值为:f\n', T);fprintf('定积分的精确值为:f\n', exact_value);fprintf('计算误差为:f\n', error);```四、结果分析通过上述代码的计算,我们可以得到定积分的近似值以及与精确值的比较。

MATLAB数学实验答案(全)

MATLAB数学实验答案(全)

MATLAB数学实验答案(全)第⼀次练习教学要求:熟练掌握Matlab 软件的基本命令和操作,会作⼆维、三维⼏何图形,能够⽤Matlab 软件解决微积分、线性代数与解析⼏何中的计算问题。

补充命令vpa(x,n) 显⽰x 的n 位有效数字,教材102页fplot(‘f(x)’,[a,b]) 函数作图命令,画出f(x)在区间[a,b]上的图形在下⾯的题⽬中m 为你的学号的后3位(1-9班)或4位(10班以上) 1.1 计算30sin limx mx mx x →-与3sin lim x mx mxx →∞-syms xlimit((902*x-sin(902*x))/x^3) ans =366935404/3limit((902*x-sin(902*x))/x^3,inf)//inf 的意思 ans = 0 1.2 cos1000xmxy e =,求''y syms xdiff(exp(x)*cos(902*x/1000),2)//diff 及其后的2的意思 ans =(46599*cos((451*x)/500)*exp(x))/250000 - (451*sin((451*x)/500)*exp(x))/250 1.3 计算221100x y edxdy +??dblquad(@(x,y) exp(x.^2+y.^2),0,1,0,1)//双重积分 ans = 2.13941.4 计算4224x dx m x +? syms xint(x^4/(902^2+4*x^2))//不定积分 ans =(91733851*atan(x/451))/4 - (203401*x)/4 + x^3/12 1.5 (10)cos ,x y e mx y =求//⾼阶导数syms xdiff(exp(x)*cos(902*x),10) ans =-356485076957717053044344387763*cos(902*x)*exp(x)-3952323024277642494822005884*sin(902*x)*exp(x)1.6 0x =的泰勒展式(最⾼次幂为4).syms xtaylor(sqrt(902/1000+x),5,x)//泰勒展式 ans =-(9765625*451^(1/2)*500^(1/2)*x^4)/82743933602 +(15625*451^(1/2)*500^(1/2)*x^3)/91733851-(125*451^(1/2)*500^(1/2)*x^2)/406802 + (451^(1/2)*500^(1/2)*x)/902 +(451^(1/2)*500^(1/2))/500 1.7 Fibonacci 数列{}n x 的定义是121,1x x ==12,(3,4,)n n n x x x n --=+=⽤循环语句编程给出该数列的前20项(要求将结果⽤向量的形式给出)。

计算方法与计算 实验一误差分析

计算方法与计算 实验一误差分析
(1)MATLAB 主程序 function [k,juecha,xiangcha,xk]= liti112(x0,x1,limax) % 输入的量--x0是初值, limax是迭代次数和精确值x;
% 输出的量--每次迭代次数k和迭代值xk,
%
--每次迭代的绝对误差juecha和相对误差xiangcha,
误差分析
误差问题是数值分析的基础,又是数值分析中一个困难的课题。在实际计算 中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。 因此,选取算法时注重分析舍入误差的影响,在实际计算中是十分重要的。同时, 由于在数值求解过程中用有限的过程代替无限的过程会产生截断误差,因此算法 的好坏会影响到数值结果的精度。 一、实验目的
因为运行后输出结果为: y 1.370 762 168 154 49, yˆ =1.370 744 664 189
38, R 1.750 396 510 491 47e-005, WU= 1.782 679 830 970 664e-005 104 . 所
以, yˆ 的绝对误差为 10 4 ,故 y
③ 运行后输出计算结果列入表 1–1 和表 1-2 中。
④ 将算法 2 的 MATLAB 调用函数程序的函数分别用 y1=15-2*x^2 和
y1=x-(2*x^2+x-15)/(4*x+1)代替,得到算法 1 和算法 3 的调用函数程序,将其保
存,运行后将三种算法的前 8 个迭代值 x1, x2 ,, x8 列在一起(见表 1-1),进行
的精确解 x* 2.5 比较,观察误差的传播.
算法 1 将已知方程化为同解方程 x 15 2x2 .取初值 x0 2 ,按迭代公式
xk1 15 2xk2

三用MATLAB实现定积分计算

三用MATLAB实现定积分计算

形的公求式积代公数式精。度为对于1,f 辛(x)甫=1森, x公, 式x 2的, x代3,数应精该度有为 3。
节成点立我x,ba下i和们依f面系先(次介x数考11)将绍dfA虑f(x的i(,xx节))是d=使点x1取t代数, (x消数xAb,为1对xaa精f22)(2区/bx,度而21x间)尽使3代等可用Ab入2分2能(fa1,(的1高1x1)即2限计的)f可制(算所得a,的谓2b到n积高确给分斯b定定近2公aA后似t式1,)同A值d。2时t有,x确1代,x定数2
n
In Ai f (xi )
(11)
i1
如何选择节点xi 和系数Ai ,使(11)计算的精度更高?
令我f们(x不)=妨xk只,考用虑(11)I式计11算f (
Ix)dx
b a
f而( x构)d造x,代若数对精于度k为=03,的1,.形..,m如都
有In = I ,而G当2=kA=1mf(+x11)时+ A,2Ifn(x≠2)I ,则称In 的代数精度为m(1。2)梯
s1=s1+y(2*i); end for j=1:m-1
s2=s2+y(2*j+1); end s=(y(1)+y(n)+4*s1+2*s2)*h/3;
当被积函数不是解析表示时, 比如离散数据表表示的函数 通常就用这个函数按辛甫森 公式计算积分。
二 高斯(Gauss)求积公式
各种近似求积公式都可以表示为
tqruaapdz(('yf)un',a(按b,b-)a梯)/形n(公参用式考辛计书甫算P森定22(积3)2分阶()单公位式步计长算)函。数fun在区间 trapz(x,y) x , y同长[ 度a, ,b]的输积出分y ,对自x动的选按择梯步形长公。式计算的积分 quad('fun',a(,b变,to步l) 长)与。上同,但指定了相对误差 tol。 quadl(‘fun’,a,b,tol) 用自适应Gauss-Lobatto公式计算,精度 更高。

数值分析方法计算定积分

数值分析方法计算定积分

数值分析⽅法计算定积分⽤C语⾔实现⼏种常⽤的数值分析⽅法计算定积分,代码如下:1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 #include <math.h>56#define EPS 1.0E-14 //计算精度7#define DIV 1000 //分割区间,值越⼤,精确值越⾼8#define ITERATE 20 //⼆分区间迭代次数,区间分割为2^n,初始化应该⼩⼀点,否则会溢出910#define RECTANGLE 0 //矩形近似11#define TRAPEZOID 1 //梯形近似12#define TRAPEZOID_FORMULA 2 //递推梯形公式13#define SIMPSON_FORMULA 3 //⾟普森公式14#define BOOL_FORMULA 4 //布尔公式1516double function1(double);17double function2(double);18double function3(double);19void Integral(int, double f(double), double, double); //矩形, 梯形逼近求定积分公式20void Trapezoid_Formula(double f(double), double a, double b); //递推梯形公式21void Simpson_Formula(double f(double), double a, double b); //⾟普森公式22void Bool_Formula(double f(double), double a, double b); //布尔公式23void Formula(int, double f(double), double, double);2425double function1(double x)26 {27double y;28 y = cos(x);29return y;30 }3132double function2(double x)33 {34double y;35 y=1/x;36// y = 2+sin(2 * sqrt(x));37return y;38 }3940double function3(double x)41 {42double y;43 y = exp(x);44return y;45 }4647int main()48 {49 printf("y=cos(x) , x=[0, 1]\n");50 printf("Rectangle : "); Integral(RECTANGLE, function1, 0, 1);51 printf("Trapezoid : "); Integral(TRAPEZOID, function1, 0, 1);52 Formula(TRAPEZOID_FORMULA, function1, 0, 1);53 Formula(SIMPSON_FORMULA, function1, 0, 1);54 Formula(BOOL_FORMULA, function1, 0, 1);55 printf("\n");5657 printf("y=1/x , x=[1, 5]\n");58 printf("Rectangle : "); Integral(RECTANGLE, function2, 1, 5);59 printf("Trapezoid : "); Integral(TRAPEZOID, function2, 1, 5);60 Formula(TRAPEZOID_FORMULA, function2, 1, 5);61 Formula(SIMPSON_FORMULA, function2, 1, 5);62 Formula(BOOL_FORMULA, function2, 1, 5);63 printf("\n");6465 printf("y=exp(x) , x=[0, 1]\n");66 printf("Rectangle : "); Integral(RECTANGLE, function3, 0, 1);67 printf("Trapezoid : "); Integral(TRAPEZOID, function3, 0, 1);68 Formula(TRAPEZOID_FORMULA, function3, 0, 1);69 Formula(SIMPSON_FORMULA, function3, 0, 1);70 Formula(BOOL_FORMULA, function3, 0, 1);7172return0;73 }74//积分:分割-近似-求和-取极限75//利⽤黎曼和求解定积分76void Integral(int method, double f(double),double a,double b) //f(double),f(x), double a,float b,区间两点77 {79double x;80double sum = 0; //矩形总⾯积81double h; //矩形宽度82double t = 0; //单个矩形⾯积8384 h = (b-a) / DIV;8586for(i=1; i <= DIV; i++)87 {88 x = a + h * i;89switch(method)90 {91case RECTANGLE :92 t = f(x) * h;93break;94case TRAPEZOID :95 t = (f(x) + f(x - h)) * h / 2;96break;97default:98break;99 }100 sum = sum + t; //各个矩形⾯积相加101 }102103 printf("the value of function is %.10f\n", sum);104 }105106//递推梯形公式107void Trapezoid_Formula(double f(double), double a, double b)//递推梯形公式108 {109 unsigned int i, j, M, J=1;110double h;111double F_2k_1 = 0;112double T[32];113double res = 0;114115 T[0] = (f(a) + f(b)) * (b-a)/2;116for(i=0; i<ITERATE; i++)117 {118 F_2k_1 = 0;119 J = 1;120121for(j=0; j<=i; j++) //区间划分122 J <<= 1; //2^J123 h = (b - a) /J; //步长124//M = J/2; //2M表⽰将积分区域划分的块数125for(j=1; j <= J; j += 2) //126 {127 F_2k_1 += f(a + j*h); //f(2k-1)累加和128 }129 T[i+1] = T[i]/2 + h * F_2k_1; //递推公式130 res = T[i+1];131132if(fabs(T[i+1] - T[i]) < EPS)133if(i < 3) continue;134else break;135 }136137 printf("Trapezoid_Formula : the value of function is %.10f\n", res);138//return res;139 }140//⾟普森公式141void Simpson_Formula(double f(double), double a, double b) //⾟普森公式142 {143 unsigned int i, j, M, J=1;144double h;145double F_2k_1 = 0;146double T[32], S[32];147double res_T = 0, res_S = 0;148149 T[0] = (f(a) + f(b)) * (b-a)/2;150for(i=0; i<ITERATE; i++)151 {152 F_2k_1 = 0;153 J = 1;154155for(j=0; j<=i; j++) //区间划分156 J <<= 1; //2^J157 h = (b - a) /J; //步长158//M = J/2; //2M表⽰将积分区域划分的块数159for(j=1; j <= J; j += 2) //160 {161 F_2k_1 += f(a + j*h); //f(2k-1)累加和163 T[i+1] = T[i]/2 + h * F_2k_1; //递推梯形公式164 res_T = T[i+1];165166if(fabs(T[i+1] - T[i]) < EPS)167if(i < 3) continue;168else break;169 }170171for(i=1; i<ITERATE; i++)172 {173 S[i] = (4 * T[i] - T[i-1]) / 3; //递推⾟普森公式174 res_S = S[i];175if(fabs(S[i] - S[i-1]) < EPS)176if(i < 3) continue;177else break;178 }179180 printf("Simpson_Formula : the value of function is %.10f\n", res_S);181//return res_S;182 }183184//布尔公式185void Bool_Formula(double f(double), double a, double b) //布尔公式186 {187 unsigned int i, j, M, J=1;188double h;189double F_2k_1 = 0;190double T[32], S[32], B[32];191double res_T = 0, res_S = 0, res_B;192193 T[0] = (f(a) + f(b)) * (b-a)/2;194for(i=0; i<ITERATE; i++)195 {196 F_2k_1 = 0;197 J = 1;198199for(j=0; j<=i; j++) //区间划分200 J <<= 1; //2^J201 h = (b - a) /J; //步长202//M = J/2; //2M表⽰将积分区域划分的块数203for(j=1; j <= J; j += 2) //204 {205 F_2k_1 += f(a + j*h); //f(2k-1)累加和206 }207 T[i+1] = T[i]/2 + h * F_2k_1; //递推公式208 res_T = T[i+1];209210if(fabs(T[i+1] - T[i]) < EPS)211if(i < 3) continue;212else break;213 }214215for(i=1; i<ITERATE; i++)216 {217 S[i] = (4 * T[i] - T[i-1]) / 3; //递推⾟普森公式218 res_S = S[i];219if(fabs(S[i] - S[i-1]) < EPS)220if(i < 3) continue;221else break;222 }223224for(i=1; i<ITERATE; i++)225 {226 B[i] = (16 * S[i] - S[i-1]) / 15; //递推布尔公式227 res_B = B[i];228if(fabs(B[i] - B[i-1]) < EPS)229if(i < 3) continue;230else break;231 }232233 printf("Bool_Formula : the value of function is %.10f\n", res_B);234//return res_B;235 }236237//采⽤⼆分区间的⽅法迭代,实际运⾏速度很慢238void Formula(int method, double f(double), double a, double b)//递推梯形公式239 {240 unsigned int i, j, M, J=1;241double h;242double F_2k_1 = 0;243double T[32], S[32], B[32];244double res_B = 0, res_S = 0, res_T = 0;247for(i=0; i<ITERATE; i++)248 {249 F_2k_1 = 0;250 J = 1;251252for(j=0; j<=i; j++) //区间划分253 J <<= 1; //2^J254 h = (b - a) /J; //步长255//M = J/2; //2M表⽰将积分区域划分的块数256for(j=1; j <= J; j += 2) //257 {258 F_2k_1 += f(a + j*h); //f(2k-1)累加和259 }260 T[i+1] = T[i]/2 + h * F_2k_1; //递推公式261 res_T = T[i+1];262263if(fabs(T[i+1] - T[i]) < EPS)264if(i < 3) continue;265else break;266 }267268switch(method)269 {270default :271case TRAPEZOID_FORMULA :272 printf("Trapezoid_Formula : the value of function is %.10f\n", res_T); 273//return res_T;274break;275case SIMPSON_FORMULA :276for(i=1; i<ITERATE; i++)277 {278 S[i] = (4 * T[i] - T[i-1]) / 3;279 res_S = S[i];280if(fabs(S[i] - S[i-1]) < EPS)281if(i < 3) continue;282else break;283 }284 printf("Simpson_Formula : the value of function is %.10f\n", res_S); 285//return res_S;286break;287case BOOL_FORMULA :288for(i=1; i<ITERATE; i++)289 {290 S[i] = (4 * T[i] - T[i-1]) / 3;291 res_S = S[i];292if(fabs(S[i] - S[i-1]) < EPS)293if(i < 3) continue;294else break;295 }296for(i=1; i<ITERATE; i++)297 {298 B[i] = (16 * S[i] - S[i-1]) / 15;299 res_B = B[i];300if(fabs(B[i] - B[i-1]) < EPS)301if(i < 3) continue;302else break;303 }304305 printf("Bool_Formula : the value of function is %.10f\n", res_B); 306//return res_B;307break;308 }309310 }测试结果:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用递推公式计算定积分
实验目的:
1.充分理解不稳定的计算方法会造成误差的积累,在计算过程中会导致误差的迅速增加,从而使结果产生较大的误差。

2.在选择数值计算公式来进行近似计算时,应学会选用那些在计算过程中不会导致误差迅速增长的计算公式。

3.理解不稳定的计算公式造成误差积累的来源及具体过程;
4.掌握简单的matlab语言进行数值计算的方法。

实验题目:
对n=0,1,2,…,20,计算定积分:
实验原理:
由于y(n)= = –
在计算时有两种迭代方法,如下:
方法一:
y(n)=– 5*y(n-1),n=1,2,3, (20)
取y(0)= = ln6-ln5 ≈ 0.182322
方法二:
利用递推公式:y(n-1)=-*y(n),n=20,19, (1)
而且,由 = * ≤≤* =
可取:y(20)≈*()≈0.008730.
实验容:
对算法一,程序代码如下:
function [y,n]=funa()
syms k n t;
t=0.182322;
n=0;
y=zeros(1,20);
y(1)=t;
for k=2:20
y(k)=1/k-5*y(k-1);
n=n+1;
end
y(1:6)
y(7:11)
对算法二,程序代码如下:
%计算定积分;
%n--表示迭代次数;
%y用来存储结果;
function [y,n]=f();
syms k y_20;
y=zeros(21,1);
n=1;
y_20=(1/105+1/126)/2;
y(21)=y_20;
for k=21:-1:2
y(k-1)=1/(5*(k-1))-y(k)/5;
n=n+1;
end
实验结果:
由于计算过程中,前11个数字太小,后9个数字比较大,造成前面几个数字只显示0.0000的现象,所以先输出前6个,再输出7—11个,这样就能全部显示出来了。

算法一结果:
[y,n]=funa
%先显示一y(1)—y(6)
ans =
0.1823
-0.4116
2.3914
-11.7069
58.7346
-293.5063
%再显示y(7)—y(11)
ans =
1.0e+005 *
0.0147
-0.0734
0.3669
-1.8346
9.1728
y =
1.0e+012 *
Columns 1 through 11
0.0000
-0.0000
0.0000
-0.0000
0.0000
-0.0000
0.0000
-0.0000
0.0000
-0.0000
0.0000
Columns 12 through 20 -0.0000
0.0000
-0.0001
0.0006
-0.0029
0.0143
-0.0717
0.3583
-1.7916
n = 19
算法二结果:>> [y,b]=f y =
0.1823 0.0884 0.0580 0.0431 0.0343 0.0285 0.0243 0.0212 0.0188 0.0169 0.0154 0.0141 0.0130 0.0120 0.0112 0.0105 0.0099 0.0093 0.0089
0.0083
0.0087
b =
21
实验分析:
从两题的计算结果可以看出来,算法一是不稳定的,而算法二是稳定的。

对算法一:由于y(1)本身具有一定的误差,设为a_1,
则由于
y(n)=1/n-5y(n-1)=1/n-5(1/(n-1)-5y(n-1))
=……
=1/n-5/(n-1)-5^2/(n-2)-…-(5^n)*y(0)
所以经过多次迭代后会使误差增大很多倍。

由此可知:在实际应用过程中应尽量避免使用数值不稳定的公式。

相关文档
最新文档