Bagaimana cara menghitung jumlah ganda di Matlab di mana batas atas jumlah kedua adalah batas bawah jumlah pertama?

Saya mengalami kesulitan besar dalam mengimplementasikan fungsi di Matlab yang memanggil fungsi lain yang telah saya program dalam file .m yang berbeda. Bagian di mana saya terjebak adalah bagian di mana jumlah dari nilai-nilai berbeda yang dimasukkan dalam fungsi lain diambil, di mana ada juga jumlah di dalam fungsi lainnya. Batas bawah penjumlahan pertama adalah batas atas penjumlahan kedua.

Fungsinya adalah: Jumlah Ganda

Saya memiliki fungsi Hh(n,x) yang berfungsi dengan baik untuk n yang dimasukkan sebagai vektor dan x yang dimasukkan sebagai skalar. Karena masukan vektor n, jumlah Hi di dalam fungsi In dapat dihitung dengan cepat dengan memanggil sum(Hh(0:n,x)).

Saya ingin melakukan hal yang sama untuk fungsi In, tetapi karena n di dalam In sekarang berkisar dari 0 hingga k-1 dan di fungsi luar k berkisar dari 1 hingga n, saya tidak tahu bagaimana cara mengevaluasi jumlah ganda ini, di mana bagian dalam jumlah memiliki batas bawah dari jumlah terluar sebagai batas atas. Saya ingin mengevaluasi jumlah ganda ini seefisien mungkin, karena nanti saya ingin melakukan banyak simulasi dengan rumus ini. Sekarang saya mengevaluasi fungsinya dalam n kali, menyimpan setiap nilai dalam sebuah vektor dan kemudian mengambil jumlahnya, yang sangat intens secara komputasi...

Kode Matlab saya untuk fungsi In adalah:

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

Kode Matlab untuk fungsi luar, sebut saja fungsi f untuk saat ini adalah:

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

Bagaimana cara membuat input n di dalam In menjadi vektor, sehingga saya tidak perlu menyimpan semua nilai n yang dimasukkan secara terpisah lalu menghitung jumlahnya, tetapi menghitung langsung jumlah untuk vektor n yang dimasukkan.

Bantuan apa pun dihargai karena saya benar-benar terjebak saat ini! Terima kasih sebelumnya!


person Peter Lawrence    schedule 20.06.2017    source sumber


Jawaban (1)


Jadi untuk menjawab pertanyaan Anda secara spesifik (input n vektor), saya akan melakukan hal berikut:

% 1. buat hasil vektor dari 0 ke k-1 untuk setiap k, dan hasil vektor yang sesuai dengan hasil perulangan:

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

% 2. buat fungsi yang ada di dalam dua jumlah, bergantung pada iterasi i dan k Anda:

    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. lalu jumlahkan:

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

Awalnya saya berpikir metode ini akan mengurangi waktu komputasi dalam perhitungan penjumlahan (tentu saja poin 1. mahal, namun dapat dilakukan satu kali dan digunakan untuk beberapa simulasi tanpa perlu merekonstruksi vektor-vektor tersebut), namun malah membandingkan hanya baris-barisnya:

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

dengan

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

Saya memperoleh 1,029899 detik untuk cara pertama, dan 1,684432 detik untuk cara kedua, dengan n = 5000. Tapi untungnya, saya menemukan alasannya! Hal ini disebabkan oleh fakta bahwa metode ini sebenarnya menghasilkan lebih banyak manipulasi artimatika, seperti dalam fungsi In2 saya mewajibkan kode saya untuk menghitung -(betaa/alphaa).^(k+1)./(k+1) untuk setiap k dan i, sedangkan suku ini hanya bergantung pada k. Jadi sekarang, mari kita definisikan fungsi In3 dan In4 sedemikian rupa sehingga:

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

dan menelepon

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

Dan voila, saya mendapatkan hasil yang sama dalam 0,929530 detik untuk N=5000. Singkatnya, Anda mendapatkan sedikit waktu dengan metode terakhir ini, tetapi sejujurnya menurut saya Anda memiliki dua kelemahan:

  1. Perhitungan waktu ivect dan kvect di awal - tetapi saya bersikeras bahwa vektor-vektor ini dapat dibuat sekali untuk selamanya, disimpan, dan digunakan untuk beberapa simulasi-

  2. Biaya memori: ivect dan kvect berukuran n(n+1)/2, yang banyak untuk n besar

Semoga ini bisa membantu Anda, dan terima kasih atas pertanyaan menarik yang mungkin bisa membantu saya dalam penelitian saya sendiri!

person Toghe    schedule 21.06.2017