Computational Chemistry for undergraduate

这学期的计算化学就快结束了,周三考试。从第一周开始上课,上到第七周,第八周考试。第一周两次理论课,一次上两节。之后的五周里,每周两次理论课,一次3小时的上机课。第七周没有理论课,只有两次上机课。总的来看这个阶段的计算化学主要集中在数值计算上面,方程组求解、线性回归、数值积分等,使用的编程语言为Fortran,编译环境为Fortran PowerStation 4.0。最终的要求就是会调用子程序解决化学中的一些问题即可,子程序的原理只需了解不用掌握。

代数方程及代数方程组求解

一元N次非线性方程组求解

一元非线性方程的求解方法分为直接法和间接法。直接法是用一组公式得到解,如二分法、插值法等。间接法是重复使用某种算法求解,得到的解是近视的,但可以达到任意要求的精度,常见的有一般的迭代法及牛顿迭代法等。

二分法

  • 基本思想:通过找中点不断缩小根区间的范围
  • 优点:简单、可靠
  • 缺点:收敛速度慢
  • 适用范围:连续函数、有明确的表达式、根区间已知
  • 应用实例:平衡转化率、分子轨道的能量
  • 源程序:HALF(A,B,EPS,F,X)

    • A:区间左端点
    • B:区间右端点
    • EPS:根的精度要求
    • F:函数子程序名,用于计算f(x)
    • X:所求根的值
    • 结果输出:直接调用X即可

Newton-Raphson法

  • 基本思想:通过泰勒级数将非线性方程式转化成线性方程,然后用迭代法求解
  • 优点:收敛速度快
  • 缺点:收敛条件高,如果初值选择不当,可能发散
  • 适用范围:函数的一阶导数有明确的表达式且容易计算,根初值容易确定
  • 应用实例:弱酸弱碱的pH
  • 源程序:NEWN(X0,EPS,F,G,X)

    • X0:迭代初值
    • EPS:根的精度要求
    • F:函数子程序名,用于计算f(x)
    • G:函数子程序名,用于计算f(x)的导数
    • X:所求的根的值
    • 结果输出:直接调用X即可

解线性方程组的方法

线性代数方程组的解法,按照求解方式分为直接法和迭代法。

选主元的高斯消去法

  • 基本思想:选取主元 -> 消元 -> 回代
  • 优点:精度高
  • 缺点:求解速度慢
  • 适用范围:一般的线性方程组
  • 应用实例:质谱中峰高与各组分百分含量关系
  • 源程序:GS(A,N,N,EPS)

    • A:数组A(N,M),存放线性方程组增广矩阵的系数
    • N:线性方程组的维数
    • M:M=N+1
    • EPS:选主元的精度
    • 结果输出:第i个解为A(I,M)

高斯-赛德尔迭代法

  • 基本思想:将方程组写成迭代形式,由给定的一组初值,代入迭代方程组,通过多次迭代来得到一个可逼近方程组真实解的近视解
  • 优点:计算简单、编制程序容易、速度快
  • 缺点:对方程组的系数矩阵要求较高,精度相对低
  • 应用实例:利用分光光度法确定多组分溶液中各组分的浓度
  • 源程序:GSD(A,B,N,X,EPS,MAXIT)

    • A:数组A(N,N),存放线性方程组系数矩阵
    • B:数组B(N),存放线性方程组右端系数
    • N:线性方程组的维数
    • X:数组X(N),存放线性方程组的根
    • EPS:计算精度
    • 结果输出:第i个解为X(I)

实验数据的处理及模型参数的确定

插值法

  • 插值法对应函数关系

线性插值

  • 两点直线插值
  • 应用实例:根据不同入射波长下的吸光度求未知入射波长下的吸光度
  • 源程序:LINEPLOT(N,X,Y,X0,Y0)

    • N:插值节点的个数
    • X(N):n个插值节点的x值
    • Y(N):对应X(N)插值节点的函数值
    • X0:插值点
    • Y0:插值结果
    • 结果输出:X0、Y0

拉格朗日插值多项式

一元拉格朗日插值

  • 抛物线插值
  • 源程序:LGRG2(X,Y,N,T,Z)

    • N:插值点的个数
    • X(N):n个插值节点的x值
    • Y(N):对应X(N)插值节点的函数值
    • T:插值点
    • Z:插值结果
    • 结果输出:插值点T、插值结果Z

二元三点拉格朗日插值

回归分析和线性拟合

  • 回归分析对应相关关系

一元线性回归分析

  • 基本原理:最小二乘法、残差平方和最小、|R|越接近1越好
  • 应用实例:根据反应速率常数与温度的关系求表观反应活化能、温度与饱和蒸汽压的关系
  • 源程序:PK(N,X,Y,A,B,R)

    • N:数据的个数
    • X:N个元素的一维数组,自变量的观测值
    • Y:N个元素的一维数组,因变量的观测值
    • A:回归直线的截距
    • B:回归直线的斜率
    • R:相关系数
    • 结果输出:截距A、斜率B、相关系数R

多元线性回归

  • 应用实例:固体催化剂表面气相反应的反应方程式拟合
  • 源程序:MLR(M,N,XV,S,B0,R)

    • M:自变量的个数
    • N:数据测量次数
    • XV(M+1):存放列平均值,M+1列为Y平均值
    • S(M+1):存放列标准偏差,M+1列为Y标准偏差
    • B0:回归系数b0
    • R:相关系数
    • 结果输出:回归系数B0、相关系数R、Bi = A(I,M+1)

多项式拟合

数值微分

  • 基本思想:中心差商求导
  • 应用实例:根据浓度随反应时间的变化求反应级数和速率方程
  • 源程序:CF(N,H,X,Y,Z)

    • N:数据点的个数
    • X(N):一维数组,存放变量的数据点值
    • Y(N):一维数组,存放函数的数据点值
    • H:步长,通常是10^-2 ~ 10^-5
    • Z(N):一维数组,所求导数值
    • 结果输出:导数值Z(N)
    • 使用方法:仍需调用拉格朗日插值法

数值积分与常微分方程的数值解法

数值积分

梯形法

  • 基本思想:求曲边梯形面积
  • 应用范围:基本不用

辛普森法

  • 基本思想:利用二次抛物线来近似被积函数
  • 优点:精度高
  • 应用实例:已知f(T)求摩尔热容
  • 源程序:SIMP(A,B,EPS,S2,F)

    • A:积分区间下限
    • B:积分区间上限
    • EPS:计算精度
    • S2:积分结果
    • F:被积函数
    • 结果输出:积分结果S2

离散点数据的求积

  • 基本思想:调用拉格朗日插值法求出任意点的函数值,再利用辛普森法求积
  • 应用实例:已知恒压摩尔热容与温度求熵变
  • 源程序:SIMP(M,A,B,X,Y,EPS,S2)

    • M:数据点的个数
    • A:积分区间下限
    • B:积分区间上限
    • X:自变量
    • Y:积分表达式
    • EPS:计算精度
    • S2:积分结果
    • 结果输出:积分结果S2

常微分方程的数值解法

欧拉法

  • 基本思想:折线法
  • 适用范围:实践中很少用,常用来作为讨论其他方法的基础

Rugge-Kutta法

  • 基本思想:基于欧拉法,对平均斜率提供一种新的算法,常用变步长四阶Rugge-Kutta法
  • 适用范围:物质浓度随时间变化关系求解
  • 源程序:RK41(X0,Y0,Y,H,N,M)

    • X0、Y0:初值
    • Y:方程的解
    • H:步长
    • N:未知量个数
    • M:节点的个数
    • 结果输出:第i个未知量为Y(I)
    • 使用方法:添加子函数F(Y,DY)来存放各微分方程表达式