def hb_intersection(p0, p1, rtol=0.01, maxit=100, mi=20.0, d=0.5, gsi=85.0, sigma_ci=200.0): result = line(p0, p1) if result is not None: k = result[0] b = result[1] else: x = 0 y = hoek_brown(x, x, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) return x, y if k != 1: xy = b / (1 - k) else: xy = 0 s1min, s2min, s3min = hoek_brown_min_point(mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) if xy < s3min: return xy, xy x = s3min dx = xy - s3min rdy = 1 i = 0 while rdy > rtol and i < maxit: i += 1 x += dx hb_y = hoek_brown(x, x, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) pp_y = k * x + b dy = hb_y - pp_y if dy > 0: x -= dx dx *= 0.5 continue length = dist([xy, xy], [pp_y, x]) rdy = abs(dy) / length y = k * x + b return x, y
def hb_normal(p, cos_tol=0.001, maxit=1000, mi=20.0, d=0.5, gsi=85.0, sigma_ci=200.0): s1min, s2min, s3min = hoek_brown_min_point(mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) x = s3min y = s1min i = 0 c = 1 delta_x = p[1] - s3min kdx = 1e-6 hb1 = hoek_brown(p[0], p[0], mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) if p[1] <= s1min: dx = kdx dy = hoek_brown( s3min + dx, s3min + dx, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) - y p_hb = subs([x, y], p) c = cos(p_hb, [dx, dy]) return [x, y], abs(c), i elif hb1 == p[1]: x = p[0] y = p[1] return [x, y], 0, i while abs(c) > cos_tol and i < maxit: i += 1 x += delta_x y = hoek_brown(x, x, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) dx = delta_x * kdx dy = hoek_brown(x + dx, x + dx, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) - y p_hb = subs([x, y], p) c = cos(p_hb, [dx, dy]) if c < 0: x -= delta_x delta_x *= 0.5 return [x, y], abs(c), i
def hoek_brown_min_point(mi=20, d=0.5, gsi=85, sigma_ci=200): mb = mi * math.exp((gsi - 100) / (28 - 14 * d)) s = math.exp((gsi - 100) / (9 - 3 * d)) # a = 0.5 + (math.exp(-gsi / 15) - math.exp(-20 / 3)) / 6 sigma_3_min = -s * sigma_ci / mb sigma_2_min = sigma_3_min sigma_1_min = hoek_brown(sigma_2_min, sigma_3_min, mi=20, d=0.5, gsi=85, sigma_ci=200) if sigma_1_min >= sigma_2_min >= sigma_3_min: sigma_1_min = max(sigma_2_min, sigma_3_min) return sigma_1_min, sigma_2_min, sigma_3_min
min_d = 0 # 0 max_d = 1 # 1 min_gsi = 5 # 5 max_gsi = 100 # 100 mis = np.linspace(min_mi, max_mi, nc) sigma_cis = np.linspace(min_sigma_ci, max_sigma_ci, nc) ds = np.linspace(min_d, max_d, nc) gsis = np.linspace(min_gsi, max_gsi, nc) # X, Y xs = [min_c, max_c] ys = [min_c, max_c] cmap = cm.get_cmap('Greys') min_color = 0.3 hb_xs = np.linspace(min_c, max_c, n) for i, mi in enumerate(mis): hb_ys = [hoek_brown(x, x, mi=mi) for x in hb_xs] plt.plot(hb_xs, hb_ys, color=cmap(min_color + (1 - min_color) * (i / nc)), label=mi) plt.xlim(min_c * 1.05, max_c * 1.05) plt.ylim(min_c * 1.05, max_c * 1.05) plt.legend(title='mi') plot_axes(xs, ys) plt.show() plt.cla() for i, sigma_ci in enumerate(sigma_cis): hb_ys = [hoek_brown(x, x, sigma_ci=sigma_ci) for x in hb_xs] plt.plot(hb_xs, hb_ys, color=cmap(min_color + (1 - min_color) * (i / nc)), label=sigma_ci) plt.xlim(min_c * 1.05, max_c * 1.05) plt.ylim(min_c * 1.05, max_c * 1.05)
from criteria import hoek_brown import numpy as np from norm import norm_sigma from support import distance, angle if __name__ == '__main__': import matplotlib.pyplot as plt min_x = -1000 max_x = 1000 n = 1001 hb_xs = np.linspace(min_x, max_x, n) hb_ys = [hoek_brown(x, x) for x in hb_xs] plt.plot(hb_xs, hb_ys) sigma = [-500, -500, -700] a = angle([1, 1, 0], [1, 0, 0]) sigma_max_1 = hoek_brown(sigma[1], sigma[2]) sigma_max = [sigma_max_1, sigma[1], sigma[2]] d = distance(sigma, sigma_max) sigma_n = norm_sigma(sigma) plt.scatter(sigma[2], sigma[0], c='red') plt.scatter(sigma_max[2], sigma_max[0], c='green') plt.scatter(sigma_n[2], sigma_n[0], c='blue') plt.plot([0, 0], [min_x, max_x], color='black', alpha=1, linewidth=0.5) plt.plot([min_x, max_x], [0, 0], color='black', alpha=1, linewidth=0.5) plt.xlim(min_x*1.05, max_x*1.05) plt.ylim(min_x*1.05, max_x*1.05) plt.show()
def norm_sigma(sigma, atol=0.01, maxit=100): from criteria import hoek_brown sigma[1] = sigma[2] sigma_max_1 = hoek_brown(sigma[1], sigma[2]) sigma_max_3 = sigma[2] sigma_max = [sigma_max_1, sigma[1], sigma[2]] if sigma_max_1 < sigma[0]: sigma_n = [hoek_brown(0, 0), 0.0, 0.0] else: sigma_n = sigma_max d = distance(sigma, sigma_n) dx = 1 pd = d add = 100 cnt = 0 a = 1 while add > atol and cnt < maxit: cnt += 1 # Move pos and neg pos_sigma_n = [hoek_brown(sigma_n[1] + dx, sigma_n[2] + dx), sigma_n[1] + dx, sigma_n[2] + dx] neg_sigma_n = [hoek_brown(sigma_n[1] - dx, sigma_n[2] - dx), sigma_n[1] - dx, sigma_n[2] - dx] if pos_sigma_n[0] <= pos_sigma_n[2] or neg_sigma_n[0] <= neg_sigma_n[ 2]: # sigma_n = [0.0, 0.0, 0.0] break # New distances pos_d = distance(sigma, pos_sigma_n) neg_d = distance(sigma, neg_sigma_n) if pos_d < neg_d: sigma_n[1] += dx sigma_n[2] += dx sigma_n[0] = pos_sigma_n[0] d = pos_d elif pos_d > neg_d: sigma_n[1] -= dx sigma_n[2] -= dx sigma_n[0] = neg_sigma_n[0] d = neg_d else: break k = 1 # cmap = cm.get_cmap('Set1') # c = cmap(random.uniform(0, 1)) d_sigma_n = [ hoek_brown(sigma_n[1] + k * dx, sigma_n[2] + k * dx) - sigma_n[0], k * dx, k * dx] # plt.plot([sigma_n[2], sigma_n[2] + d_sigma_n[2]], [sigma_n[0], sigma_n[0] + d_sigma_n[0]], color=c) ds = delta(sigma, sigma_n) # plt.plot([sigma[2], sigma[2] + ds[2]], [sigma[0], sigma[0] + ds[0]], color=c) a = angle(ds, d_sigma_n) dsdydx = ds[0] / ds[1] dsb = sigma[0] - dsdydx * sigma[1] dsb2 = sigma_n[0] - dsdydx * sigma_n[1] sigma_min_3 = dsb / (1 - dsdydx) sigma_min_1 = sigma_min_3 # plt.plot([sigma[2], sigma[2] + ds[2]], [sigma[0], sigma[0] + ds[0]], color=c) # plt.plot([sigma_n[2], sigma_min_3], [sigma_n[0], sigma_min_1]) add = abs(a - math.pi / 2) pd = d return sigma_n
# HB mb = mi * math.exp((gsi - 100) / (28 - 14 * d)) s = math.exp((gsi - 100) / (9 - 3 * d)) a = 0.5 + (math.exp(-gsi / 15) - math.exp(-20 / 3)) / 6 min_c = -500 max_c = 500 n = 20001 xs = [min_c, max_c] ys = [min_c, max_c] hb1min, hb2min, hb3min = hoek_brown_min_point(mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) hb_xs = np.linspace(hb3min, max_c, n) hb_ys = [ hoek_brown(x, x, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) for x in hb_xs ] plt.plot( hb_xs, hb_ys, color='black', linewidth=2, label= 'HB, mi={:.2f}, D={:.2f}, GSI={:.0f},\nσci={:.0f} МПа,mb={:.2f}, s={:.2f}, a={:.2f}' .format( mi, d, gsi, sigma_ci, mb,