วิธีคำนวณผลรวมสองเท่าใน Matlab โดยที่ขอบเขตบนของผลรวมที่สองคือขอบเขตล่างของผลรวมแรก

ฉันประสบปัญหาใหญ่ในการใช้ฟังก์ชันใน Matlab ที่เรียกใช้ฟังก์ชันอื่นๆ ที่ฉันตั้งโปรแกรมไว้ในไฟล์ .m ที่แตกต่างกัน ส่วนที่ฉันติดอยู่คือส่วนที่นำผลรวมของค่าต่างๆ ที่ป้อนในฟังก์ชันอื่นมาใช้ โดยที่มีผลรวมในฟังก์ชันอื่นด้วย ขอบเขตล่างของผลรวมแรกคือขอบเขตบนของผลรวมที่สอง

ฟังก์ชั่นคือ: doubleSum

ฉันมีฟังก์ชัน Hh(n,x) ทำงานอย่างถูกต้องสำหรับ n ที่ป้อนเป็นเวกเตอร์และ x ที่ป้อนเป็นสเกลาร์ เนื่องจากอินพุตแบบเวกเตอร์ของ n ผลรวมของ Hi ภายในฟังก์ชัน In จึงสามารถคำนวณได้อย่างรวดเร็วโดยการเรียกผลรวม (Hh(0:n,x))

ฉันต้องการทำเช่นเดียวกันกับฟังก์ชัน In แต่เนื่องจาก n ภายใน In ตอนนี้มีค่าตั้งแต่ 0 ถึง k-1 และในฟังก์ชันภายนอก k มีตั้งแต่ 1 ถึง n ฉันไม่รู้ว่าจะประเมินผลรวมสองเท่านี้อย่างไร โดยที่ค่าภายใน ผลรวมมีขอบเขตล่างของผลรวมภายนอกเป็นขอบเขตบน ฉันต้องการประเมินผลรวมสองเท่านี้อย่างมีประสิทธิภาพที่สุดเท่าที่จะเป็นไปได้ เนื่องจากในภายหลังฉันต้องการจำลองหลายๆ รายการด้วยสูตรเหล่านี้ ตอนนี้ฉันกำลังประเมินฟังก์ชันในจำนวน n ครั้ง โดยเก็บแต่ละค่าไว้ในเวกเตอร์ แล้วหาผลรวมซึ่งมีความเข้มข้นในการคำนวณมาก...

รหัส Matlab ของฉันสำหรับฟังก์ชัน In คือ:

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 ที่ป้อนทั้งหมดแยกจากกัน แล้วคำนวณผลรวม แต่คำนวณผลรวมโดยตรงสำหรับเวกเตอร์ที่ป้อน n

ขอขอบคุณความช่วยเหลือใด ๆ เนื่องจากฉันติดขัดอย่างจริงจังในขณะนี้! ขอบคุณล่วงหน้า!


person Peter Lawrence    schedule 20.06.2017    source แหล่งที่มา


คำตอบ (1)


ดังนั้นเพื่อตอบคำถามของคุณโดยเฉพาะ (อินพุตของ n vectorized) ฉันจะทำดังต่อไปนี้:

% 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 = 5,000 แต่โชคดีที่ฉันพบว่าทำไม! นี่เป็นเพราะความจริงที่ว่าวิธีนี้ทำให้เกิดการบิดเบือนทางคณิตศาสตร์มากขึ้น ดังที่ในฟังก์ชัน In2 ฉันบังคับให้โค้ดคำนวณ -(betaa/alphaa).^(k+1)./(k+1) สำหรับทุก ๆ k และ ฉัน ในขณะที่เทอมนี้ขึ้นอยู่กับ 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

และ voila ฉันได้ผลลัพธ์เดียวกันใน 0.929530 วินาทีสำหรับ N=5,000 โดยสรุป คุณจะได้รับเวลาเล็กน้อยกับวิธีสุดท้ายนี้ แต่พูดตามตรงแล้ว ฉันจะบอกว่าคุณมีข้อเสียสองประการ:

  1. การคำนวณเวลาของ ivect และ kvect ที่จุดเริ่มต้น - แต่ฉันยืนยันว่าเวกเตอร์เหล่านี้สามารถสร้างได้ครั้งเดียวสำหรับทั้งหมด จัดเก็บและใช้สำหรับการจำลองหลายอย่าง -

  2. ต้นทุนหน่วยความจำ: ivect และ kvect มีขนาด n(n+1)/2 ซึ่งมากสำหรับ n ขนาดใหญ่

หวังว่ามันจะช่วยคุณได้ และอย่างไรก็ตาม ขอบคุณสำหรับคำถามที่น่าสนใจซึ่งอาจเป็นประโยชน์กับฉันในการค้นคว้าของฉันเอง!

person Toghe    schedule 21.06.2017