# usl.fit model with 3 coefficients with bounds on NLS parameters # Created by NJG on Thu Sep 21 14:28:21 2017 # SGI Origin data df.gcap <- read.table(text="N X_N 8 130 12 170 16 190 20 210 24 220 28 245 32 255 48 280 64 310", header=TRUE ) # Sensitivity produces -beta unless bounds are applied to USL parameters usl.fit <- nls(X_N ~ gamma * N / (1 + alpha * (N - 1) + beta * N * (N - 1)), df.gcap, start=list(gamma=10, alpha=0.01, beta=0.0001), algorithm="port", lower=c(1,0,0), upper=c(100,0.05,0.0002)) summary(usl.fit) Nmax <- sqrt((1 - coef(usl.fit)['alpha']) / coef(usl.fit)['beta']) Xmax <- coef(usl.fit)['gamma'] * Nmax / (1 + coef(usl.fit)['alpha'] * (Nmax - 1) + coef(usl.fit)['beta'] * Nmax * (Nmax - 1)) Nopt <- abs(1 / coef(usl.fit)['alpha']) Xroof <- coef(usl.fit)['gamma'] * Nopt plot(df.gcap$N, df.gcap$X_N, xlim=c(0,200), ylim=c(0,450), xlab="Users (N)", ylab="Thruput X(N)") abline(v=Nopt, col="gray") abline(h=Xroof, col="gray") abline(a=0, b=Xroof/Nopt, col="gray") abline(v=Nmax, col="red") abline(h=Xmax, col="red") points(c(1,4), c(20,78), pch=15) # later measurements curve(coef(usl.fit)['gamma'] * x / (1 + coef(usl.fit)['alpha'] * (x - 1) + coef(usl.fit)['beta'] * x * (x - 1)), from=0, to=400, add=TRUE, col="blue", lwd=2) title("USL Scalability Analysis - GCAP 2017") text(100, 200, "NJG on Thu Sep 21 2017", col="lightgray",cex=0.75) legend("bottom", legend=eval(parse(text=sprintf("expression(alpha == %.4f, beta == %.6f, gamma == %.4f, Nmax==%.2f, Xmax==%.2f,Xroof==%.2f)", coef(usl.fit)['alpha'], coef(usl.fit)['beta'], coef(usl.fit)['gamma'], Nmax, Xmax, Xroof))), ncol=2, inset=0.05, cex=0.75)