diff --git a/auto_differentiation.py b/auto_differentiation.py index 16effb6..cf55d43 100644 --- a/auto_differentiation.py +++ b/auto_differentiation.py @@ -22,15 +22,6 @@ sympy.init_printing() # _t_m 导线架线时时导线温度 单位°C -delta_Li__1 = sympy.symbols( - "delta_Li:{span_count}".format(span_count=data.span_count - 1) -) -delta_Li = ( - *delta_Li__1, - sympy.symbols("delta_Li_i"), -) - - loop_end = data.loop_end # 最大循环次数 # 架线时的状态 # 取外过无风 @@ -46,129 +37,28 @@ sigma_m_data = data.sigma_m # 架线时,初伸长未释放前的最低点水 span_count = data.span_count # 几个档距 # n个档距,n-1个直线塔 h_array = data.h_array -# sympy.pprint(hi_matrix) l_array = data.l_array t_data = data.t conductor_n = data.conductor_n -# ti_matrix = sympy.Matrix(t_array) lambda_i_array = data.lambda_i_array # TODO: 暂时没考虑荷载变化 symbol_delta_l_i = exp.delta_li() sigma_i = sympy.symbols("sigma_i") d_delta_l_i_sigma_i = sympy.diff(symbol_delta_l_i, sigma_i) - - -def get_lambdify_d_delta_l_i_sigma_i(_d_delta_l_i_sigma_i): - ( - delta_l_i, - l_i, - lambda_i, - alpha, - E, - t_e, - t_i, - lambda_m, - t_m, - sigma_m, - _sigma_i, - beta_i, - ) = sympy.symbols( - """ - delta_l_i, - l_i, - lambda_i, - alpha, - E, - t_e, - t_i, - lambda_m, - t_m, - sigma_m, - sigma_i, - beta_i - """ - ) - return sympy.lambdify( - ( - delta_l_i, - l_i, - lambda_i, - alpha, - E, - t_e, - t_i, - lambda_m, - t_m, - sigma_m, - _sigma_i, - beta_i, - ), - _d_delta_l_i_sigma_i, - ) - - -fx_d_delta_l_i_sigma_i = get_lambdify_d_delta_l_i_sigma_i(d_delta_l_i_sigma_i) - +fx_d_delta_l_i_sigma_i = exp.get_lambdify_d_delta_l_i_sigma_i(d_delta_l_i_sigma_i) +delta_Li__1 = sympy.symbols( + "delta_Li:{span_count}".format(span_count=data.span_count - 1) +) +delta_Li = ( + *delta_Li__1, + sympy.symbols("delta_Li_i"), +) symbol_sigma_i1 = exp.fun_sigma_i1(delta_Li) delta_Li_i = sympy.symbols("delta_Li_i") d_sigma_i1_d_l_i = sympy.diff(symbol_sigma_i1, delta_Li_i) -def get_lambdify_d_sigma_i1_d_l_i(_d_sigma_i1_d_l_i): - ( - G_i, - A, - lambda_i, - lambda_i1, - _sigma_i, - h_i, - h_i1, - l_i, - l_i1, - stringlen_i, - _sigma_i1, - beta_i, - beta_i1, - ) = sympy.symbols( - """ - G_i, - A, - lambda_i, - lambda_i1, - sigma_i, - h_i, - h_i1, - l_i, - l_i1, - stringlen_i, - sigma_i1, - beta_i, - beta_i1, - """ - ) - - return sympy.lambdify( - ( - G_i, - A, - lambda_i, - lambda_i1, - _sigma_i, - h_i, - h_i1, - l_i, - l_i1, - stringlen_i, - _sigma_i1, - beta_i, - beta_i1, - *delta_Li, - ), - _d_sigma_i1_d_l_i, - ) - - -fx_d_sigma_i1_d_l_i = get_lambdify_d_sigma_i1_d_l_i(d_sigma_i1_d_l_i) +fx_d_sigma_i1_d_l_i = exp.get_lambdify_d_sigma_i1_d_l_i(d_sigma_i1_d_l_i, delta_Li) # 一共2n个变量,n个delta_Li,n个sigma_i @@ -308,11 +198,7 @@ def evaluate_d_sigma_i1_d_delta_sigma_i(val_delta_li): def solve(): # 初始化 val_delta_li = [0.1 for _ in range(span_count)] - # val_delta_li = [0.15931589580330385, -0.19294219226439696, 0.035236744603670586, -0.03124795962518869, 0.034422847061933395, 0.1639551737321582, -0.18876605469917845, 0.03862307099222713, -0.01858088432390902] - - # val_sigma_i = [175.44277576372207, 176.07105062365383, 175.94897602628689, 175.95574563415994, 175.83116207025824, 175.84778616876434, 176.5132398968081, 176.4405408454816, 176.51871673188586] val_sigma_i = [sigma_m_data for _ in range(span_count)] - loop = 0 while True: loop += 1 @@ -377,19 +263,14 @@ def solve(): b_list.extend(fx_delta_Li) b_list.extend(fx_sigma_i1) b_list.extend(fx_sum_Li) - # b = sympy.Matrix(b_list) - # x = sympy.linsolve((-A, b)) - # x_list = [float(_x) for _x in list(x)[0]] - # numpy - # print(A.tolist()) - AA = np.array(A.tolist(), np.float64) - # AA=np.array([[1, 0, 0, -0.0104519104486432, 0, 0], [0, 1, 0, 0, -0.00782784930594165, 0], [0, 0, 1, 0, 0, -0.00640057303461462], [-3.78731866382623, 0, 0, -1.00000000000000, 1, 0], [-3.47643075688507, -3.47643075688507, 0, 0, -1.00000000000000, 1], [1, 1, 1, 0, 0, 0]]) - # print(b.transpose().tolist()[0]) + AA = np.array(A.tolist(), dtype=np.float64) b = np.array(b_list, dtype=np.float64) - # BB=[-0.159573673689794, 0.140383878899664, 0.00728144380483030, -0.378687120179166, -0.694957566239367, 0.300000000000000] x = np.linalg.solve(-AA, b) x_list = x - abs_min: List[float] = [math.fabs(_x) for _x in x_list] + # 强制要求等式满足 + abs_min: List[float] = [ + math.fabs(_x) for _x in [*x_list, *fx_delta_Li, *fx_sigma_i1] + ] abs_min.sort() if abs_min[-1] < 1e-5: break diff --git a/data.py b/data.py index 87e0171..a484203 100644 --- a/data.py +++ b/data.py @@ -17,7 +17,7 @@ lambda_i_array = [ lambda_m, lambda_m, lambda_m * 0.9, - lambda_m * 1.1, + lambda_m * 1.5, lambda_m, lambda_m, lambda_m, @@ -29,7 +29,7 @@ lambda_i_array = [ ] # 取400m代表档距下 sigma_m = 28517 / area # 架线时,初伸长未释放前的最低点水平应力。单位N/mm2 -span_count = 10 # 几个档距 +span_count = 14 # 几个档距 # n个档距,n-1个直线塔 h_array = [ 0, diff --git a/exp.py b/exp.py index f967c4d..2bed34b 100644 --- a/exp.py +++ b/exp.py @@ -43,7 +43,6 @@ def delta_li(): sigma_i, beta_i,""" ) - # beta_i = sympy.atan(h_i / l_i) # 高差角 _delta_li = delta_l_i - ( l_i / ((sympy.cos(beta_i) ** 2) * (1 + (lambda_i * l_i / sigma_i) ** 2 / 8)) @@ -55,7 +54,6 @@ def delta_li(): + alpha * (t_i + t_e - t_m) ) ) - # d_delta_li_sigma_i = sympy.diff(_delta_li, sigma_i) return _delta_li @@ -170,3 +168,104 @@ def manual_diff_sigma_i1_d_l_i( ) _t = -(dA_d_delta_L1 * B - A * dB_d_delta_L1) / (B ** 2) return _t + +def get_lambdify_d_delta_l_i_sigma_i(_d_delta_l_i_sigma_i): + ( + delta_l_i, + l_i, + lambda_i, + alpha, + E, + t_e, + t_i, + lambda_m, + t_m, + sigma_m, + _sigma_i, + beta_i, + ) = sympy.symbols( + """ + delta_l_i, + l_i, + lambda_i, + alpha, + E, + t_e, + t_i, + lambda_m, + t_m, + sigma_m, + sigma_i, + beta_i + """ + ) + return sympy.lambdify( + ( + delta_l_i, + l_i, + lambda_i, + alpha, + E, + t_e, + t_i, + lambda_m, + t_m, + sigma_m, + _sigma_i, + beta_i, + ), + _d_delta_l_i_sigma_i, + ) + +def get_lambdify_d_sigma_i1_d_l_i(_d_sigma_i1_d_l_i,delta_Li): + ( + G_i, + A, + lambda_i, + lambda_i1, + _sigma_i, + h_i, + h_i1, + l_i, + l_i1, + stringlen_i, + _sigma_i1, + beta_i, + beta_i1, + ) = sympy.symbols( + """ + G_i, + A, + lambda_i, + lambda_i1, + sigma_i, + h_i, + h_i1, + l_i, + l_i1, + stringlen_i, + sigma_i1, + beta_i, + beta_i1, + """ + ) + + return sympy.lambdify( + ( + G_i, + A, + lambda_i, + lambda_i1, + _sigma_i, + h_i, + h_i1, + l_i, + l_i1, + stringlen_i, + _sigma_i1, + beta_i, + beta_i1, + *delta_Li, + ), + _d_sigma_i1_d_l_i, + ) \ No newline at end of file diff --git a/main.py b/main.py index 13e0d06..0af69e9 100644 --- a/main.py +++ b/main.py @@ -69,18 +69,15 @@ def fun_sigma_i1( ) -> float: beta_i = math.atan(h_i / l_i) beta_i1 = math.atan(h_i1 / l_i1) - try: - _sigma_i1 = ( - ( - g_i / 2 / area # g_i传入时已考虑导线分裂数 - + lambda_i * l_i / 2 / math.cos(beta_i) - + lambda_i1 * l_i1 / 2 / math.cos(beta_i1) - + sigma_i * h_i / l_i - ) - + sigma_i / b_i * math.sqrt(length_i ** 2 - b_i ** 2) - ) / (math.sqrt(length_i ** 2 - b_i ** 2) / b_i + h_i1 / l_i1) - except: - a=12 + _sigma_i1 = ( + ( + g_i / 2 / area # g_i传入时已考虑导线分裂数 + + lambda_i * l_i / 2 / math.cos(beta_i) + + lambda_i1 * l_i1 / 2 / math.cos(beta_i1) + + sigma_i * h_i / l_i + ) + + sigma_i / b_i * math.sqrt(length_i ** 2 - b_i ** 2) + ) / (math.sqrt(length_i ** 2 - b_i ** 2) / b_i + h_i1 / l_i1) return _sigma_i1 @@ -109,7 +106,7 @@ def cal_loop(): while True: b_i = 0 # 一次增加0.1N - sigma_0 = sigma_0 + 0.1 / data.area + sigma_0 = sigma_0 + 0.01 / data.area sigma_array = [sigma_0 for j in range(span_count)] delta_l_i_array = [] for i in range(span_count): @@ -213,6 +210,9 @@ def verify( ): # 用新版大手册p329页(5-61)第一个公式校验 b_i = 0 + if math.fabs((math.fsum(delta_l_i_array)))>1e-5: + print('偏移累加不等于0') + return for i in range(len(delta_l_i_array)): sigma_i = sigma_array[i] _delta_l_i = delta_l_i_array[i] @@ -262,8 +262,8 @@ def verify( print("等式满足。") # print('sigma') # print(sigma_array) - # print('delta_li') - # print(delta_l_i_array) + print('delta_li') + print(delta_l_i_array) if __name__ == "__main__":