一次将多变量函数集成到一个变量中

时间:2016-07-07 17:53:06

标签: matlab

我有一个依赖于x和y,f(x,y)的函数(返回一个标量),我需要对它进行积分,以便对于特定的点(x0,y0),我得到一个函数p(theta) ),我基本上把它转换为极地,改变原点并整合到r,所以剩下的功能只取决于theta:

%fun = @(x,y) Some function
fun = @(x,y) fun(x+x0,y+y0);
polarfun = @(r,theta) fun(r.*cos(theta),r.*sin(theta)).*r;
p = @(theta) integral(@(r)polarfun(r,theta),0,Inf);

获得此功能后,我需要再次集成它(w.r.t theta)。这不起作用(a和b是积分的极限)

value = integral(p,a,b);

我需要设置ArrayValued = true才能使其正常工作

value = integral(p,a,b,'ArrayValued',true);

我不明白为什么我需要指定它是一个ArrayValued函数,当它不是意图时,积分需要更多的时间,我需要它尽可能快地计算。你能解释一下为什么它是ArrayValued,以及是否有一种方法可以在没有将ArrayValued设置为true的情况下实现它?

1 个答案:

答案 0 :(得分:1)

为什么

有两个级别,为什么ArrayValued参数需要设置true:函数要求以及函数具有这些要求的原因。

its documentation的被动函数句柄fun的要求是:

  

对于标量值问题,函数y = fun(x)必须接受向量参数x,并返回向量结果y。 ...如果您将'ArrayValued'选项设置为true,那么fun必须接受标量并返回固定大小的数组。

根据您的代码,如果p未设置为integral,则函数句柄ArrayValued会通过true接收积分点向量。然后,polarfun接收thetaintegral(@(r)polarfun(r,theta),0,Inf)的向量将产生标量值,假设在内部 - integral执行时没有发生尺寸不匹配。由于外部 - integral传递了一个向量并收到了一个标量,因此会抛出错误,因为这些尺寸不匹配,默认情况下ArrayValuedfalse

现在,为什么要求是这样的呢? Cleve Moler最近写了blog post讨论integral及其前身。长和短是对于标量积分,矢量化函数评估在Matlab中产生the best performance;因此,它默认使用。

如果Mathworks想要,他们可能会编写一个更复杂的机制,通过使用bsxfun或类似的实用程序来使用向量值的被积函数进行评估。然而,增加的复杂性和随后所需的特定输入要求对于可能很少(如果有的话)性能增加而言可能过于繁重。因此,他们假设一个固有的标量函数,即Matlab向量化,并提供回退到标量节点评估的选项。此外,您的用例展示了一个巨大的问题,因为polarfun拥有theta的固定向量,如果integral需要优化,则很可能会生成维度不匹配或给出完全错误的结果其r整合。

建议

所有这些都是写的,我认为最好只使用integral2并让Matlab处理所有事情:

fun      = @(x,y) fun(x+x0,y+y0);
polarfun = @(r,theta) fun(r.*cos(theta),r.*sin(theta)).*r;
value    = integral(polarfun,0,Inf,a,b);