## ---- eval = FALSE------------------------------------------------------- # # load the eChem package so that its functions are available # library(eChem) ## ---- eval = FALSE------------------------------------------------------- # # simulate the cyclic voltammogram # example1 = simulateCV(e.start = 0, e.switch = -0.5, e.form = -0.25, # mechanism = "E", scan.rate = 1, area = 0.01, # temp = 298, conc.bulk = 1e-3, n = 1, d = 1e-5, # alpha = 0.5, ko = 1, kcf = 0, kcr = 0) # # # show plot of the applied potential; note that the y-axis here # # runs in the opposite direction than that shown in Gosser's Figure # # 2-7 with more negative potentials shown on the bottom # plotPotential(example1) # # # show plot of the cyclic voltammogram # plotCV(list(example1)) # # # adjust the plotting window to display six plots in a 2 by 3 array # old.par = par(mfrow = c(2, 3)) # # # plot the diffusion profiles; note that the scale on the x-axis # # extends to greater distances from the electrode than does those # # shown in Gosser's Figure 2-8 # plotDiffusion(example1, t = 0.225) # plotDiffusion(example1, t = 0.275) # plotDiffusion(example1, t = 0.380) # plotDiffusion(example1, t = 0.725) # plotDiffusion(example1, t = 0.775) # plotDiffusion(example1, t = 0.880) # # # reestablish the original plot window # par(old.par) # # # the plotGrid function provides a similar view of the diffusion # # profiles, but includes a cyclic voltammogram that indicates the # # specific time and potential for each diffusion profile # plotGrid(example1) # # # the animate function shows how the cyclic voltammogram and the # # diffusion profiles change as the potential is scanned from # # e.start to e.switch and back to e.start; note that the files # # created by this function are saved to the current working # # directory # animateCV(example1, out_type = "html", out_name = "example1") ## ---- eval = FALSE------------------------------------------------------- # # # simulate the cyclic voltammograms # example2a = simulateCV(ko = 1, e.switch = -0.8, e.form = -0.4) # example2b = simulateCV(ko = 0.01, e.switch = -0.8, e.form = -0.4) # example2c = simulateCV(ko = 0.001, e.switch = -0.8, e.form = -0.4) # example2d = simulateCV(ko = 0.0001, e.switch = -0.8, e.form = -0.4) # # # overlay the four cyclic voltammograms and add a legend # plotCV(list(example2a, example2b, example2c, example2d), # legend_text = c("ko = 1 cm/s", "ko = 0.01 cm/s", # "ko = 0.001 cm/s", "ko = 0.0001 cm/s")) ## ---- eval = FALSE------------------------------------------------------- # # # simulate the cyclic voltammograms # example3a = simulateCV(ko = 0.0001, alpha = 0.75, e.start = 0.4, # e.switch = -1.2, e.form = -0.4) # example3b = simulateCV(ko = 0.0001, alpha = 0.50, e.start = 0.4, # e.switch = -1.2, e.form = -0.4) # example3c = simulateCV(ko = 0.0001, alpha = 0.25, e.start = 0.4, # e.switch = -1.2, e.form = -0.4) # # # overlay the three cyclic voltammograms and add a legend # plotCV(list(example3a, example3b, example3c), # legend_text = c("alpha = 0.75", "alpha = 0.50", "alpha = 0.25")) ## ---- eval = FALSE------------------------------------------------------- # # # simulate the cyclic voltammograms # example4a = simulateCV(mechanism = "EC", ko = 1, kcf = 0, kcr = 0) # example4b = simulateCV(mechanism = "EC", ko = 1, kcf = 2.5, kcr = 0) # example4c = simulateCV(mechanism = "EC", ko = 1, kcf = 100, kcr = 0) # example4d = simulateCV(mechanism = "EC", ko = 1, kcf = 1000, kcr = 0, # t.units = 4000) # # # overlay the cyclic voltammograms and add a legend # plotCV(list(example4a, example4b, example4c, example4d), # legend_text = c("kcf = 0", "kcf = 2.5", "kcf = 100", "kcf = 1000")) ## ---- eval = FALSE------------------------------------------------------- # # # simulate the chronoamperograms # example5a = simulateCA(mechanism = "EC", pulses = "double", # t.1 = 0.001, t.2 = 0.003, t.end = 0.005, # kcf = 50) # example5b = simulateCA(mechanism = "EC", pulses = "double", # t.1 = 0.001, t.2 = 0.003, t.end = 0.005, # kcf = 100, t.units = 3000) # example5c = simulateCA(mechanism = "EC", pulses = "double", # t.1 = 0.001, t.2 = 0.003, t.end = 0.005, # kcf = 500, t.units = 5000) # # # overlay the chronoamperograms and add a legend # plotCA(list(example5a, example5b, example5c), scale = 0.2, # legend_text = c("kcf = 50", "kcf = 100", "kcf = 500"), # legend_position = "topright") ## ---- eval = FALSE------------------------------------------------------- # # # simulate the cyclic voltammogram # example6 = simulateCV(e.start = -1, e.switch = -1.65, e.form = -1.529, # conc.bulk = 0.002, ko = 0.012, alpha = 0.78, # kcf = 580, kcr = 0, mechanism = "EC", area = 0.019, # scan.rate = 0.3, d = 1.7e-6, t.units = 11000) # # # display the cyclic voltammogram # plotCV(filenames = list(example6)) ## ---- eval = FALSE------------------------------------------------------- # # # simlulate the cyclic voltammograms; for the second example, the # # return peak is sufficiently distorted such that its peak # # current cannot be determined # example7a = simulateCV(ko = 1, e.switch = -0.8, e.form = -0.4) # example7b = simulateCV(ko = 0.0001, e.switch = -0.8, e.form = -0.4) # # # plot the annotated cyclic voltammograms # annotateCV(example7a) # annotateCV(example7b) ## ---- eval = FALSE------------------------------------------------------- # # # simlulate the linear sweep voltammograms; for the first example # # the solution is not stirred, but for the second example the # # stir rate is set to slow # example8a = simulateLSV(ko = 1, e.start = 0, e.end = -0.8, # e.form = -0.4, stir.rate = "off") # example8b = simulateLSV(ko = 1, e.start = 0, e.end = -0.8, # e.form = -0.4, stir.rate = "slow") # # # plot the annotated linear sweep voltammograms # annotateLSV(example8a) # annotateLSV(example8b) # # # show the applied potential and diffusion profiles # plotPotential(example8a) # plotGrid(example8a) # plotGrid(example8b) ## ---- eval = FALSE------------------------------------------------------- # # # simulate the chronoamperograms; the first example is for a # # single pulse experiment and the second example is for a double # # pulse experiment # example9a = simulateCA(pulses = "single", t.1 = 1, t.end = 3) # example9b = simulateCA(pulses = "double", t.1 = 1, t.2 = 2, t.end = 3) # # # annotate the chronoamperograms; the scale.factor is set to 10 # # so that it is easier to see how the currents are defined # annotateCA(example9a, time.delay = 0.25, scale.factor = 10) # annotateCA(example9b, time.delay = 0.25, scale.factor = 10) # # # show the applied potential and diffusion profiles # plotPotential(example9a) # plotPotential(example9b) # plotGrid(example9a) # plotGrid(example9b) ## ---- eval = FALSE------------------------------------------------------- # # # simulate the chronocoulograms by wrapping simulateCC around a # # call to simulateCA; the first example is for a single pulse # # experiment and the second example is for a double pulse # # experiment # example10a = simulateCC(simulateCA(pulses = "single", # t.1 = 1, t.end = 3)) # example10b = simulateCC(simulateCA(pulses = "double", # t.1 = 1, t.2 = 2, t.end = 3)) # # # annotate the chronoamperograms # annotateCC(example10a, time.delay = 0.25) # annotateCC(example10b, time.delay = 0.25) # # # show the applied potential and diffusion profiles # plotPotential(example10a) # plotPotential(example10b) # plotGrid(example10a) # plotGrid(example10b) ## ---- eval = FALSE------------------------------------------------------- # # # simulate the cyclic voltammograms for seven different scan rates # example_cv11a = simulateCV(scan.rate = 0.01) # example_cv11b = simulateCV(scan.rate = 0.05) # example_cv11c = simulateCV(scan.rate = 0.1) # example_cv11d = simulateCV(scan.rate = 0.5) # example_cv11e = simulateCV(scan.rate = 1) # example_cv11f = simulateCV(scan.rate = 5) # example_cv11g = simulateCV(scan.rate = 10) # # # examine an overlay of four simulations to see affect of scan rate # plotCV(filenames = list(example_cv11a, example_cv11c, # example_cv11e, example_cv11g), # legend_text = c("scan rate = 0.01 V/s", "scan rate = 0.1 V/s", # "scan rate = 1 V/s", "scan rate = 10 V/s")) # # # create vector of scan rates # scanrates = c(0.01, 0.05, 0.1, 0.5, 1, 5, 10) # # # use the max function to find the peak current for each simluation # peakcurrents = c(max(example_cv11a$current), max(example_cv11b$current), # max(example_cv11c$current), max(example_cv11d$current), # max(example_cv11e$current), max(example_cv11f$current), # max(example_cv11g$current)) # # # plot the peak current vs. the square root of the scan rate # plot(x = sqrt(scanrates), y = peakcurrents, # pch = 19, col = "blue", # xlab = "(scan rate)^0.5", # ylab = expression("peak current (", mu, "A)")) # # # use the linear model function to complete a regression analysis # iv.lm = lm(peakcurrents ~ sqrt(scanrates)) # # # use the abline function to add the regression line to plot # abline(iv.lm, col = "blue", lty = 1) ## ---- eval = FALSE------------------------------------------------------- # # # simulate cyclic voltammograms setting ko to 0.05 for all and # # setting alpha to 0.4, 0.5, and 0.6 # example12a = simulateCV(ko = 0.05, alpha = 0.3) # example12b = simulateCV(ko = 0.05, alpha = 0.5) # example12c = simulateCV(ko = 0.05, alpha = 0.7) # # # overlay the cyclic voltammograms and add a legend; note how the # # value of alpha affects the peak currents on the forward and the # # reverse scan # plotCV(filenames = list(example12a, example12b, example12c), # legend_text = c("alpha = 0.4", "alpha = 0.5", "alpha = 0.6")) # # # examine how the # par(mfrow = c(3, 1)) # plot(example12a$potential, example12a$k_f, type = "l", # xlab = "potential (V)", ylab = "rate constant (cm/s)", # main = "alpha = 0.3") # lines(example12a$potential, example12a$k_b, lty = 2) # plot(example12b$potential, example12b$k_f, type = "l", # xlab = "potential (V)", ylab = "rate constant (cm/s)", # main = "alpha = 0.5") # lines(example12b$potential, example12b$k_b, lty = 2) # plot(example12c$potential, example12c$k_f, type = "l", # xlab = "potential (V)", ylab = "rate constant (cm/s)", # main = "alpha = 0.7") # lines(example12c$potential, example12c$k_b, lty = 2) # par(mfrow = c(1,1)) ## ---- eval = FALSE------------------------------------------------------- # # # create a data.frame of potentials and currents using the # # read.csv function; note that the system.file command wrapped # # inside the call to teh read.csv function is used to determine # # the path to the ferrocene_data.csv file # example13 = read.csv(system.file("extdata", "ferrocene_data.csv", # package = "eChem")) # # # examine the file's structure, noting that it consists of two # # variables, each with 1600 values, and that the potentials are # # in V and the currents are in A # str(example13) # head(example13) # # # create a subsample of the full data by retaining every 20th # # value and adjust the current so it is reported in µA instead of # # in A (there is no need to adjust the units for the potential); # # the smaller data set will allow us to see individual points # # when using plotCV to examine the data # example13_potential = example13$potential[seq(1,1600,20)] # example13_current = example13$current[seq(1,1600,20)]*1e6 # # # create a reduced data file (as a list) with the structure # # required by plotCV and then examine the plot # example13_expt = list("expt" = "CV", "file_type" = "reduced", # "potential" = example13_potential, # "current" = example13_current) # plotCV(filename = list(example13_expt)) # # # use simulateCV to test a set of conditions and then overlay the # # simulated data and the experimental data; as first guess we use # # the initial potential of 0 V, the switching potential of 0.8 V, # # approximate the formal potential as 0.4 V, and leave all other # # values at their default levels # example13_sim = simulateCV(e.start = 0, e.switch = 0.8, e.form = 0.4) # # # overlay the experimental data and the simulated data and # # evaluate the quality of the fit # plotCV(filename = list(example13_sim, example13_expt), # legend_text = c("simulated", "experimental")) # # # continue to adjust variables until satisified with the fit # example13_sim = simulateCV(e.start = 0, e.switch = 0.8, e.form = 0.39, # scan.rate = 0.1, conc.bulk = 0.01, # ko = 0.009, alpha = 0.3) # plotCV(filename = list(example13_sim, example13_expt), # legend_text = c("simulated", "experimental")) ## ---- eval = FALSE------------------------------------------------------- # # # create the experimental cyclic voltammogram with a small amount # # of noise added # example14_raw = simulateCV(e.start = 0, e.switch = 0.8, e.form = 0.4, # conc.bulk = 0.005, area = 0.05, d = 5e-5, # ko = 0.75, sd.noise = 0.5) # example14_expt = sampleCV(example14_raw, data.reduction = 2.5) # plotCV(filenames = list(example14_expt)) # # # use simulateCV to test a set of conditions and then overlay the # # simulated data and the experimental data; as first guess we use # # the initial potential of 0 V, the switching potential of 0.8 V, # # approximate the formal potential as 0.4 V, and leave all other # # values at their default levels # example14_sim = simulateCV(e.start = 0, e.switch = 0.8, e.form = 0.4) # # # overlay the experimental data and the simulated data and # # evaluate the quality of the fit # plotCV(filename = list(example14_sim, example14_expt), # legend_text = c("simulated", "experimental")) # # # continue to adjust variables until satisified with the fit # example14_sim = simulateCV(e.start = 0, e.switch = 0.8, e.form = 0.4, # conc.bulk = 0.005, area = 0.05, d = 5e-5, # ko = 0.75) # plotCV(filename = list(example14_sim, example14_expt), # legend_text = c("simulated", "experimental")) ## ---- eval = FALSE------------------------------------------------------- # # # simulate the linear sweep voltammograms # example15a = simulateLSV(stir.rate = "off") # example15b = simulateLSV(stir.rate = "slow") # example15c = simulateLSV(stir.rate = "medium") # example15d = simulateLSV(stir.rate = "fast") # # # overlay the linear sweep voltammograms # plotLSV(filenames = list(example15a, example15b, # example15c, example15d), # legend_text = c("stir: off", "stir: slow", # "stir: medium", "stir: fast"), # legend_position = "topleft", # main_title = "Effect of Stir Rate on Current in LSV")