當前位置:首頁 » 編程語言 » 蒙特卡洛演算法計算定積分c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

蒙特卡洛演算法計算定積分c語言

發布時間: 2022-06-14 05:29:56

c語言用蒙特卡洛方法求定積分 大佬幫忙看看哪裡不對

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
doublejifen(int,int,int,int);
intmain()
{
inta,b,d,n;
doublec;
srand((unsigned)time(NULL));
printf("請輸入ab ");
scanf("%d%d",&a,&b);
printf("請輸入n ");
scanf("%d",&n);
d=1+b*b;
c=jifen(a,b,d,n);
printf("積分為%lf ",c);
return0;
}
doublejifen(inta,intb,intd,intn)
{
inti,m=0;
doublex,y,result;
for(i=1;i<=n;i++){
x=(double)rand()/(double)(RAND_MAX)*(b-a)+a;
y=(double)rand()/(double)(RAND_MAX)*d;
if(y<=1+x*x)m++;
}
result=(double)m*(b-a)*d/n;
returnresult;
};

如上 使用double 在最後加入result的強制轉換

另外在x定義那裡,改為(rand/rand_max)*(b-a)+a

因為是a,b 之間的距離隨機加a,當a不為0時原來的式子是錯的。

② C語言求函數定積分

問題就是出在數據類型上的選用上,precision=0.0000001時已經超過了float的數據范圍,所以導致數據截斷後precision=0.000000,從而程序在計算積分時可能陷入死循環,應該採用double型數據類型。其實不推薦樓主用如此多的define語句,程序的可讀性和風格應該重於編程員的勞動度。。。
還有樓主對自然對數e的define也已經超過了計算機的可識別范圍。。您那樣精確的定義e並不會在結果上獲得更加精確地結果,其實反倒會起到相反的作用,要知道與其用一個這樣可能導致內存出錯以及必定會導致數據截斷的變數來實現精度的提高遠遠不如採用一個更精確的積分演算法,而且c語言提供了自然數e為底的指數函數~而且貌似您的積分演算法是不準確的,梯形積分的定義並非如此,其再兩端的函數值應該只取1/2.希望您多加細心~
如果不介意的話,就是你的precision應該改為step~這樣會能更加准備的表達了這個變數的作用,在你的程序中precision變數其實是積分步長~在數值計算方法中積分精度的控制往往不是通過細化步長來表達,而是通過後一個積分值-前一個積分值<precision 這樣來實現精度控制~呵呵

③ c語言中用蒙特卡洛法求積分輸出info00

#include "stdio.h"
#include "time.h"
#include "math.h"
#include "dos.h"

#define PI 3.1415926

main()
{ double x,y,sum=0;
int i;

for(i=0;i<=100;i++)
{ srand(time(0));
x=rand()%10000;
x=x/10000*PI/2;
sleep(1);
srand(time(0));
y=rand()%10000;
y=y/10000;
if(y<=sin(x)) sum++;
clrscr();
printf("%d%",i);
}
clrscr();
printf("%f ",sum/--i);
}
TC上沒問題 VC上有點問題~~~~

④ matlab 蒙特卡洛演算法求定積分

在 f = cos(theta)這句命令後面加上一個條件,即

f = cos(theta)<pi/2;


復制去Google翻譯翻譯結果

⑤ 求大神指導,是蒙特卡羅求解定積分

蒙特卡洛(Monte Carlo)法是一類隨機演算法的統稱。隨著二十世紀電子計算機的出現,蒙特卡洛法已經在諸多領域展現出了超強的能力。在機器學習和自然語言處理技術中,常常被用到的MCMC也是由此發展而來。本文通過蒙特卡洛法最為常見的一種應用——求解定積分,來演示這類演算法的核心思想。

⑥ 對sin函數求"不定積分",用C語言如何實現

1.
c語言中要編寫sin函數,實質上要利用sin的泰勒公式,然後根據泰勒公式,將其中的每一項進行分解,最後用循環,累加計算出最終結果
2.
下面用for循環實現sin的演算法,程序代碼如下:
#include
#include
void
main()
{
int
i;
float
x,sum,a,b;
//sum代表和,a為分子,b為分母
char
s;
printf("please
input
x");
scanf("%f",&x);
s=1;
sum=0;
a=x;

//分母賦初值
b=1;

//分子賦初值
for(i=1;a/b>=1e-6;i++)
{

sum=sum+s*a/b;

//累加一項

a=a*x*x;

//求下一項分子

b=b*2*i*(2*i+1);

//求下一項分母

s*=-1;
}

printf("sum=%f\n",sum);
}

3.
關於上述程序的幾點說明:上述程序的計算結果精確到小數點後六位;上述程序運用了sin的泰勒展開式
sin
x=x-x^3/3!+x^5/5!
......
,程序中將sin泰勒公式中的每一項拆成了分子,分母以及每一項前的符號這三項,以便於每一項的累加