首页 > 解决方案 > 内含二维积分的矢量化函数

问题描述

我在尝试编写带有内部积分的矢量化输入的二维函数时遇到了麻烦。

我的功能如下:

thick = 40e-9; 
overlap = (@(E,T)integral2(@(x,y)exp(E.*T.*abs(x-y)),0,thick,0,thick)); 

如果我用标量输入调用函数,例如重叠(1,1),这很好用。

overlap(1,1)
ans = 1.6000e-15

但是,如果我使用 E 和 T 的向量输入调用函数,例如E=1:1:10and T=1:1:10,这不起作用。我得到以下信息:

Error using  .* 
Matrix dimensions must agree.

有谁知道如何使用矢量化输入进行这项工作?我正在寻找一种在内联函数本身中执行此操作的方法,而无需 for 循环。

标签: arraysmatlabfunction

解决方案


错误是指ET具有不同的形状xy,大概integral2将数组传递给xy。这个便利函数没有配备集成数组值函数,因此它可以自由地使用它认为合适的数组值输入。

您的问题有一个简单的解决方法:将求幂移到积分之外:

>> overlap = @(E,T)integral2(@(x,y)exp(abs(x-y)),0,thick,0,thick).^(E.*T); 
>> overlap(1,1)                                                            

ans =

   1.6000e-15

>> overlap(E,T)                                                            

ans =

   1.0e-14 *

    0.1600    0.0000    0.0000    0.0000         0         0         0         0         0         0

由于双精度,这不是一个非常有趣的结果,但重要的是错误已经消失并且结果具有适当的大小。

但是您可以很容易地看到您甚至不必在函数内部进行积分,因为积分不再取决于您的函数输入。这将使您的函数调用更快

>> thick = 1; % I don't like zeros
>> int = integral2(@(x,y)exp(abs(x-y)),0,thick,0,thick); % integrate only once!
>> overlap = @(E,T) int.^(E.*T);                        
>> overlap(1,1)

ans =

    1.4366

>> overlap(1:2,1:2)

ans =

    1.4366    4.2589

推荐阅读