当前位置:首页 » 编程语言 » 蒙特卡洛算法计算定积分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泰勒公式中的每一项拆成了分子,分母以及每一项前的符号这三项,以便于每一项的累加