Erlang 並行梯度積分法

2021-07-01 18:58:43 字數 2685 閱讀 1921

這個**寫了兩天,從沒思路到有思路,還好最終搞定了~不過這個程序數必須為2^n個。

先貼乙個執行截圖:

%子程序求部分和

child_proces

(f,x1,width,0,sum,n1) ->

io:format("~p 's result is ~p~n",[self(),sum]),

loop_send_get(sum);

child_proces(f,x1,width,n,sum,n1) -> s=(f(x1)+f(x1+width))*width/2,

child_proces(f,x1+width,width,n-1,sum+s,n1).

%子程序部分和的傳送和接收,由主程序sendinfo方法控制

loop_send_get(sum) ->

receive

->

io:format("~p from ~p to ~p result is ~p ~n",[sum1,from,self(),sum1+sum]),

pidr!,

loop_send_get(sum+sum1);

->

pid!

end.

%控制每一輪迭代求和的次數,n為一輪迭代中求和的次數,初始值為0,divisor為控制變數,初始值為2

loop_control(father,n,cores,divisor) ->%io:format("n:~p divisor:~p~n",[n,divisor]),

ifcores =:= n*divisor->

father!,

loop_control(father,0,cores,divisor*2);

true

->

receive

-> loop_control(father,n+1,cores,divisor)

endend.

sendinfo(pidlist,n,cores,divisor,dsum) ->%io:format("pidlist:~p ~nn:~p cores:~p divisor:~p dsum:~p ~n",[pidlist,n,cores,divisor,dsum]),

nt = erlang:trunc(n),

ifdivisor =:= 2*dsum->

io:format("over~n");

nt > cores->

receive

->sendinfo(pidlist,1,cores-divisor/2,divisor*2,dsum)

end;

nt rem divisor =:= 1

->

sendinfo(pidlist,n+divisor/2,cores,divisor,dsum);

nt rem divisor =/= 1

->

pid_send = lists:nth(nt,pidlist),

pid_get = lists:nth(erlang:trunc(nt-divisor/2),pidlist),%io:format("send:~p get:~p~n",[pid_send,pid_get]),

pid_send!,

sendinfo(pidlist,n+divisor/2,cores,divisor,dsum)

end.

辛普森積分法

定義 辛普森法則 simpson s rule 是一種數值積分方法,是牛頓 寇次公式的特殊形式,以二次曲線逼近的方式取代矩形或梯形積分公式,以求得定積分的數值近似解。其近似值如下 注 辛普森法則是數值分析領域中乙個非常簡單好用的近似求解函式區間上的一種方法,概括起來,它是將區間端點和區間中點做對應的...

辛普森積分法小結

近來學了這個知識,似乎沒有想象中的那麼難。已知 f x 求定積分 int f x dx 容易從上面的推導過程發現,辛普森公式是以二次曲線逼近的方式取代矩形或梯形的積分公式。那麼如果要求 int f x dx 可以將 l,r 分成若干 l,r 但如果 r l 過大,精度就無法保證 而如果 r l 過小...

平行計算多執行緒積分法求pi

平行計算多執行緒積分法求pi 第一次寫部落格,有點小緊張。程式通過多執行緒積分方法求pi值 執行緒入口函式 void thread function void arg pthread mutex lock mut pi local pi pthread mutex unlock mut return...