Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 一次积分一个多变量函数_Matlab - Fatal编程技术网

Matlab 一次积分一个多变量函数

Matlab 一次积分一个多变量函数,matlab,Matlab,我有一个函数,它依赖于x和y,f(x,y)(返回一个标量),我需要对它进行积分,这样对于一个特定的点(x0,y0),我得到一个函数p(θ),我基本上把它转换成极坐标,改变原点并积分到r上,所以剩下的函数只依赖于θ: %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)

我有一个函数,它依赖于x和y,f(x,y)(返回一个标量),我需要对它进行积分,这样对于一个特定的点(x0,y0),我得到一个函数p(θ),我基本上把它转换成极坐标,改变原点并积分到r上,所以剩下的函数只依赖于θ:

%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θ)。这不起作用(a和b是积分的极限)

我需要设置ArrayValued=true,它才能工作

value = integral(p,a,b,'ArrayValued',true);
我不明白为什么我需要指定它是一个数组值函数,而实际上它不是,而且积分需要更多的时间,我需要尽可能快地计算它。您能解释一下为什么它是ArrayValue,以及是否有一种方法可以在ArrayValue未设置为true的情况下实现它吗?

为什么 关于为什么需要设置
ArrayValued
参数
true
,有两个级别:功能要求和功能为什么有这些要求

被积函数句柄
fun
per的要求是:

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

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

现在,为什么需求是这样的?克里夫·莫尔最近写了一篇讨论积分及其前身的文章。长和短的是,对于标量被积函数,向量化函数求值在Matlab中产生;因此,默认情况下使用它

如果Mathworks愿意,他们可能会编写一种更复杂的机制,通过使用
bsxfun
或类似的实用程序来执行向量值被积函数的求值。然而,增加的复杂性和随后所需的特定输入需求很可能过于繁重,以至于性能几乎没有提高(如果有的话)。因此,他们假设一个固有的标量函数,该函数通过一个返回到标量节点求值的选项进行向量化。此外,您的用例显示了一个巨大的问题,因为
polarfun
拥有一个固定的
theta
向量,如果
integral
需要改进其
r
集成,那么它很可能会产生维度不匹配或给出完全错误的结果

推荐 在编写了所有这些之后,我认为最好只使用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);

谢谢你的回复。我知道我可以忘记ArrayValue部分(我没有真正理解),然后使用integral2对这两个变量进行积分。问题是,我需要积分快速运行,如果函数不是ArrayValue函数,性能自然会更快。因此,在这一点上,我不确定该怎么做,因为这需要花费过多的时间。我也可以对函数进行采样,只使用quad或trapz,但我希望有一个函数,因为之后我需要使用一个最小化函数(如fmincon)来找到一个最小值
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);