目录

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

1. 普通定积分

double f(double x){   //定义被积函数  }

//定义有限n下的的梯形积分,或者辛普森积分

double trap(int n, double a, double b ){      }

//采用变步长技术

double trap_adaptive(double a, double b, double err){

    double s1,s2;

    double n=4;     //initial bin number

    s2 = trap(n,a,b);

    do{            //此处采用do  while语句

        s1=s2;

        n *= 2;

        s2 = trap(n,a,b);

    }while(fabs(s2-s1)>err);

    //return s2;

    return (4*s2-s1)/3;   //combination to improve precision further

}

//主函数调用计算....

2.极限法求解钟摆运动周期

将反常积分归结为:一系列普通定积分的求和。在上述基础代码上,增加对积分范围的选择和对子积分的求和。

以钟摆周期计算题为例子,将积分[0,θ_0]分为:[0,b1], [b1,b2], [b2,b3],.....

其中b_n = θ_0(1-1/2^n)

这部分的核心代码:

double T(double err){

    double s=0,s1,s2;

    double xl=0, xh=theta0/2, dt=0.5;

   s2 = simpson_adaptive(xl, xh, err/10);

    s += s2;

    do{

        s1 = s2;

        xl = xh;

        dt /=2;

        xh = theta0*(1-dt);

        s2 = simpson_adaptive(xl, xh, err/10);

        s += s2;

    }while(fabs(s2-s1)>err);

       return s;

}

习题3中,改变初始角度,计算并输出结果

#include<stdio.h>

#include<math.h>

const double pi=3.14159265358979323846;

double theta0=pi/2;     //在最开始,定义全局变量

......

//在主函数中,改变初始角度,计算并输出结果,用以画图。

int main() {

    double t, err=1e-6;

    FILE *fp = fopen("T.dat","w");

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

        theta0 = pi*pow(2,-i);

        t=T(err);

        fprintf(fp,"%f  %f\n", theta0, t);

    }

    fclose(fp);

    return 0;

}