2017-06-20 88 views
1

我在Matlab中實現一個函數有很大的困難,它調用了我在不同的.m文件中編程的其他函數。被卡住的部分是在另一個函數中輸入的不同值的總和,在另一個函數內還有一個和的部分。第一個和的下限是第二個和的上限。如何在Matlab中計算第二和的上限是第一和的下限的雙和?

的功能是: doubleSum

我有了Hh(N,x)函數對於n工作正常輸入作爲一個向量,X輸入作爲一個標量。由於n的矢量化輸入,因此可以通過調用sum(Hh(0:n,x))快速計算In函數內Hi的和。

我想對In函數做同樣的事情,但是因爲in In現在範圍從0到k-1,而在外部函數k範圍從1到n,我不知道如何評估這個雙重和,其中內部總和的外部總和的下限作爲上限。我想盡可能有效地評估這個雙和,因爲後來我想用這些公式做很多模擬。現在我評價功能在N次,存儲在一個向量中的每個值,然後取之和,這是非常計算密集...

我對在功能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 

我怎樣才能使n的輸入內。在矢量化,讓我不必單獨存儲所有輸入的n值都和然後計算總和,但直接爲輸入的vec計算總和tor n。

任何幫助表示讚賞,因爲我現在嚴重卡住了!先謝謝你!

回答

0

所以具體回答你的問題(N矢量化的輸入),我會做到以下幾點:

%1.創建矢量ivect從0到K-1的每一個K,以及矢量kvect相應在迭代ivect:

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 I中我強制我的代碼爲每個k計算 - (betaa/alphaa)。^(k + 1)./(k + 1)我,而這個術語只取決於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 

瞧,我獲得0.929530秒爲N = 5000相同的結果。所以總結起來,你獲得了一些時間與該最後一個方法,但要完全公平的,我會說,你有兩個缺點:

  1. ivect和kvect在開始的時間計算 - 但我內存成本:ivect和kvect的大小爲n(n + 1)/ 2,這對於大型計算機來說是非常重要的。

希望它對你有幫助,無論如何感謝有趣的問題whi ch可能會在我自己的研究中服務於我!