目录

  • 第一章
    • ● 绪论
    • ● 计算误差
  • 数值积分
    • ● 引言
    • ● 梯形积分和辛普森积分
    • ● 反常积分
    • ● 高斯积分
    • ● 高维积分和数值微分
  • 非线性方程的数值解法
    • ● 引言
    • ● 二分法
    • ● 迭代法
    • ● 牛顿迭代法
    • ● 弦截法
    • ● 最优化方法
  • 线性方程组的解法
    • ● 高斯消去法
    • ● 高斯主元素消去法
    • ● LU分解法
    • ● 迭代法
    • ● 三对角矩阵的解法
  • 常微分方程的数值解法
    • ● 引言
    • ● 欧拉法
    • ● 龙格库塔法
    • ● 阿达姆斯法
    • ● 二阶常微分方程的边值问题
  • 偏微分方程的数值解法
    • ● 引言
    • ● 对流方程
    • ● 抛物线方程
    • ● 椭圆方程
  • 插值
    • ● 引言
    • ● 多项式插值
    • ● 拉格朗日插值
    • ● 牛顿均差插值
    • ● 三次样条插值
  • 蒙特卡罗方法
    • ● 引言
    • ● 蒙特卡罗方法的基本思想
    • ● 大数法则和中心极限定理
    • ● 蒙卡方法的基本步骤
    • ● 随机变量和随机数
  • 上机练习1
    • ● 上机内容
    • ● 谐振子与厄米多项式简介
    • ● 阶乘计算
    • ● 代码框架
    • ● 计算结果绘图
  • 上机练习2
    • ● 势阱和单摆周期的计算
    • ● 代码框架
    • ● 计算结果绘图
  • 上机练习3
    • ● 带空气阻力的抛体运动
    • ● 代码框架
    • ● 计算结果绘图
  • 上机练习4
    • ● 解线性方程组
    • ● 代码框架
  • 上机练习5
    • ● 解常微分方程
    • ● 代码框架
    • ● 计算结果绘图
  • 上机练习6
    • ● 热传导和亥姆霍兹方程
    • ● 代码框架
    • ● 计算结果绘图
  • 上机练习7
    • ● 插值和离散傅里叶变换
    • ● 离散傅里叶变换简介
    • ● 代码框架
    • ● 计算结果绘图
  • 上机练习8
    • ● 椭圆方程的MC解法
    • ● 代码框架
    • ● 计算结果绘图
代码框架

椭圆方程的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);

}