Matlab积分.doc

上传人:hw****26 文档编号:2989157 上传时间:2019-05-16 格式:DOC 页数:20 大小:73KB
下载 相关 举报
Matlab积分.doc_第1页
第1页 / 共20页
Matlab积分.doc_第2页
第2页 / 共20页
Matlab积分.doc_第3页
第3页 / 共20页
Matlab积分.doc_第4页
第4页 / 共20页
Matlab积分.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、 一.数值积分的实现方法1变步长辛普生法基于变步长辛普生法,MATLAB 给出了 quad 函数来求定积分。该函数的调用格式为:I,n=quad(fname,a,b,tol,trace)其中 fname 是被积函数名。a 和 b 分别是定积分的下限和上限。 tol 用来控制积分精度,缺省时取 tol=0.001。trace 控制是否展现积分过程,若取非 0 则展现积分过程,取 0 则不展现,缺省时取 trace=0。返回参数 I 即定积分值,n 为被积函数的调用次数。例 8-1 求定积分。(1) 建立被积函数文件 fesin.m。function f=fesin(x)f=exp(-0.5*x)

2、.*sin(x+pi/6);(2) 调用数值积分函数 quad 求定积分。S,n=quad(fesin,0,3*pi)S = 0.9008n = 772牛顿柯特斯法基于牛顿柯特斯法,MATLAB 给出了 quad8 函数来求定积分。该函数的调用格式为:I,n=quad8(fname,a,b,tol,trace)其中参数的含义和 quad 函数相似,只是 tol 的缺省值取 10-6。 该函数可以更精确地求出定积分的值,且一般情况下函数调用的步数明显小于 quad 函数,从而保证能以更高的效率求出所需的定积分值。(1) 被积函数文件 fx.m。function f=fx(x)f=x.*sin(x

3、)./(1+cos(x).*cos(x);(2) 调用函数 quad8 求定积分。I=quad8(fx,0,pi)I = 2.4674分别用 quad 函数和 quad8 函数求定积分的近似值,并在相同的积分精度下,比较函数的调用次数。调用函数 quad 求定积分:format long;fx=inline(exp(-x);I,n=quad(fx,1,2.5,1e-10)I = 0.28579444254766n = 65调用函数 quad8 求定积分:format long;fx=inline(exp(-x);I,n=quad8(fx,1,2.5,1e-10)I = 0.2857944425

4、4754n = 333被积函数由一个表格定义在 MATLAB 中,对由表格形式定义的函数关系的求定积分问题用 trapz(X,Y)函数。其中向量 X,Y 定义函数关系 Y=f(X)。用 trapz 函数计算定积分。命令如下:x=1:0.01:2.5;Y=exp(-X); %生成函数关系数据向量trapz(X,Y)ans = 0.285796824163938.1.3 二重定积分的数值求解使用 MATLAB 提供的 dblquad 函数就可以直接求出上述二重定积分的数值解。该函数的调用格式为:I=dblquad(f,a,b,c,d,tol,trace)该函数求 f(x,y)在a,bc,d区域上的

5、二重定积分。参数 tol,trace 的用法与函数 quad完全相同。计算二重定积分(1) 建立一个函数文件 fxy.m:function f=fxy(x,y)global ki;ki=ki+1; %ki 用于统计被积函数的调用次数f=exp(-x.2/2).*sin(x.2+y);(2) 调用 dblquad 函数求解。global ki;ki=0;I=dblquad(fxy,-2,2,-1,1)kiI = 1.57449318974494ki = 1038二.数值微分数值微分的实现在 MATLAB 中,没有直接提供求数值导数的函数,只有计算向前差分的函数 diff,其调用格式为:DX=di

6、ff(X):计算向量 X 的向前差分,DX(i)=X(i+1)-X(i),i=1,2,n-1。DX=diff(X,n):计算 X 的 n 阶向前差分。例如,diff(X,2)=diff(diff(X)。DX=diff(A,n,dim):计算矩阵 A 的 n 阶差分,dim=1 时( 缺省状态),按列计算差分;dim=2,按行计算差分。生成以向量 V=1,2,3,4,5,6为基础的范得蒙矩阵,按列进行差分运算。命令如下:V=vander(1:6)DV=diff(V) %计算 V 的一阶差分例 8-7 用不同的方法求函数 f(x)的数值导数,并在同一个坐标系中做出 f(x)的图像。程序如下:f=i

7、nline(sqrt(x.3+2*x.2-x+12)+(x+5).(1/6)+5*x+2);g=inline(3*x.2+4*x-1)./sqrt(x.3+2*x.2-x+12)/2+1/6./(x+5).(5/6)+5);x=-3:0.01:3;p=polyfit(x,f(x),5); %用 5 次多项式 p 拟合 f(x)dp=polyder(p); %对拟合多项式 p 求导数 dpdpx=polyval(dp,x); % 求 dp 在假设点的函数值dx=diff(f(x,3.01)/0.01; %直接对 f(x)求数值导数gx=g(x); %求函数 f 的导函数 g 在假设点的导数plo

8、t(x,dpx,x,dx,.,x,gx,-); %作图Matlab 数值积分的一些做法Filed under: 未分类 franz 9:31 pm 今天是元宵节,突然来讲 Matlab 的确很奇怪,连我自己也这样感觉 由于 Matlab 对于计算过程的细节要求定义详细,往往让人觉得使用不方便与同样很流行的 Mathematic 相比,Matlab 更象是程序,而不是象 Mathematic 那么直观的写作业 Matlab 同样提供符号积分(不定积分)和数值积分(定积分)两大功能符号积分使用 int命令,配合之前的函数定义使用比如: a=; b=; function f = fun(x) f=a

9、*x2+b; 将此文件寸为一个单独 m 文件,再在主程序中调用即可: F = int(fun,c,d); c 和 d 为积分上下限,通常为符号,可使用 syms c;语句定义。在完成符号积分之后可以对其附值,则就完成了数值积分的任务 有一点需要注意的是,通过这样过程求的数值,其格式为符号格式sym ,不能做图,不能和数值进行运算处理方法是: vpa (F); 求得位符号近似解,再用 double ( vpa (F) );将其转换成 Matlab 默认的双精度位数就可以注意,直接做 double (F) 行不通,Matlab 会提示你Conversion from sym to double i

10、s not possible,不知道 not possbile“和“impossible“有什么区别,呵呵 符号积分中一个最大的问题在于存在不可积的函数,比如十分常用的 Boltzman 分布,或者叫 Arrhenius 公式: exp(- q*V/ (k *T ) 插句话,我一直以为 Arrhenius 是德国人,知道前几天在和老师讨论中讲起,我老师很自豪的对我说,有个著名的瑞典化学家,得过 Noble Prize,叫 Arrhenius 你知道不知道,才发现这个小问题,滴汗,搞的我老师也很有挫败感 对于不可积的函数,使用 int 命令之后,得到的表达式中会含有 Ei 项,其本身也是一个函数

11、,以你给定的符号积分上下限为变量在含有 Ei 项后,对符号上下限附值亦无法得到数值积分解,因为 Ei 项也需要解解 Ei 项的方法如下: result = str2num (maple(evalf(Ei(a,b) ); 此语句可以直接使用,其中的 a 和 b 就是你所要解数值解的积分上下限,并且只能是具体数值,不能为符号 若是积分上限或者下限是一个变化的值 (比如今天我做的一个很简单的计算就是这样的情况) ,则可以使用以下的方法: result=maple(evalf,(Ei(1,y)result =Ei(1,y) y=2y = 2 result=subs(result)result =Ei(

12、1,2) result=vpa(result) result =.48900510708061119567239835228050e-1 result=str2num(maple(evalf,(Ei(1,2) result = 0.0489 比如其中的 y 就可以是一个变化的值,写成一个循环,从而计算相应的积分值 Matlab 也直接提供两种主要的数值积分函数:quad 和 quad8quad 是变步长辛普生法,quad8 是牛顿柯特斯法,以我今天的例子持续来看,相差很小 对被积分函数的定义同上,另外,还有一种办法,可以不用另外写一个 m 文件再调用,省下些小麻烦可使用 inline 语句:

13、fxy = inline ( exp(-a*x*y / b), x,y); Matlab 将字符串中的表达式录入内存,准备之后使用这个语句有一个很大的缺点是,表达式中,除了变量之外,其他数值(如上式中的 a 和 b)不能使用字母等符号表示,而必须为数值,即使你已经在之前定义过,也不行,因为 inline 语句将引号中的表达式录为符号格式,其中任何的字母或者字母组合,都会被认为是变量,即使你在语句之后只写了真正的变量,程序还是会全部误读这就在做积分时候带来错误,明明是常量的 a 和 b,Matlab还是要求你给他们一个积分空间进行积分,从而出错 定义完函数之后,直接使用 quad 或者 quad

14、8,进行数值积分: F = quad(fx, 1, 10,1e-10); % 1,1是积分上下限,1e-10 是积分精度 元宵节说了一堆电脑计算的事情,真的很奇怪 祝大家元宵节快乐! 四数值积分trapz()用复化梯形公式求解定积分命令格式:I=trapz(x,y)X 是积分区间内的离散数据点向量, y 是 x 的各分量函数值构成的向量,输出项 I 为积分的近似值例:计算积分 exp(x)在 0 到 1 上clear;clc;x=0:0.2:1;y=exp(x);I=trapz(x,y)quad()采用自适应步长的辛普森公式求定积分命令格式:I=quad(fun,a,b,tol)Fun 是被积

15、函数,a,b 是积分区间的左右端点,tol 为积分的精度要求,缺省值是 1e-6,输出项为积分的近似值。例:计算积分 exp(x)在 0 到 1 上fun=inline(exp(x);I=quad(fun,0,1);quadl()采用自适应步长的 Lobatto 公式求定积分命令格式:I=quadl(fun,a,b,tol)dblquad()在矩形区域上求二重积分命令格式:I=dblquad(fun,a,b,c,d,tol,method)Fun 是二元被积函数 f(x,y),a,b 是变量 x 的上下限,cd 是变量 y 的上下限,tol 微积分的精度要求,缺省值是 1e-6,method 是

16、积分方法,一种是quad,另一种是quadl,缺省值为quad.例子:(1)计算二重积分 x2+y2,x 从 0 到 1,y 从 0 到 1I=dblquad(inline(x.2+y.2),0,1,0,1)syms x y;I2=int(int(x2+y2,y,0,1),0,1)(2)计算二重积分 I=(1-x2-y2)dxdy, 其中 D=(x,y)|x2+y2 fun=(x) exp(-x.2./2)./(sqrt(2*pi)T=rctrap(fun,0,pi/2,14), syms tfi=int(exp(-t2)/2)/(sqrt(2*pi),t,0, pi/2);Fs= doubl

17、e(fi), wT= double(abs(fi-T)fun =(x)exp(-x.2./2)./(sqrt(2*pi)T =Columns 1 through 71.4168 1.3578 1.3313 1.3195 1.3142 1.3119 1.3109Columns 8 through 141.3105 1.3103 1.3102 1.3102 1.3101 1.3101 1.3101Fs =0.4419wT =Columns 1 through 70.9749 0.9159 0.8894 0.8776 0.8723 0.8700 0.8690Columns 8 through 140

18、.8686 0.8684 0.8683 0.8683 0.8683 0.8682 0.86822 复合辛普森(Simpson)数值积分的 MATLAB 主程序function y=comsimpson(fun,a,b,n)% fun 函数 a 积分上限 b 积分下限 n 分割小区间数z1=feval_r(fun,a)+ feval_r(fun,b);m=n/2;h=(b-a)/(2*m); x=a;z2=0; z3=0; x2=0; x3=0;for k=2:2:2*mx2=x+k*h; z2= z2+2*feval_r(fun,x2);endfor k=3:2:2*mx3=x+k*h; z3

19、= z3+4*feval_r(fun,x3);endy=(z1+z2+z3)*h/3;由于 Matlab 自带了 quad 就是这个算法 所以比较少自己编3 龙贝格数值积分的 MATLAB 主程序function RT,R,wugu,h=romberg(fun,a,b, wucha,m)%fun 被积函数 a,b 积分上下限 wucha 两次相邻迭代绝对差值 m 龙贝格积分表最大行数%RT 龙贝格积分表 R 数值积分结果 wucha 误差估计 h 最小步长n=1;h=b-a; wugu=1; x=a;k=0; RT=zeros(4,4);RT(1,1)=h*(feval_r(fun,a)+fe

20、val_r(fun,b)/2;while(wuguwucha) RT,R,wugu,h=romberg(F,0,1.5,1.e-8,13)syms xfi=int(1/(1+x),x,0,1.5); Fs=double(fi),wR=double(abs(fi-R), wR1= wR - wuguRT =1.0500 0 0 0 0 00.9536 0.9214 0 0 0 00.9260 0.9168 0.9165 0 0 00.9187 0.9163 0.9163 0.9163 0 00.9169 0.9163 0.9163 0.9163 0.9163 00.9164 0.9163 0.9163 0.9163 0.9163 0.9163R =0.9163wugu =2.9436e-011h =0.0469Fs =0.9163wR =9.8007e-011

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。