这学期的计算化学就快结束了,周三考试。从第一周开始上课,上到第七周,第八周考试。第一周两次理论课,一次上两节。之后的五周里,每周两次理论课,一次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)来存放各微分方程表达式