I've learned that according to Condensed phase thermochemistry data, according to NIST, the functions of heat capacity, enthalpy, and entropy can be predicted by the Shomate Equation: $$\begin{align} t &= \text{Temperature } (K) / 1000\\ C_\mathrm{p} &= A + B\cdot t + C \cdot t^2 + D \cdot t^3 + E / t^2\\ \Delta \text{Enthalpy} = \int C_\mathrm{p}\mathrm{d}t &= A\cdot t + B\cdot t^2 /2 + C\cdot t^3 /3 + D\cdot t^4 /4 − \frac Et + F − H\\ \text{Standard Entropy} &= \int \frac{C_\mathrm{p}}{t}\mathrm{d}t\\ S^\circ &= A \cdot \ln(t) + B\cdot t + \frac C2 \cdot t^2 + \frac D3 \cdot t^3 − \frac E{2 \cdot t^2} + G \end{align}$$
You can see parameters A - H from the NIST webbook in condensed phase data for iron, for example, here.
I've plotted the enthalpy, entropy, and heat capacities as a function of temperature for $\ce{NaCl}$, $\ce{MgCl2}$, $\ce{H2O}$, $\ce{Fe}$, $\ce{Li}$, and $\ce{Cu}$ using their special coefficients A - H for each material. I did this over the range of temperatures 298 Kelvin to 450 Kelvin.
Ranking the heat capacities over the range of temperatures studied:
copper < iron < lithium < sodium chloride < magnesium chloride < water.
Since molar heat capacity is the heat required to raise one mole of a substance by 1 degree celsius, it seems that water which is a liquid has more places to put the heat plus hydrogen bonding so it has the highest heat capacity. The ionic compounds $\ce{NaCl}$ and $\ce{MgCl2}$ have greater heat capacities than the metals these are compounds with ion-ion interaction in a crystal lattice which gives more places to put the heat and thus comparatively a significantly higher heat capacity. The heat capacity of $\ce{MgCl2}$ appears to be much greater than $\ce{NaCl}$ because $\ce{MgCl2}$ is divalent so the charge-charge interaction in the crystal lattice is greater, raising the heat capacity.
The heat capacities of the metals lithium, iron, and copper are very close. I don't get why copper has a lower heat capacity than the other metals since copper has more electrons so there should be more energy levels to put the heat I would think. Quite simply I don't understand the behavior of the metals, especially if the Shomate parameters A - H are experimentally determined how can I match this to my intuition?
The trends of enthalpies generally seem to follow the heat capacities as a function of temperature. It's kind of interesting that the entropy of $\ce{MgCl2}$ is significantly greater than $\ce{H2O}$, but that there's some cross-over with $\ce{H2O}$ and $\ce{NaCl}$ in standard entropies as function of temperature.
How should I interpret all this, particularly the metals?
Respectively how I calculated all this was kind of tedious, but performed in R:
library(ggplot2)
# Data for Nickel:
# http://webbook.nist.gov/cgi/inchi?ID=C7440020&Type=JANAFS&Table=on#JANAFS
# Data for Copper
# http://webbook.nist.gov/cgi/inchi?ID=C7440508&Type=JANAFS&Plot=on
# etc ...
# Materials used: Copper, H2O, Iron, Lithium, MgCl2, NaCl
# Schomate Equation:
# C_p = A + B*t + C*t^2 + D*t^3 + [E / (t^2)] + H_298-Kelvin_standard
# Enthalpy: H = A * t + (B / 2)(t^2) + (C / 3)(t^3) + (D / 4)(t^4) - (E / t) + F - H
# Entropy: S = A * ln(t) + B*t + (C / 2)(t^2) + (D / 3)(t^3) - [E / (2 * t^2)] + G
# Open the file of Schomate Parameters for solids
FILE = read.csv(file = "Schomate_Parameters.csv", header = TRUE, sep = ",")
# Split up the file into lists of each material.
Each_Material = split(FILE, FILE$Material)
# Solution_df is the dataframe that has the Temperatures, Heat Capacities, Enthalpies, Entropies, and Free_Energies.
# Basically everything I need to make some stellar graphs and point-wise interpretation.
# It takes some effort to construct. We will start assuming 5 columns.
Solution_df <- data.frame(matrix(nrow = 0, ncol = 5))
# These are the initial Five Columns that I will calculate.
my_column_names <- c("Material", "Temperature", "Enthalpy", "Entropy", "Heat_Capacity")
# And I assign these as column names.
colnames(Solution_df) <- my_column_names
###### THIS IS A MAJOR MULTI-FUNCITON #############
################# CAREFUL #########################
for(my_index in 1:length(Each_Material)) # Iterating over every material: Copper, NaCl, Iron, etc ...
{
Material_type = names(Each_Material[my_index]) # Find the current materials name.
This_Material = as.data.frame(Each_Material[my_index]); # Deal with it as a dataframe.
# Assign variables A through H as the schomate parameters
# which, by the way, change for each new material in this for-loop.
A = This_Material[1, 3]
B = This_Material[2, 3]
C = This_Material[3, 3]
D = This_Material[4, 3]
E = This_Material[5, 3]
F = This_Material[6, 3]
G = This_Material[7, 3]
H = This_Material[8, 3]
# The temperature ranges from 298 kelvin to 400 kelvin in increments of 0.1 kelvin.
Temperatures = seq(from = 298, to = 450, by = 1)
# For some reason, the parameters provided by NIST request calculations in terms of kilo-kelvin.
Temperatures = Temperatures / 1000
# This is the heat_capacity function for any material
Schomate_Heat_Capacity <- function(t)
{
A + B*t + C*(t)^2 + D * (t)^3 + (E / (t)^2)
}
# Then I create a list of the heat capacities at each temperature.
Heat_Capacities = Schomate_Heat_Capacity(Temperatures)
# The Enthalpy function as a function of temperature
Schomate_Enthalpy <- function(t)
{
A*t + (B / 2)*(t)^2 + (C / 3)*(t)^3 + (D / 4)*(t)^4 - (E / t) + F - H
}
# Then I create the enthalpies
Enthalpies = Schomate_Enthalpy(Temperatures)
# The Schomate Entropy function as a function of Temperature.
Schomate_Entropy <- function(t)
{
A * log(t) + B*t + (C / 2) * (t)^2 + (D / 3)*(t)^3 - (E / (2 * (t)^2)) + G
}
# THen I compute the entropies at each temperature.
Entropies = Schomate_Entropy(Temperatures)
# The name of each material must occur as many times as the temperature for the columns to be the same number of rows.
Material_type_repeated <- rep(Material_type, length(Temperatures))
# Create a temporary dataframe for every material holding the Material type, Temperature, Enthalpies, Entropies, and Heat Capacities.
Temporary_df <- data.frame(Material_type_repeated, Temperatures, Enthalpies, Entropies, Heat_Capacities)
# Make sure the names match up to the solution dataframe
colnames(Temporary_df) <- my_column_names
# And then bind all of these temporary dataframes to the solution dataframe.
Solution_df <- rbind(Solution_df, Temporary_df)
}
########### END OF major multi-function ##############
######################################################
# Post Processing:
# Calculations depended that Temperature be in kilo-kelvin
# But it should be represented in Kelvin now.
Solution_df$Temperature = Solution_df$Temperature * 1000
# Note: Enthalpy is in kJ / (mole)
# Entropy is in J / (mole * K)
# Temperatures is now in Kelvin.
# So Free_Energy = Enthalpy - Temperatures * Entropy
# = (___ kJ / mole) - (__ Kelvin) * (J / (mole * Kelvin)) * (1 kJ / 1000 J)
# So Free Energy = Enthalpy - Temperature * Entropy * (1 / 1000)
# Therefore Free Energy is in kJ / mole
# Let's calculate the Free Energy Now:
Solution_df$Free_Energy = Solution_df$Enthalpy - Solution_df$Temperature * Solution_df$Entropy * (1 / 1000)
# Remove Nickel because ggplot can show no more than 6 categories.
Solution_df <- Solution_df[Solution_df$Material != "Nickel",]
################################################ END OF POST-PROCESSING ##################################
##########################################################################################################
# Creating Graphs: all as a function of temperature.
# The heat capacity plot:
HC_plot <- ggplot(data = Solution_df, aes(x = Temperature, y = Heat_Capacity, col = Material, shape = Material)) + theme_bw() + geom_point(size = 1)
HC_plot <- HC_plot + scale_x_continuous(breaks = scales::pretty_breaks(n = 30)) + scale_y_continuous(breaks = scales::pretty_breaks(n=30))
HC_plot <- HC_plot + labs(x = "Temperature (Kelvin)", y = "Heat Capacity (Joules per mole per Kelvin)", title = "Heat Capacity of Various Materials\nAs a function of Temperature from Schomate Equation!")
ggsave(plot = HC_plot, filename = "Heat_Capacity_by_Temp_Schomate_Plot.png", width = 10, height = 10)
print(HC_plot)
###### Creating Enthalpy as a function of Temperature Plot
Enthalpy_Plot <- ggplot(data = Solution_df, aes(x = Temperature, y = Enthalpy, shape = Material, col = Material)) + theme_bw() + geom_point(size = 1)
Enthalpy_Plot <- Enthalpy_Plot + scale_x_continuous(breaks = scales::pretty_breaks(n = 30)) + scale_y_continuous(breaks = scales::pretty_breaks(n = 30))
Enthalpy_Plot <- Enthalpy_Plot + labs(x = "Temperature (Kelvin)", y = "Delta Enthalpy (kJ / mole)", title = "Enthalpy as a function of Temperature\nFor various Materials as Predicted by Schomate Equation")
ggsave(plot = Enthalpy_Plot, filename = "Enthalpy_vs_Temperature_Schomate_Plot.png", width = 10, height = 10)
print(Enthalpy_Plot)
################ Creating Entropy as a function of Temperature Plots:
Entropy_Plot <- ggplot(data = Solution_df, aes(x = Temperature, y = Entropy, shape = Material, col = Material)) + theme_bw() + geom_point(size = 1)
Entropy_Plot <- Entropy_Plot + scale_x_continuous(breaks = scales::pretty_breaks(n = 30)) + scale_y_continuous(breaks = scales::pretty_breaks(n=30))
Entropy_Plot <- Entropy_Plot + labs(x = "Temperature (Kelvin)", y = "Standard Entropy (Joules per mole per Kelvin)", title = "Entropy as a Function of Temperature\nFor various Materials as predicted by Schomate Equation")
ggsave(plot = Entropy_Plot, filename = "Entropy_vs_Temperature_Schomate_Plot.png", width = 10, height = 10)
print(Entropy_Plot)
And the file that I read in with read.csv looked like this:
structure(list(Material = structure(c(7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L), .Label = c("Copper", "H2O", "Iron", "Lithium", "MgCl2",
"NaCl", "Nickel"), class = "factor"), Parameters = structure(c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L), .Label = c("A", "B", "C", "D", "E",
"F", "G", "H"), class = "factor"), Values = c(13.6916, 82.49509,
-174.9548, 161.6011, -0.092417, -6.833644, 27.669, 0, 17.72891,
28.0987, -31.25289, 13.97243, 0.068611, -6.056591, 47.89592,
0, 18.4286, 24.64301, -8.91372, 9.664706, -0.012643, -6.573022,
42.51488, 0, 50.72389, 6.672267, -2.517167, 10.15934, -0.200675,
-427.2115, 130.3973, -411.1203, 78.30733, 2.435888, 6.858873,
-1.728967, -0.729911, -667.5823, 179.2639, -641.6164, -203.606,
1523.29, -3196.413, 2474.455, 3.855326, -256.5478, -488.7163,
-285.8304, 169.552, -882.711, 1977.438, -1487.312, -1.609635,
-31.24825, 413.6466, 0)), .Names = c("Material", "Parameters",
"Values"), class = "data.frame", row.names = c(NA, -56L))
I don't have any questions about my code. I put it in here to make my results reproducible. I'm just curious why copper has lower heat capacity than lithium when copper has more electrons so I would think there would be more energy states to put the heat. However, it's also true that copper has a smaller atomic radius than lithium so maybe this is a factor but I'm not sure how it affects the heat capacity.
Heat Capacity vs Temperature Plot.
Delta Enthalpy vs Temperature Plot:
Standard Entropy vs Temperature Plot:
Furthermore, is there any underlying theory in the Schomate Equation or is it mostly polynomial regression fitted to limited calorimetric experimental data?