MATLAB数值计算-第6章-数值积分
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB数值计算
(读书日记及程序编写)
第六章数值积分 (2)
第六章 数值积分
#什么是数值积分
对于函数
()dx x f I b
a ⎰= 只要找到被积分函数f(x)的原函数F(x),通过牛顿-莱布尼茨(Newton-Leibniz)公式: ())()(
b F a F dx x f I b
a -==⎰ 但是实际使用这种求积方法往往很困难,大量的被积函数如()0sin ≠x x
x 、2x e -等等,原函数是不能使用初等函数来表达,所以不能使用上述公式。
有时候即使求得被积函数的原函数,其公式非常复杂,导致积分的计算也很困难。
如被积函数611)(x
x f +=
,其原函数为: ()C x x x x x x x x F ++-+++-+=1
313ln 341)1arctan(61arctan 3122
数值积分的基本思路:
通过求面积的方式得到来得到近似的积分值。
Numerical Integration(数值积分)
Quadrature(数值积分) (求积分,求面积)quad 是什么意思?
#基本的数值积分公式:
梯形法则和中点法则是最低准确度,辛普森法则加入了中点,精度提高,通过加入更多的点,当然得到了更高的精度。
中点法则
)b a hf(
M 2+= 对于3
1311031
02==⎰x dx x 4
1)210(122=+⨯=+=)b a hf(M 误差为1/12
梯形法则
)f(b)f(a)hf(
M 2+= 对于3
1311031
02==⎰x dx x
2
121012=+⨯=+=)()f(b)f(a)h(M 误差为1/6
辛普森法则
上述现象具有普遍性,如果中点法则(M)是梯形法则(T)准确性的-2倍,这样得到新的积分法则
S-T=-2(S-M)
得到S=2/3M+1/3T
对应的可以由两个端点a,b 和中点c=(a+b)/2推出辛普森法则
)46
f(b)f(c)(f(a)h S ++=
复合辛普森法则
如果将面积S 再分成两半[a,c],[c,b],再多执行一次,令d 和e 分别为两半的中点d=(a+c)/2, e=(c+d)/2,在两个区间上再使用辛普森法则,得到整个的公式为:
))(42412
2b f f(e)f(c)f(d)(f(a)h S ++++=
外推辛普森法则(Weddle 法则,六阶的牛顿-科斯特法则(Newton-Cotes Ruler)
15)/-(22S S S Q +=
组合梯形、组合辛普森等分段式的方法
#辛普森积分公式的应用:
要计算函数 x^2 在(0,2)内的积分,
===⎰0)-2(3
13132032
02x dx x 2.6667 将函数写成:
function y=square(x)
y=x.*x;
调用函数,
>> y=quad(@square,0,2)
y =
2.6667
也可以
f=@(x)x.^2
quad(f,0,2)
function y=aaa(x)
y=1./(3*x-1);
对于[1,1.5]区间的积分,可以得到
>> y=quad(@aaa,1,1.5)
y =
0.1865
对于[0,1]区间的积分,中间出现了无穷大(x=1/3)的时候
y=quad(@aaa,0,1)
Warning: Infinite or Not-a-Number function value encountered. > In quad at 109
y =
Inf
#内置函数
可以不采用调用函数,而采用内置函数的形式。
1)inline内置函数指令
f=inline('1/sqrt(1+x^6)')
f =
Inline function:
f(x) = 1/sqrt(1+x^6)
quadtx(f,0,1)
ans =
0.9270
quad(f,0,1)
Error using ==> inlineeval at 15
Error in inline expression ==> 1/sqrt(1+x^6)
Matrix must be square.
2)匿名函数指令
>> f=@(x) 1/sqrt(1+x^4)
f =
@(x)1/sqrt(1+x^4)
>> Q=quadtx(f,0,1)
Q =
0.9270
>>
对quadtx 函数的解释:
help quadtx
QUADTX Evaluate definite integral numerically.
Q = QUADTX(F,A,B) approximates the integral of F(x) from A to B to within a tolerance of 1.e-6.
Q = QUADTX(F,A,B,tol) uses the given tolerance instead of 1.e-6.
The first argument, F, is a function handle or an anonymous function that defines F(x). Arguments beyond the first four, Q = QUADTX(F,a,b,tol,p1,p2,...), are passed on to the integrand, F(x,p1,p2,..).
QUAD Numerically evaluate integral, adaptive Simpson quadrature.
Q = QUAD(FUN,A,B) tries to approximate the integral of scalar-valued function FUN from A to
B to within an error of 1.e-6 using recursive adaptive Simpson quadrature. FUN is a function
handle. The function Y=FUN(X) should accept a vector argument X and return a vector result Y, the integrand evaluated at each element of X.
Q = QUAD(FUN,A,B,TOL) uses an absolute error tolerance of TOL instead of the default, which is 1.e-6. Larger values of TOL result in fewer function evaluations and faster computation, but less accurate results. The QUAD function in MATLAB 5.3 used a less reliable algorithm and a default tolerance of 1.e-3.
(函数quad, quadtx 是有区别的
Quad: Numerically evaluate integral, adaptive Simpson quadrature,自适应的Simpson 积分 Quadtx :Q = QUADTX(F,A,B) approximates the integral of F(x) from A to B to within a tolerance of 1.e-6. 就是简单的计算从A 到B 间的定积分
#符号积分
直接推导出积分公式,并算出积分,
要计算函数 x^2 在(0,2)内的积分,
===⎰0)-2(3
13132032
02x dx x 2.6667
可以直接输入积分公式int(‘fun’,积分下限,积分上限)
>> result=int('x^2',0,2)
result =
8/3
也可以得到积分公式:
>> syms a b
>> result=int('x^2',a,b)
result =
b^3/3 - a^3/3
但是,请注意,直接用积分公式的话,有的积分是很难有结果的。
尤其当需要进行定积分的上下限要讨论的时候很复杂。
>> result=int('1/3*x',a,b)
b^2/6 - a^2/6
而下面
>>result=int('1/x')
ans =
log(x)
>>result=int('1/3*x-1',0,1)
result =
-5/6
另外,不定积分
>> int('1/3*x-1')
ans =
(x - 3)^2/6
#quadgui:
quadgui(@(x)x^2,0,1)
quadgui(@(x)sin(x),0,3)
过程就是将其中取的区间
ezplot(@humps,0,1)
humps
x
quadgui(@humps,0,1,1.e-4)
#不可积分的函数
习惯上,如果一个已给的连续函数的原函数能用初等函数表达出来,就说这函数是“积得出的函数”,否则就说它是“积不出”的函数。
比如下面列出的几个积分都是属于“积不出”的函数,但是这些积分在概率论,数论,光学,傅里叶分析等领域起着重要作用。
(1)∫e^(-x²)dx;(2)∫(sinx)/xdx;
(3)∫1/(lnx)dx;(3)∫sinx²dx;
但是当我们在MatLab中输入下面的值的话,得到的是:
>> result=int('sin(x)/x')
result =
sinint(x)
这样得到的值是对的吗?比如我们按照[0,pi]这样的区间定积分,这样同样的在有的区间上就是不可取值的断点。
Sin(pi)*log(pi)-sin(0)*log(0)=0,
做出曲线为:
>> x=-1:0.1:20;
>> y=sin(x).*log(x);
>> plot(x,y)
这些不能求积分的函数其实就是在某些点存在严重的断点。
#函数的作图:
1)首先作为一个函数的话,必须写成sin(x)而不能写成sinx,前者才是一个函数
2) 在多项式的表达中,x后面要加点的,尤其是当x本身已经定义了是一个数列的话,这就表示后面的计算是数列中的数一个一个的计算的,这是数组的乘法,否则就变成了矩阵的乘法了,加点都表示数组,其实是.^是运算符合表示数组的乘方,./表示数组除法等
求y=x^5-3.5*x^4+2.75*x^3+2.125*x^2-3.875*x+1.25的曲线,用x,y画出
>> x=-1:0.05:3;
>> y=x.^5-3.5*x.^4+2.75*x.^3+2.125*x.^2-3.875*x+1.25;
而不能写成:
y=x.^5-3.5*x^4+2.75*x.^3+2.125*x.^2-3.875*x+1.25;
3) 定义了
>>x=-1:0.1:20;
>>y=x./sin(x);
>> plot(x,y)
(可见画出的图在sin(x)=0的地方都是缺的,是无穷大)
>>x=-1:0.1:20;
>>y= sin(x)./ x;
>> plot(x,y)
(可见画出的图在sin(x)=0的地方都是1,这是一个极值,符合情况。
)
可以估算一下在(0,pi)间,面积为1*3.14*(2/5)=1.8
也可以直接使用内嵌函数来计算:
>> f=inline('sin(x)/x');
>> Q=quadtx(f,0,pi)
这个时候,由于有0作为除数,不能计算改成Matlab能取的最小的浮点数realmin, >> Q=quadtx(f,realmin,pi)
Q =
1.8519
4)在MatLab中π定义为pi,这是一个已经定义了的函数,NaN:不定式,表示0/0, 或者inf/inf的结果,inf为无穷大
a=1/0
a =
Inf
#离散数据的积分-复合梯形法则:
x=1:6
y=[6 8 11 7 5 2]
T=sum(diff(x).*(y(1:end-1)+y(2:end))/2)
35
#数值微分-差分:
差分其实就可以直接使用导数定义来计算:
求x^3在x=2时的微分,3*2^2=12
((2+0.0001)^3-2^3)/0.0001
12.0006
中心差分:
h
h)-f(x-h)f(x (x)f 2+≈' 精度为O(h 2)的中心差分公式
h
-f f )(x f 21-10≈
' 21-0102h
f f -f )(x f +≈''
3
2-1-12032-2h f f -f f )(x f +≈
等等
例题:
使用MatLAB 中的diff 函数计算f(x)=0.2+25*x-200*x.^2+675*x.^3-900*x.^4+400*x.^5在区间中的微分,并与精确解相比较。
解:该函数的微分的精确解很容易通过求导得到:
f ’(x)=25-400*x+2025*x^2-3600*x^3+2000*x^4
程序
x=0:0.1:0.8;
f=@(x)0.2+25*x-200*x.^2+675*x.^3-900*x.^4+400*x.^5;
y=f(x)
diff(x)
d=diff(y)./diff(x)
n=length(x)
xm=(x(1:n-1)+x(2:n))./2
xa=0:0.01:.8
ya=25-400*xa+2025*xa.^2-3600*xa.^3+2000*xa.^4
plot(xm,d,'o',xa,ya)
(注解:
1. diff()函数是后一个减去前一个数,形成数列
2. xm 是按照导数的标准定义,取中点的值,
3. xa, ya 是精确解
#数值积分和微分方程有什么区别
下面两个质量块的振动方程。
两个质量块m1,m2以弹簧连接于两边墙上,对于质量块m1, m2使用牛顿第二定律写出每个物体的受力平衡关系式为
⎪⎪⎩⎪⎪⎨⎧==+0)2-(-0)2(--212221212121x x k dt x d m x x k dt x d m
这两个质量块能够通过数值积分方式得到吗?数值积分是自变量的显式的一个积分,而当表达式完全不知道的时候是不可以使用数值积分的。
一般而言,微分方程是不能通过直接数值积分的方式来得到解的。
课外作业:
6.10,6.13,6.23
2014-6-6
6.9,6.13。