y = @(s)sin(0.5*s.^2);
quad(y, 0, 26.9);
结果误差远远超过了缺省值,这是为什么?
而如果将上限增减0.01,即:
quad(y, 0, 26.89);
或quad(y, 0, 26.91);
误差就突然很小了,这到底是什么原因啊,百思不得其解,望各位高手指点一下啊,谢谢!
即使只增加0.001,
即quad(y, 0, 26.901);
就没误差了,但是加0.0001误差就产生了~
MATLAB中 quad 函数是用Simpson's rule方法,即利用给定区间内的二次曲线进行拟合法求积分的,属于数值积分。
quad 的完整调用格式是 [Q,fcnt] = quad(funfcn,a,b,tol,trace,varargin)
第三个参数tol的缺省值是 1e-6(我用的是R2009a的版本) ,所以
quad(y, 0, 26.9)
相当于
quad(y, 0, 26.9,1e-6)
是以 1e-6 为求积误差的。
另外,这个quad计算定积分使用的Simpson's rule方法,在区间较大时,无法保证多项式拟合能够无穷逼近,特别地区间较大时该方法对于highly oscillatory(高度震动)的函数可能失效。
解决方法:把[0,26.9]分解成两个小区间分别积分——在matlab中输入:
quad(y,0,13)+quad(y,13,26.9)则会给出正确结果:0.9185
或者,你积分时设置更小的积分精度或使用 quadl 函数。quadl 函数是用自适应Lobatto正交法求积分的,求解精度比qaud 高。
附图是把积分一直算到了28时的结果,图中显示的尖点都是计算错误的地方,可见区间越大,积分越不可信。