使用 MATLAB 对函数 f(x) 对 x 进行数值积分,其中 f(x) 有另一个参数 y,它是一个向量

问题描述 投票:0回答:2

我想对一个向量进行数值积分,该向量表示函数 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 *(x-y))),对 y 求和,其中 y 是长度为 n 的向量,x 是每次给函数 f(x )。因此,从元素 x 中减去向量 y 中的所有元素,然后计算 y 上的总和,得到值 f(x)。这是针对 x 的 m 个值完成的,其中 m 不等于 n。

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

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

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

matlab vector numerical-integration
2个回答
3
投票

quad 上的

文档
中可以看出:

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

因此,每次调用该函数时,我们都需要在每个给定的

x
处计算被积函数。

此外,要使用常量向量

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

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


1
投票

我相信以下方法也有效:

y = randn(10,1); 
func = @(x) sum(exp(-1/2 *(x-y)));
integral(func,0,1,'ArrayValued',true)
© www.soinside.com 2019 - 2024. All rights reserved.