# Enter the Collected Data years = [1860, 1880, 1890, 1900, 1920, 1931, 1940, 1950, 1960, 1970, 1980, 1989]; adoption = [1, 7, 13, 15, 20, 51, 60, 71, 87, 96, 98, 100]; # Define Solution to Bass Model function F(t, p, q) e = exp(-(p+q)*t) return (1 - e)/(1 + (q/p)*e) end # Transform Data T = years .- 1860; Y = adoption / 100; # Compute square error sqErr function sqErr((p, q)) Fpq = F.(T, p, q) E = sum(Fpq.*Fpq - 2*Fpq.*Y + Y.*Y) return E end # Minimize the square error using Optim results = optimize(sqErr, [0.25, .5]) println(results) # Extract minimizing parameters from results object (pMin, qMin) = Optim.minimizer(results) println("The minimizing parameter values are (p, q) = ($pMin, $qMin).") println("The ratio q/p = $(qMin/pMin)") # Plot data and fitted model on same set of axes using Plots plot(years, adoption, label="Collected Data") Ffit = F.(T, pMin, qMin) * 100 plot!(years, Ffit, label="Fitted Bass Model", legend=:right, xlabel="Year", ylabel="Adoption %", title="Flushing Toilet Technology Adoption in Society")