如何在 Matlab 中计算双和,其中第二个和的上限是第一个和的下限?

How to compute double sum in Matlab where upper bound of second sum is lower bound of first sum?

我在 Matlab 中实现一个调用我在不同 .m 文件中编写的其他函数的函数时遇到很大困难。我卡住的部分是对另一个函数中输入的不同值求和的部分,另一个函数内部也有一个总和。第一个总和的下限是第二个总和的上限。

功能是:

我的 Hh(n,x) 函数可以正常工作,n 作为向量输入,x 作为标量输入。由于n的向量化输入,In函数内部Hi上的和可以通过调用sum(Hh(0:n,x)).

快速计算出来

我想对In函数做同样的事情,但是因为In里面的n现在的范围是0到k-1,而外面的函数k的范围是1到n,我不知道如何计算这个double总和,其中内部总和将外部总和的下限作为上限。我想尽可能有效地计算这个双和,因为以后我想用这些公式做很多模拟。现在我正在评估函数 In n 次,将每个值存储在一个向量中,然后求和,这在计算上非常密集...

我的 In 函数的 Matlab 代码是:

function in = In(n,c,alphaa,betaa, delta)
ie = 0:n;
in = -(exp(alphaa*c)/alphaa)...
     .*sum((betaa/alphaa).^(n-ie).*Hh(ie,betaa*c-delta))...
     -(betaa/alphaa).^(n+1)
end

外部函数的 Matlab 代码,暂且称之为函数 f 是:

function f = F(n,a,mu,sigma,eta1,T)
for k = 1: n
    vector(k) =  In(k-1,a-mu*T,-eta1,-1/(sigma*sqrt(T)),-(sigma*eta1*sqrt(T)));
end
f = sum(vector);
end

如何把In里面的n的输入向量化,这样就不用把输入的n个值都单独存起来再求和,而是直接对输入的向量n求和。

感谢任何帮助,因为我现在被严重困住了!提前致谢!

因此,为了具体回答您的问题(n 向量化的输入),我将执行以下操作:

% 1.为每个k创建一个从0到k-1的向量ivect,以及一个对应于iterate ivect的向量kvect:

ivect=[];
kvect=[];
for k=1:n
    ivect = [ivect 0:k-1];
    kvect = [kvect (k-1)*ones(1,k)];
end

% 2. 根据您的迭代 i 和 k 创建位于两个总和内的函数:

    function in = In2(k,ie,c,alphaa,betaa, delta)
in = -(exp(alphaa*c)/alphaa)*((betaa/alphaa).^(k-ie).*func(ie,betaa*c-delta))-(betaa/alphaa).^(k+1)./(k+1);
end

% 3. 然后求和:

f=sum(In2(kvect,ivect,a-mu*T,-eta1,-1/(sigma*sqrt(T)),-(sigma*eta1*sqrt(T))))

起初我以为这种方法会减少求和的计算时间(当然第1点成本很高,但是可以一次完成并用于多次模拟而不需要重建这些向量), 但即使只是比较行:

tic
for k = 1: n
    vector(k) =  In(k-1,a-mu*T,-eta1,-1/(sigma*sqrt(T)),-(sigma*eta1*sqrt(T)));
end
f = sum(vector)
toc

tic
f=sum(In2(kvect,ivect,a-mu*T,-eta1,-1/(sigma*sqrt(T)),-(sigma*eta1*sqrt(T))))
toc

第一种方法我得到1.029899秒,第二种方法得到1.684432秒,n = 5000。但幸运的是,我找到了原因!这是因为这个方法实际上会产生更多的算术操作,就像在函数 In2 中一样,我要求我的代码为每个计算 -(betaa/alphaa).^(k+1)./(k+1) k 和 i,而这一项仅取决于 k。所以现在,让我们定义函数 In3 和 In4 这样:

function in = In3(k,ie,c,alphaa,betaa, delta)
in = -(exp(alphaa*c)/alphaa)*((betaa/alphaa).^(k-ie).*Hh(ie,betaa*c-delta));    end

function in = In4(k,alphaa,betaa)
    in=-(betaa/alphaa).^(k+1);
end

并致电

tic
f=sum(In3(kvect,ivect,a-mu*T,-eta1,-1/(sigma*sqrt(T)),-(sigma*eta1*sqrt(T)))) +sum(In4([1:n],-eta1,-1/(sigma*sqrt(T))))
toc

瞧,对于 N=5000,我在 0.929530 秒内获得了相同的结果。总而言之,您使用最后一种方法获得了一些时间,但完全公平地说,您有两个缺点:

  1. 一开始ivect和kvect的时间计算-但是我坚持这些vector可以一次构造,存储,多次模拟使用-

  2. 内存消耗:ivect 和 kvect 的大小为 n(n+1)/2,这对于大 n

  3. 来说是很大的

希望它对您有所帮助,无论如何感谢您提出的有趣问题,这可能对我自己的研究有用!