目录

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

高斯消元法

   // print matrix

void mprint(double a[][4]){ 

    .....

}

   // 定义求解方程的子程序,注意 虚参:x[]是数组, a是增广矩阵(a,b) 

void gaussian_elimination(double x[], double a[][4]){

    .....

}

int main() {

    double a[3][4]={ {12, -3, 3, 15},{-18, 3, -1, -15}, {1, 1, 1, 6} };

    double x[3];

    // 调用子程序    

    gaussian_elimination(x,a);

    for( int i=0;i<n;i++){

        printf( "\n x[%d]= %f \n",i+1,x[i]);

    }

    return 0;

}

LU分解法


void LU_decomposition(double L[][n], double U[][n], double a[][n]){

....

}

int main() {

    double a[n][n]={ {12,-3,3},{-18,3,-1},{1,1,1} } ;

    double b[n]={15,-15,6};

    double L[n][n],U[n][n] ;

   // 调用LU子程序

   LU_decomposition(L,U,a);


    // out put L[][] and U[][]

   .....

    // back substitution of y[] by  Ly = b

    double x[n],y[n],  xm;

    y[0]=b[0];

    for(int i=1;i<n;i++) {

        xm=0;

        for(int j=0;j<=i-1;j++) { xm +=..... ;  }

        y[i] = .... ;

    }

    // back substitution of x[] by Ux= y

    x[n-1] = y[n-1] /U[n-1][n-1] ;

    for(int i=n-2;i>=0;i--) {

        xm =0;

        for(int j=i+1;j<n;j++) { xm += ... ; }

        x[i] = .... ;

    }

       // output solution x[]

   .....

    return 0;

}

三对角矩阵的追赶法

void tridiagonal_matrix_solve(double x[], const int n, double a[], double b[], double c[], double f[]){

   //动态分配内存

   double *d = (double*) malloc(n*sizeof(double) ); 

    double *e = (double*) malloc(n*sizeof(double) );

   //初始化e, d数组

  ....

......

}

//主程序调用

....