椭圆方程的MC解法
//加载函数库
#include<stdio.h>
//提供 [0,1]内的随机数的子函数
double random_U(){
.....
}
//格子大小设置
int Nx=50, Ny=50;
//判断当前(ix,iy)是否在边界上, 根据ix==0, ix==Nx, jy==0, jy==Ny
//返回1, 表示是边界;返回0,表示是内节点
int bd(int ix, int jy){
....
}
//根据边界上的ix,jy点,得到边界处的温度。
//左右边界,ix==0, or ix==Nx ;上下边界, jy==0, or jy==Ny
double T_boundary(int ix, int jy){
......
}
//随机游动子程序,i,j表示从哪点出发,nevent:统计试验次数
//返回统计计算得到的温度
double random_walk_T(int i, int j, int nevent){
double Tij=0; //统计
for(int k=0; k<nevent; k++){ //nevent 次试验
int ix = i, jy = j; //set initial point
while( 内节点判断条件 ){
double r = random_U();
//random move
if(r<0.25){
jy++; //move up
}else if(r<0.5){
...; //move down
}else if(r<0.75){
....; //move right
}else{
....; //move left
}
}
if( bd(ix,jy) ==1){
Tij += .....; //根据(ix,jy)计算边界处的温度,统计求和
}else{
printf("some wrong in while\n");
}
}
return Tij; //返回统计计算的结果
}
int main(){
FILE *fp = fopen("tem.dat","w");
for(int i=1; i<Nx; i++){
for(int j=1; j<Ny; j++){
double Tp=random_walk_T(i,j, 500);
fprintf(fp,"%3d %3d %f\n", i,j,Tp);
}
}
fclose(fp);
return 0;
}
迭代函数系统练习
//加载函数库
#include<stdio.h>
//提供 [0,1]内的随机数的子函数
double random_U(){
.....
}
int main() {
int N=10000; //迭代次数,即生成点的数目
double x=0, y=0, x1,y1; //迭代初值设定,与迭代变量声明
FILE *fp = fopen("xxx.dat","w");
fprintf(fp,"%f %f\n",x,y);
for(int i=0; i<N; i++){
double r = random_U();
if(r<...){ //if else 语句,确定迭代分支
x1 = ....;
y1 = ....;
}else if( r<.....) {
x1 = ....;
y1 = ....;
}else if (....){
}else{
x1 = ...*x + ...*y + 0.xxx;
y1 = ...*x + ...*y + 0.xxx;
}
fprintf(fp,"%f %f\n",x1,y1); //输出迭代得到的坐标
x = x1; //交换,准备好下一次迭代
y = y1;
}
fclose(fp);
return(0);
}