本帖最后由 winner245 于 2015-7-17 12:26 编辑
关于单个函数向量化积分的探讨
winner245
向量化积分简介
给定一个函数f,我们可能需要计算一系列定积分。比如,i)求解一个带参数函数f(x,t),x为自变量,t为参数,在M个不同参数取值t= t1, …, tM时在某固定区间[a,b]上的定积分;ii)对于同一个函数f(x),求解在N个不同区间上[a1,b1]、[a2,b2]、…、[aN,bN]的定积分;iii)求解带参数函数f(x,t)在M个不同参数取值和N个不同区间上的定积分。显然,无论是上述哪一种情形,我们都将面临求解一系列定积分。本文重点关心的是如何通过向量化运算,求解出该函数所有的定积分,且计算过程不涉及任何循环(以及循环的简写代码:arrayfun)。本文将能够实现这类积分功能的向量化运算称之为“向量化积分”。
本文假定所求积分不存在解析解,即符号积分失效。故将重点讨论如何通过数值积分(借助quad、quadl、quadgk、quadv、integral等函数)来实现向量化积分。
问题描述
在数值计算中,我们常常会碰到下列三类积分问题。
问题1(带参数函数在固定区间上的定积分):求带参数函数f(x,t)当参数t取M个不同数值时在某固定区间[a,b]上的定积分:
问题2(不带参数函数在多个区间上的定积分):求函数f(x)在N个不同区间[an,bn],
,上的定积分:
问题3(带参数函数在多个区间上的定积分):求带参数函数f(x,t)当参数t取M个不同数值,在N个不同区间[an,bn], n = 1,2, …, N,上的定积分:
为了方便后面写代码,本文将考虑下面的被积函数:
其中,x为自变量,t为参数。
问题分析
要求解一系列积分,最容易想到的办法就是循环求解。比如,通过for循环实现每次循环求解一个定积分。另外,for循环代码还可以通过arrayfun函数来简写,这种“简写”本质上还是循环,只不过代码看起来更简洁,代码效率与for循环相当(依然很低)。但下文仍会给出基于arrayfun的代码,作为参照系来衡量向量化积分的优越性。
对于问题1(固定区间上的带参数函数的定积分),可以直接调用MATLAB向量化积分函数quadv或integral,这两个函数是MATLAB提供的仅有的两个支持向量化积分的函数。具体做法是:将被积函数f(x,t)定义为可接受向量化参数t的关于x的函数句柄,然后直接调用quadv或integral&#x