算法积分0042算法笔记——【随机化算法】计算π值和计算定积分
最近研究算法積分,稍微總結一下,以后繼續補充:
? ? ?1、盤算π值
????? ? 問題描述
????? ? 設有一半徑為r的圓及其外切四邊形。向該正方形隨機地投擲n個點。設落入圓內的點數為k。由于所投入的點在正方形上平均分布,因而所投入的點落入圓內的概率為 ? ? ? ? ? 。所以當n足夠大時,k與n之比就逼近這一概率。從而。
????
????? ? 程序詳細代碼如下:
????
//隨機化算法 用隨機投點法盤算π值 #include "stdafx.h" #include "RandomNumber.h" #include <iostream> using namespace std;double Darts(int n);int main() {int n1 = 100,n2 = 1000,n3 = 1000,n4 = 10000,n5 = 10000000;cout<<"n1="<<n1<<",π1="<<Darts(n1)<<endl;cout<<"n2="<<n2<<",π2="<<Darts(n2)<<endl;cout<<"n3="<<n3<<",π3="<<Darts(n3)<<endl;cout<<"n4="<<n4<<",π4="<<Darts(n4)<<endl;cout<<"n5="<<n5<<",π5="<<Darts(n5)<<endl;return 0; }//用隨機投點法盤算π值 double Darts(int n) {static RandomNumber dart;int k = 0;for(int i=1; i<=n; i++){double x = dart.fRandom();double y = dart.fRandom();if((x*x + y*y)<=1){k++;}}return 4*k/double(n); }? ? ?程序運行結果如圖:
????
? ? 2、盤算定積分
????? ??例:設f(x)=x^2,求
????? ? 解:
????? ? 1)隨機投點法盤算定積分
????? ? ?基本思想是在矩形區域上隨機平均的投點實現。本算法的基本思想是在積分區間上隨機平均的產生點, 即在[a,b]上隨機平均的取點, 求出由這些點產生的函數值的算術平均值, 再乘以區間寬度, 便可解出定積分得近似解。
????
????? ? 算法詳細代碼如下:
????
每日一道理如果只看到太陽的黑點,那你的生活將缺少溫暖;如果你只看到月亮的陰影,那么你的生命歷程將難以找到光明;如果你總是發現朋友的缺點,你么你的人生旅程將難以找到知音;同樣,如果你總希望自己完美無缺,假設你的這一愿望真的能如愿以償,那么你最大的缺點就是沒有缺點。
//隨機化算法 用隨機投點法盤算定積分 #include "stdafx.h" #include "RandomNumber.h" #include <iostream> using namespace std;double Darts(int n,double a,double b); double f(double x);int main() {int n1 = 100,n2 = 1000,n3 = 1000,n4 = 10000,n5 = 10000000;double a = 2.0,b = 3.0;cout<<"n1="<<n1<<",r1="<<Darts(n1,a,b)<<endl;cout<<"n2="<<n2<<",r2="<<Darts(n2,a,b)<<endl;cout<<"n3="<<n3<<",r3="<<Darts(n3,a,b)<<endl;cout<<"n4="<<n4<<",r4="<<Darts(n4,a,b)<<endl;cout<<"n5="<<n5<<",r5="<<Darts(n5,a,b)<<endl;return 0; }/** 基本思想是在矩形區域內隨機平均投點,求出由這些點* 產生的函數值的算術平均值,再乘以區間寬度,便可得* 出定積分的近似解*/ double Darts(int n,double a,double b) {static RandomNumber dart;double sum = 0.0;for(int i=0; i<n; i++){double x = (b-a)*dart.fRandom() + a;//產生[a,b)之間的隨機數sum = sum + f(x);}return (b-a)*sum/n; }double f(double x) {return x*x; }
? ? 程序運行結果如圖:
????
? ??2)概率法法盤算定積分
????? ??設f:[a,b]→[c,d]連續函數(如圖2 所示), 則由曲線y=f(x)以及x 軸和直線x=a,x=b 圍成的面積由定積分給出。根據幾何概型可知。假設向矩形區域隨機平均的投鏢n 次, 落入陰影為K次, 又設M為x=a、x=b、y=c、y=d 所圍成的矩形面積, s 為定積分面積,則, 所以s= k/n×M。
????
????? ? 算法詳細代碼 如下:
????
//隨機化算法 用概率法盤算定積分 #include "stdafx.h" #include "RandomNumber.h" #include <iostream> using namespace std;double Darts(int n,double a,double b,double d); double f(double x);int main() {int n1 = 100,n2 = 1000,n3 = 1000,n4 = 10000,n5 = 10000000;double a = 2.0,b = 3.0;double d = f(b);cout<<"n1="<<n1<<",r1="<<Darts(n1,a,b,d)<<endl;cout<<"n2="<<n2<<",r2="<<Darts(n2,a,b,d)<<endl;cout<<"n3="<<n3<<",r3="<<Darts(n3,a,b,d)<<endl;cout<<"n4="<<n4<<",r4="<<Darts(n4,a,b,d)<<endl;cout<<"n5="<<n5<<",r5="<<Darts(n5,a,b,d)<<endl;return 0; }/** f 為積分函數, n 為投鏢* 總數, a,b 為積分區間, c,d 為函* 數f 的值域的端點值*/ double Darts(int n,double a,double b,double d) {static RandomNumber dart;int k = 0;for(int i=0; i<n; i++){double x = (b-a)*dart.fRandom() + a;//產生[a,b)之間的隨機數double y = d * dart.fRandom();if(y<=f(x)){k++;}}return d*(b-a)*k/n; }double f(double x) {return x*x; }? ? 程序運行結果如圖:
????
??
文章結束給大家分享下程序員的一些笑話語錄: 火車
一個年輕的程序員和一個項目經理登上了一列在山里行駛的火車,他們發現 列車上幾乎都坐滿了,只有兩個在一起的空位,這個空位的對面是一個老奶 奶和一個年輕漂亮的姑娘。兩個上前坐了下來。程序員和那個姑娘他們比較 曖昧地相互看對方。這時,火車進入山洞,車廂里一片漆黑。此時,只聽見 一個親嘴的聲音,隨后就聽到一個響亮的巴掌聲。很快火車出了山洞,他們 四個人都不說話。
那個老奶奶在喃喃道, “這個年輕小伙怎么這么無禮, 不過我很高興我的孫女 扇了一個巴掌”。
項目經理在想,“沒想到這個程序員居然這么大膽,敢去親那姑娘,只可惜那 姑娘打錯了人,居然給打了我。”
漂亮的姑娘想,“他親了我真好,希望我的祖母沒有打疼他”。
程序員坐在那里露出了笑容, “生活真好啊。 這一輩子能有幾次機會可以在親 一個美女的同時打項目經理一巴掌啊”
--------------------------------- 原創文章 By
算法和積分
---------------------------------
總結
以上是生活随笔為你收集整理的算法积分0042算法笔记——【随机化算法】计算π值和计算定积分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Latent Semantic Anal
- 下一篇: 你真的了解图像传感器尺寸么