Re: [問題] 請高手幫忙 如何加快計算速度已回收
你這個資訊真的很少 看的懂得人少 想幫的一定少之又少
如果你只是要做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
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章