所以我现在正在看这个网页 - 它是一个化学/数学问题,它为您提供速率与温度的数据以计算物质的活化能 - 数据在页面上和代码中
http://faculty.weber.edu/ewalker/Chem2990/Chem3020/WebPages/1_11.htm
其中给出了 T 和 k(rate) 的值
正如它所说,您可以绘制 1/T 与 ln(k) 来计算 Ea(活化能)和 A(预实验因子)
但不要这样做,而是制作一个迭代 chi^2 计算的程序来评估最低的计算 - 这将与激活能相关联
可怕的是:// k = A * exp(-Ea/(RT))
chi^2 = ((观察到 - 预期)^2)/预期
其中,observed 是网页上给出的 k 值,expected 是使用估计值 Ea 时所做的估计值 - 从 100 开始
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <string>
#include <fstream>
#include <sstream>
#include <iomanip>
using namespace std;
int main()
{
long double chi1;
long double chi2;
long double T[8] = { 400,430,460,490,510,540,610,7000, };
long double k[8] = { 0.011,0.035,0.105,0.343,0.789,2.17,20.0,145, };
long double kJ;
long double R = 8.31446;
long double ki[8];
long double OE[8];
long double dEa = 10000;
int i = 0;
int dp = 5;
// k = A * exp(-Ea/(RT))
long double Ea = 100000;
long double A = 1.100e+12;
// I’m keeping A constant at 1.1*10^12
// Then calculating Chi Squared from a starting Ea value of 100000
// k = A * exp(-Ea/(RT))
do {
do {
chi1 = 0; chi2 = 0;
i = 0;
while (i < 8) {
ki[i] = A*exp(-E / (R*T[i]));
OE[i] = pow(k[i] - ki[i], 2);
chi1 = chi1 + (OE[i]);
i++;
}
i = 0;
while (i < 8)
{
ki[i] = A*exp(-(E + dE) / (R*T[i]));
OE[i] = pow(k[i] - ki[i], 2);
chi2 = chi2 + (OE[i]);
i++;
}
if (chi1 > chi2) {
E = E + dE;
}
} while (chi2 < chi1);
do {
chi1 = 0; chi2 = 0;
i = 0;
while (i < 8)
{
ki[i] = A*exp(-E / (R*T[i]));
OE[i] = pow(k[i] - ki[i], 2);
chi1 = chi1 + (OE[i]);
i++;
}
i = 0;
while (i < 8)
{
ki[i] = A*exp(-(E - dE) / (R*T[i]));
OE[i] = pow(k[i] - ki[i], 2);
chi2 = chi2 + (OE[i]);
i++;
}
if (chi1 > chi2) {
E = E - dE;
}
} while (chi2 < chi1);
dE = dE / 10;
} while (dE > pow(10, 2 - dp));
kJ = E / 1000;
cout << dE << endl;
cout << “Ea = " << fixed << setprecision(dp) << kJ << "kJ" << endl;
cout << “Chi squared = " << chi1 << endl;
return 0;
}
基本上我对 chi^2 和 Ea 的价值与我的 excel 结果不匹配
- 有任何想法吗?