from operator import itemgetter
import numpy as np
from scipy.optimize import leastsq
In reference [1], Lamport et al tabulated \(f_{cu}\) (MPa) from 2 inch cube tests with measured \(E_g\) (MPa). The following fits a power law model to the data for the estimation of \(E_g\) from \(f_{cu}\).
fc_vs_Eg = [(27.1,   19995.9),
            (27.4,   19995.9),
            (27.7,   15169.3),
            (30.2,   19995.9),
            (28.3,   15169.3),
            (29.0,   15169.3),
            (41.3,   25512.0),
            (39.9,   25512.0),
            (42.1,   25512.0),
            (34.0,   22064.4),
            (37.8,   22064.4),
            (39.1,   22064.4),
            (32.8,   22753.9),
            (34.5,   22753.9),
            (36.9,   22753.9),
            (45.7,   24132.9),
            (76.7,   32407.1),
            (73.6,   32407.1)]
fc_vs_Eg = sorted(fc_vs_Eg, key=itemgetter(0))
The model is of the form \(E_g = \alpha {f_{cu}^\prime}^\beta\)
def model(constant, exponent, x):
    return constant*x**exponent
def residual(vars, x, data):
    constant = vars[0]
    exponent = vars[1]
    return (data - model(constant, exponent, x))
vars = [4550.0, 0.45]
x = [z[0] for z in fc_vs_Eg]
y = [z[1] for z in fc_vs_Eg]
out = leastsq(residual, vars, args=(x, y), full_output=True)
#print out
vars = out[0]
print('constant: {} exponent: {}'.format(vars[0],vars[1]))
fit = model(vars[0], vars[1], x)
s_u = 46.0
E_g = model(vars[0], vars[1], s_u)
s_y = 25.7/38.5*s_u
s_f = 0.2*s_u
s_t =  2.5/38.5*s_u
print('E_g: {0} s_y: {1} s_u: {2} s_f: {3} s_t: {4}'.format(E_g, s_y, s_u, s_f, s_t))
The model seems to perform better with lower strength grouts. That should be expected since the majority of the Lamport data are relatively low strength.
ducorit_d4 = (200.0, 70000.0)
print('Ducorit D4 predicted: {}'.format(model(vars[0], vars[1], ducorit_d4[0])))
ducorit_s5 = (130.0, 55000.0)
print('Ducorit S5 predicted: {}'.format(model(vars[0], vars[1], ducorit_s5[0])))
ducorit_s2 = ( 90.0, 40000.0)
print('Ducorit S2 predicted: {}'.format(model(vars[0], vars[1], ducorit_s2[0])))
ducorit_s1 = (110.0, 35000.0)
print('Ducorit S1 predicted: {}'.format(model(vars[0], vars[1], ducorit_s1[0])))
plt.plot(x,fit,color='b')
plt.plot(x,y,marker='+', color='r', ls='')
plt.ylim([0,40000])
plt.xlabel(r'\(f^\prime_c\)')
plt.ylabel(r'\(E_g\)')
plt.show()