Re: [問題] 請高手幫忙 如何加快計算速度已回收

看板MATLAB作者 (我...)時間17年前 (2009/01/17 09:39), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
你這個資訊真的很少 看的懂得人少 想幫的一定少之又少 如果你只是要做f(x)的積分 在不限定方法中 那建議用蒙地卡羅 應該是比你寫的這三個 可以更快速有效 如果你限定用中點法或是任何一種數值積分法 那建議你把for拿掉 三層的for 在C是很簡單的啪啪兩下就跑完 在matlab 是慢 慢 慢 尤其你Nx Ny Ny又放大之後 鐵定爆記憶體 蒙地卡羅簡易作法 1. 先把 X , Y ,Z 的範圍固定住 2. 在這個X Y Z長方體中 去灑亂數 N個 3. 把(x,y,z)每一點的亂數值跟f(x,y,z)做比較 4. 記數比f(x,y,z)小的亂數有多少個假設M 5. 所以積分起來就是(N/M)*長方體的體積 如果要準確度越高 N就要相對的大 ※ 引述《Bummer (bassline)》之銘言: : 首先 我有一個f(x) 很長很長 : 我必須對他做很多次積分 : 一開始我使用中點法 就是直接代入值 : A = zeros(Nx,Ny,Ny); : for m=1:Nx : for n=1:Ny : for k=1:Ny : x 由 k 決定 : A(m,n,k) = f(x)*dx : end : end : end : 速度很快 但精確度不高 : 後來想改用高斯積分法 : A = zeros(Nx,Ny,Ny) : for m=1:Nx : for n=1:Ny : for k=1:Ny : x = [0.9062 0.5385 0 -0.5385 -0.9062]'; : const = [0.2369 0.4786 0.5689 0.4786 0.2369]'; : A(m,n,k) = sum(f(x).*const) : end : end : end : 花費時間大約是第一種方法的40倍 : 接著又改善方法 : A = zeros(Nx,Ny,Ny) : for m=1:Nx : for n=1:Ny : for k=1:Ny : A(m,n,k) = f(0.9062)*0.2369 + f(0.5385)*0.4786 + ... : end : end : end : 時間是又進步了 : 不過總離理想的五倍時間差距還很多 : 請問有高手看出我哪一步可以在多改善嗎 : 謝謝看完這篇繁複的文章 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.63.252

01/17 10:18, , 1F
謝謝
01/17 10:18, 1F
文章代碼(AID): #19SJRjuf (MATLAB)
文章代碼(AID): #19SJRjuf (MATLAB)