如何让 Octave 正确计算分段函数的双积分?

计算科学 matlab 正交 八度
2021-12-25 06:30:13

计算科学人:

标题就是问题。我正在尝试在 Octave (开源 Matlab 克隆)中的一个正方形上数值计算某个积分。我得到错误的答案。为了证明确实出了问题,我创建了以下玩具问题: Let ( if,否则 )。然后我写了一个 Octave 脚本来计算这个:f=χ(,1)f(t)=1t<100303f(t)f(t)dtdt=1

    junk=10;  %this is here just so Octave doesn't complain about the file name
    function out =R1(t)   
    if t < 1     
       out = 1; 
    else  
       out =0;    
    end%if                               
    end%function

    dIF = @(t1,t2) ones(size(t1))* R1(t1(1))*R1(t2);

    dblquad(dIF, 0, 3, 0, 3)  %should be 1.  Octave incorrectly gives 3.

    tx=0:0.1:3;
    ty=0:0.1:3;
    [xx, yy] = meshgrid (tx, ty);
    z=zeros(31,31);

    for i=1:31
      for j=1:31 
        z(i,j)=dIF(xx(i,j),yy(i,j)); 
      end%for j
    end%for i   
    mesh(xx,yy,z) %graph is correct  

 %end script

Octave 返回作为双积分的值,它应该是如您所见,脚本绘制被积函数,如预期的那样,如果都在我按照我的方式定义了函数 dIF,因为在我的实际问题中,我需要将其他参数传递给我正在集成的函数,这是我知道如何做到这一点的唯一方法。311xy010

在我的实际问题中,我可能只是将我的双积分切成九块,不需要分段函数,然后添加它们。但我想知道是否有更好的方法来做到这一点,以防我将来遇到类似的问题。

我没有在 Matlab 中尝试过,只有 Octave。我刚刚用我今天从一个有信誉的来源下载的 Octave 副本对其进行了测试。

1个回答

您的 R1 函数应该是向量值(它看起来好像是标量值)。例如,这似乎有效:

function out = R1(t)   
  out = t < 1;
end

dIF = @(x,y) R1(x) .* R1(y);

dblquad(dIF, 0, 3, 0, 3)