【问题标题】:Vectorized function with 2d integral inside内含二维积分的矢量化函数
【发布时间】:2018-06-19 23:17:08
【问题描述】:

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

我的功能如下:

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:10T=1:1:10,这不起作用。我得到以下信息:

Error using  .* 
Matrix dimensions must agree.

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

【问题讨论】:

    标签: arrays matlab function


    【解决方案1】:

    错误是指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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多