我有一个依赖于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的情况下实现它?
答案 0 :(得分:1)
有两个级别,为什么ArrayValued
参数需要设置true
:函数要求以及函数具有这些要求的原因。
每its documentation的被动函数句柄fun
的要求是:
对于标量值问题,函数
y = fun(x)
必须接受向量参数x
,并返回向量结果y
。 ...如果您将'ArrayValued'
选项设置为true
,那么fun必须接受标量并返回固定大小的数组。
根据您的代码,如果p
未设置为integral
,则函数句柄ArrayValued
会通过true
接收积分点向量。然后,polarfun
接收theta
和integral(@(r)polarfun(r,theta),0,Inf)
的向量将产生标量值,假设在内部 - integral
执行时没有发生尺寸不匹配。由于外部 - integral
传递了一个向量并收到了一个标量,因此会抛出错误,因为这些尺寸不匹配,默认情况下ArrayValued
为false
。
现在,为什么要求是这样的呢? 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);