3

我想对一个向量进行数值积分,该向量表示一个函数 f(x) 在 Matlab 中由边界 x0 和 x1 指定的 x 范围内。我想检查积分的输出是否正确并且收敛。

有 quad 和 quadl 函数可以很好地识别所需的误差容限,但它们需要输入参数是函数,而不是函数的结果向量。还有一个 trapz 函数,我们可以在其中输入两个向量 x 和 f(x),然后它根据向量 x 使用的间距计算 f(x) 关于 x 的积分。但是,没有任何方法可以使用 trapz 来调整 quad 和 quadl 中的容差并确保答案收敛。

我不能使用quad和quadl函数的主要问题是f(x)是以下等式:f(x)= sum(exp(-1/2 *(xy))),总和超过y,其中 y 是长度为 n 的向量,x 是每次都给函数 f(x) 的元素。因此,向量 y 中的所有元素都从元素 x 中减去,然后计算对 y 的总和,得到 f(x) 值。这是针对 x 的 m 个值完成的,其中 m 不等于 n。

当我按照 Matlab 手册中的说明使用 quadl 时,其中 f(x) 在单独的函数 .m 文件中定义,然后在主调用文件中定义,我使用 Q = quadl(@f,x0,x1,tolerance,X,是);这里 X 是长度为 m 的向量,Y 是长度为 L 的向量。Matlab 给出错误:“??? Error using ==> minus Matrix dimensions must agree.” 在我在 .m 函数文件中定义函数 f(x) 的那一行。f(x) = sum(exp(-1/2 *(xy)))

我假设问题是Matlab将x和y视为向量,当它们彼此相减时应该具有相同的长度,而需要的是每次从向量X中的单个元素中减去向量Y。

您能否推荐一种解决此问题的方法,并通过控制公差的方法成功地将 f(x) 与 x 进行数值积分?

4

2 回答 2

3

从它的文档quad说:

函数 y = fun(x) 应该接受向量参数 x 并返回向量结果 y,即在 x 的每个元素处计算的被积函数。

所以每次我们调用函数时,我们都需要计算每个给定的被积函数x

此外,要使用常量 vector 参数化函数调用Y,我建议使用匿名函数调用。这里有一个合理的演示。以下是我在 Matlab 中实现您的问题的方法:

function Q = test_num_int(x0,x1,Y)
  Q = quad(@(x) myFun(x,Y),x0,x1);
end

function fx = myFun(x,Y)
  fy = zeros(size(Y));
  fx = zeros(size(x));
  for jj=1:length(fx)
    for ii=1:length(Y)
      fy(ii) = exp(-1/2 *(x(jj)-Y(ii)));
    end
    fx(jj) = sum(fy);
  end
end

然后我调用该函数并得到以下输出:

Y = 0:0.1:1;
x0 = 0;
x1 = 1;
Q = test_num_int(x0,x1,Y)

Q =

   11.2544

下限和上限以及常量数组的输入显然只是虚拟值,但积分很快收敛,几乎立即收敛。希望这可以帮助!

于 2012-09-18T15:01:58.650 回答
1

我相信以下方法也会起作用:

y = randn(10,1); 
func = @(x) sum(exp(-1/2 *(x-y)));
integral(func,0,1,'ArrayValued',true)
于 2016-09-02T18:50:41.163 回答