实验七 matlab求解级数有关计算

上传人:mg****85 文档编号:36903775 上传时间:2018-04-04 格式:DOC 页数:7 大小:111KB
返回 下载 相关 举报
实验七 matlab求解级数有关计算_第1页
第1页 / 共7页
实验七 matlab求解级数有关计算_第2页
第2页 / 共7页
实验七 matlab求解级数有关计算_第3页
第3页 / 共7页
实验七 matlab求解级数有关计算_第4页
第4页 / 共7页
实验七 matlab求解级数有关计算_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《实验七 matlab求解级数有关计算》由会员分享,可在线阅读,更多相关《实验七 matlab求解级数有关计算(7页珍藏版)》请在金锄头文库上搜索。

1、实验七实验七 matlabmatlab 求解级数有关计算求解级数有关计算1.级数的基本概念级数的基本概念常数项级数:常数项级数:称用加号将数列na的项连成的式子LLnaaaa321为(常数项)无穷级数,简记为1nna 。称级数1nna 前n项构成的和 nkknnaaaaaS1321L为级数的部分和。若SSn n lim ,则称级数1nna 收敛,其和为S。Taylor 级数:级数:设函数)(xf在包含ax 的区域内具有各阶导数,则称幂级数LLnnnnn axnafaxafaxafafaxnaf)(!)()(! 2)()( )()(!)()( 2)2(0)(为函数)(xf在ax 的 Taylor

2、 级数,当0a时称为 Maclaurin(麦克劳林)级数。2级数的级数的 MATLAB 命令命令 MATLAB 中主要用 symsum,taylor 求级数的和及进行 Taylor 展开。symsum(s,v,a,b) 表达式 s 关于变量 v 从 a 到 b 求和 taylor(f,a,n) 将函数 f 在 a 点展为 n-1 阶 Taylor 多项式可以用 help symsum, help taylor 查阅有关这些命令的详细信息例例 1 先用 taylor 命令观测函数xysin的 Maclaurin 展开式的前几项,例如观测前 6 项, 相应的 MATLAB 代码为: clear;

3、syms x;taylor(sin(x),0,1)taylor(sin(x),0,2)taylor(sin(x),0,3)taylor(sin(x),0,4)taylor(sin(x),0,5)taylor(sin(x),0,6)结果为: ans =0ans =xans =xans =x-1/6*x3ans =x-1/6*x3ans =x-1/6*x3+1/120*x5然后在同一坐标系里作出函数xysin和它的 Taylor 展开式的前几项构成的多项式函数,! 5! 3,! 3,533 Lxxxyxxyxy 的图形,观测这些多项式函数的图形向xysin的图形的逼近的情况。例如,在区间, 0上作

4、函数xysin与多项式函数! 5! 3,! 3,533xxxyxxyxy 图形的 MATLAB 代码为:x=0:0.01:pi; y1=sin(x); y2=x; y3=x-x.3/6; y4=x-x.3/6+ x.5/120; plot(x,y1,x,y2,:,x,y3, :,x,y4,:)结果如图 3.1,其中实线表示函数xysin的图形。0123400.511.5图 3.1 xysin的泰勒级数类似地,根据函数的 Taylor 级数).1 , 1(,! 2) 1(1)1 (,1 , 1(,432)1ln(),(,! 3! 21),(,! 6! 4! 21cos243232642xxxxx

5、xxxxxxxxxexxxxxxLLLL作图观测其展开式的前几项多项式逼近原函数的情况。 例例 2 利用幂级数计算指数函数。指数函数可展开为幂级数),(,! 3! 2132 xnxxxxen xLL其通项为 xn/prod(1:n),因此用下列循环相加就可计算出这个级数x=input(x=); n=input(n=); y=1; %输入原始数据,初始化 yfor i=1:n y=y+xi/prod(1:i); end, vpa(y,10), %将通项循环相加,得 y执行此程序,分别带入 x=1,2,4,-4 这四个数,取 n=10,y 的结果如下 2.718281801, 7.38899470

6、9, 54.44310406, .9671957672e-1而用 vpa(exp(1),10), vpa(exp(2),10), vpa(exp(4),10), vpa(exp(-4),10)命令可得442,eeee的10 位精确有效数字为 2.718281828, 7.389056099, 54.59815003, .1831563889e-1 对照可知,用级数法计算的有效数字分别为 8,4,2,0 位。 由此可以看出,这个程序虽然原理上正确,但不好用。对不同的 x,精度差别很大。其 他存在的问题有: 这个程序不能用于 x 的元素群运算;当 x 为负数时,它成为交错级数,收敛很慢;此程序要做

7、22n次乘法,n 很大时,乘法次数太多,计算速度很低;对不同的 x,要取不同的 n才能达到精度要求,因此 n 不应由用户输入,应该由软件按精度要求来选。 正对上面的四个问题,可以采用下面四种方法改进: (1)允许数组输入,改进输出显示x=input(x=); n=input(n=); y=ones(size(x); %输入原始数据,初始化 yfor i=1:n y=y+x.i/prod(1:i); %循环相加s1=sprintf(%13.0f,i); s2=sprintf(%15.8f,y); %将结果变为字符串disp(s1,s2) %显示 end,执行此程序,输入 x=1 2 4 -4,n

8、=10,结果为1 2.00000000 3.00000000 5.00000000 -3.000000002 2.50000000 5.00000000 13.00000000 5.000000003 2.66666667 6.33333333 23.66666667 -5.666666674 2.70833333 7.00000000 34.33333333 5.000000005 2.71666667 7.26666667 42.86666667 -3.533333336 2.71805556 7.35555556 48.55555556 2.155555567 2.71825397 7.

9、38095238 51.80634921 -1.095238108 2.71827877 7.38730159 53.43174603 0.530158739 2.71828153 7.38871252 54.15414462 -0.1922398610 2.71828180 7.38899471 54.44310406 0.09671958(2)可以利用 exp(-x)=1/exp(x)来避免交错级数的计算; (3)为了减少乘法次数,设一个中间变量 z,它的初始值为 z=ones(size(x),把循环体 中的计算与句改为 y=y+z; z=x.*z/i; 这样,求得的 z 就是 z=x.i

10、/i!,于是每个循环只需做一次乘法,计算整个级数只需 n 次乘法。 按这种计算,y 的初始值改为 y=zeros(size(x) (4) 为了按精度选择循环次数,不该使用 for 循环,而用 while 语句,它可以设置循环的条 件语句,通常可用 y+z-ytol,tol 是规定的允许误差.只要相邻的两次 y 值之差大于 tol,循环就 继续进行,直到小于 tol 为止.当 x 较大时,exp(x)仍能很快收敛,还可以利用关系式k kxx)(exp()exp( ,令 x1=x/k.k通常取大于 x 而最接近 x 的 2 的幂,例如 x=100,就取 k=128,可以保证 x1 的绝对值小于 1

11、,这 时级数收敛得很快.从练习中可以看出,n 取 10 时(即级数取 10 项)就能保证 7 位有效数,而128) 1exp(x可以化成222)1(exp(LLxx ,即 exp(x1)的 7 次自乘,总共用 17 次乘法就可完成222)128/100(exp()100exp(LL的计算,这既保证了精度,又提高了速度.例例 3 编写任意函数展开为各阶泰勒级数的程序,并显示其误差曲线.对于任意函数 y=f(x),其泰勒展开式为).()(!)()(! 2)()( )()()( 2)2( xRaxnafaxafaxafafxfnnn L 其中)(xRn为余项,也就是泰勒展开式的误差.MATLAB 语

12、句为fxs=input(输入 y=f(x)的表达式,s); %输入原始条件,fxs 是字符串K=input(输入泰勒级数展开式的阶 K);a=input(展开的位置 a=); b=input(展开的区间半宽度 b=);x=linspace(a-b,a+b); %构成自变量数组,确定其长度和步长 lx=length(x); dx=2*b/(lx-1);y=eval(fxs); %求出 y 的准确值subplot(1,2,1), plot(x,y,.), hold on %y 的准确值用点线绘出%求出 a 点的一阶导数,注意求导后数组长度减少 1 Dy=diff(y)/dx; Dya(1)=Dy(

13、round(lx-1)/2); yt(1,:)=y(round(lx/2)+Dya(1)*(x-a); %求 y 的一阶泰勒展开,绘图 plot(x,yt(1,:)for k=2:KDy=diff(y,k)/(dxk); Dya(k)=Dy(round(lx-k)/2); %求 a 点 k 阶导数yt(k,:)=yt(k-1,:)+Dya(k)/prod(1:k)*(x-a).k; %求 y 的 k 阶导数plot(x,yt(k,:); %绘图e(k,:)=y-yt(k,:); %求出 yt 的误差 endtitle(fxs,的各阶泰勒级数曲线), %注意如何组成标注的字符串 grid, ho

14、ld off, subplot(1,2,2)for k=1:K plot(x,e(k,:), hold on, end %绘制误差曲线title(fxs,的各阶泰勒级数误差曲线),grid,hold off执行此程序,输入 fxs=cos(x),K=5,a=0.5,b=2,所得曲线见图 3.2(又变为误差曲线).读者可 以改变其坐标系范围以仔细观测最关心的部分,也可输入其他函数做验算,注意输入函数应符 合元素群运算规则.-2024-2-1.5-1-0.500.511.52cos(x)勒 勒 勒 勒 勒 勒 勒 勒 勒-2024-0.200.20.40.60.811.2cos(x)勒 勒 勒 勒 勒 勒 勒 勒 勒 勒 勒图 3.1 xycos的泰勒级数及误差曲线例例 4 计算级数.112nn的值,可用 symsum 命令,相应的 MATLAB 代码为:clear; syms k;simple(symsum(1/k2,1,Inf) %simple 求解最简形式,Inf 为无穷大结果为:ans =1/6*pi2 类似地可验证.9451,901616414nnnn可以猜想有, 2 , 1,1212Lkmnkknk其中km是正整数,请验证.注:注:可用公式enn0!1来计算e的近似值。如果要精确到小数点后 15 位,相应的MATLAB 代码为:digits(20); %设

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号