\documentclass{article}
\usepackage{ctex} %是个中文库
\usepackage{graphicx}
\usepackage{float}
\usepackage{listings}
\begin{document}
\noindent
p23-EX3 \\
已知$a\le x\le b,c\le f(x)\le d$,求$\int_a^b f(x)\,dx$
\begin{figure}[H]
\centering %使图片居中显示
\includegraphics[width=1\textwidth]{1.jpg}
\caption{示意图}
\end{figure}
\noindent
如图1所示,我们将f(x)与x轴围成的面积分为两部分S1和S2。
S1显然可以通过概率算法进行计算,而S2=c(b-a),S1计算方法如下:\\
随机产生矩形[a,b]x[c,d]中的点(x,y),判断y是否$\le f(x)$,若是,则计数器加1,\\
那么最终计数器的值和产生的随机数总数之比乘以矩形面积就可以用来估计S1的面积。\\
这是相应的代码
\begin{lstlisting}[language={c++}]
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include <iomanip>
using namespace std;
typedef double(*funcptr)(double);
double func(double x){
if(x>1||x<-1){
cout<<"x is out of domain"<<endl;
return -1;}
else
return -1.0+sqrt(1-x*x);
}
double integral(funcptr func,double a,double b,double c,double d,int n){
int i=0;
int cnt=0;
double x;
double y;
srand((int)time(0));
while(i++<n){
x=a+(b-a)*rand()/(double)RAND_MAX;
y=c+(d-c)*rand()/(double)RAND_MAX;
if(y<=func(x))
cnt++;
}
return (double)cnt/n*(b-a)*(d-c)+(double)c*(b-a);
}
int main(){
cout<<fixed<<setprecision(12)<<integral(func,0,1,-1,0,100000000)<<endl;
cout<<(3.141592653589793238462623-4)/4<<endl;
return 0;
}
\end{lstlisting}
本次实验我们采用的函数为[0,1]上的$y=f(x)=\sqrt{1-x^2}-1$,容易知道,[a,b]=[0,1],[c,d]=[-1,0],下面是运行结果
\begin{figure}[H]
\centering %使图片居中显示
\includegraphics[width=1\textwidth]{3.png}
\caption{Result}
\end{figure}
\end{document}
转载请注明原文地址:https://blackberry.8miu.com/read-32105.html