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