【问题标题】:Numerically integrate a function f(x) over x using MATLAB where f(x) has another argument y which is a vector使用 MATLAB 在 x 上对函数 f(x) 进行数值积分,其中 f(x) 有另一个参数 y,它是一个向量
【发布时间】:2012-09-10 04:00:42
【问题描述】:

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

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

我不能使用 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,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])。这将帮助其他人找到您的问题并回答。

标签: matlab vector integration numerical


【解决方案1】:

来自documentationon quad 上面写着:

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

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

另外,要使用常量向量Y 参数化函数调用,我建议使用匿名函数调用。有一个合理的演示here。以下是我在 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

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

【讨论】:

    【解决方案2】:

    我相信以下方法也可以:

    y = randn(10,1); 
    func = @(x) sum(exp(-1/2 *(x-y)));
    integral(func,0,1,'ArrayValued',true)
    

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 2021-09-25
      • 1970-01-01
      • 2021-07-18
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多