准备修改成通用程序。

This commit is contained in:
n3040 2022-08-22 16:09:08 +08:00
parent dbbba95996
commit ba4668e97b
5 changed files with 167 additions and 123 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
venv venv
*.xls

View File

@ -1,4 +1,5 @@
# 利用自动微分计算 # 利用自动微分计算
import datetime
from typing import List from typing import List
import sympy import sympy
@ -91,21 +92,21 @@ def evaluate_d_delta_l_i_sigma_i(val_delta_l_li, val_sigma_i):
math.atan(h_array[i] / l_array[i]), math.atan(h_array[i] / l_array[i]),
) )
) )
manual_val = exp.manual_diff_delta_li_sigma_i( # manual_val = exp.manual_diff_delta_li_sigma_i(
h_array[i], # h_array[i],
l_array[i], # l_array[i],
lambda_m_data, # lambda_m_data,
lambda_i_array[i], # lambda_i_array[i],
val_sigma_i[i], # val_sigma_i[i],
sigma_m_data, # sigma_m_data,
alpha_data, # alpha_data,
t_data, # t_data,
t_e_data, # t_e_data,
t_m_data, # t_m_data,
elastic_data, # elastic_data,
) # )
if math.fabs(val - manual_val) > 1e-5: # if math.fabs(val - manual_val) > 1e-5:
raise Exception("d_delta_l_i_sigma_i 自动和手动微分不匹配") # raise Exception("d_delta_l_i_sigma_i 自动和手动微分不匹配")
val_list.append(val) val_list.append(val)
return val_list return val_list
@ -146,21 +147,21 @@ def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_sigma_i):
) )
) )
manual_val = exp.manual_diff_sigma_i1_d_l_i( # manual_val = exp.manual_diff_sigma_i1_d_l_i(
h_array[i], # h_array[i],
l_array[i], # l_array[i],
h_array[i + 1], # h_array[i + 1],
l_array[i + 1], # l_array[i + 1],
string_g / conductor_n, # string_g / conductor_n,
area_data, # area_data,
lambda_i_array[i], # lambda_i_array[i],
lambda_i_array[i + 1], # lambda_i_array[i + 1],
val_sigma_i[i], # val_sigma_i[i],
string_length, # string_length,
math.fsum(val_delta_l_li[0 : i + 1]), # math.fsum(val_delta_l_li[0 : i + 1]),
) # )
if math.fabs(manual_val - _val) > 1e-5: # if math.fabs(manual_val - _val) > 1e-5:
raise Exception("d_sigma_i1_delta_L_i 自动和手动微分不匹配") # raise Exception("d_sigma_i1_delta_L_i 自动和手动微分不匹配")
col.append(_val) col.append(_val)
row.append(col) row.append(col)
return sympy.Matrix(row) return sympy.Matrix(row)
@ -196,13 +197,14 @@ def evaluate_d_sigma_i1_d_delta_sigma_i(val_delta_li):
def solve(): def solve():
starttime = datetime.datetime.now()
# 初始化 # 初始化
val_delta_li = [0.1 for _ in range(span_count)] val_delta_li = [data.string_length / (span_count + 1) for _ in range(span_count)]
val_sigma_i = [sigma_m_data for _ in range(span_count)] val_sigma_i = [sigma_m_data for _ in range(span_count)]
loop = 0 loop = 0
while True: while True:
loop += 1 loop += 1
print("{loop}次迭代".format(loop=loop)) # print("第{loop}次迭代".format(loop=loop))
if loop >= 20: if loop >= 20:
break break
# A为dΔli/dli # A为dΔli/dli
@ -274,7 +276,7 @@ def solve():
abs_min.sort() abs_min.sort()
if abs_min[-1] < 1e-5: if abs_min[-1] < 1e-5:
break break
print("最大偏差{max_dx}".format(max_dx=abs_min[-1])) # print("最大偏差{max_dx}".format(max_dx=abs_min[-1]))
# 更新变量 # 更新变量
for i in range(span_count): for i in range(span_count):
val_delta_li[i] += x_list[i] val_delta_li[i] += x_list[i]
@ -286,6 +288,9 @@ def solve():
# print(val_delta_li) # print(val_delta_li)
# print(val_sigma_i) # print(val_sigma_i)
verify(val_delta_li, val_sigma_i) verify(val_delta_li, val_sigma_i)
endtime = datetime.datetime.now()
# print('执行时间{t}'.format(t=(endtime-starttime).microseconds/1000))
pass
def verify(val_delta_li, val_sigma_i): def verify(val_delta_li, val_sigma_i):

145
data.py
View File

@ -1,35 +1,98 @@
# loop_end = 10000000 # 最大循环次数 # # loop_end = 10000000 # 最大循环次数
loop_end = 1000000 # 最大循环次数 # loop_end = 1000000 # 最大循环次数
# # 架线时的状态
# # 取外过无风
# string_length = 9.2 # 串长 单位m
# string_g = 60 * 9.8 # 串重 单位N
# t_m = 15 # 导线架设时的气温。单位°C
# t_e = 20 # 架线时考虑初伸长的降温取正值。单位°C
# alpha = 0.0000155 # 导线膨胀系数 1/°C
# elastic = 95900 # 弹性系数 N/mm2
# area = 154.48 # 导线面积 mm2
# lambda_m = 14.8129 / area # 导线比载 N/(m.mm)
# lambda_i_array = [
# lambda_m * 0.9,
# lambda_m * 1.2,
# lambda_m,
# lambda_m,
# lambda_m,
# lambda_m * 0.9,
# lambda_m * 1.5,
# lambda_m,
# lambda_m,
# lambda_m,
# lambda_m,
# lambda_m,
# lambda_m,
# lambda_m * 0.9,
# lambda_m * 1.3,
# ]
# # 取400m代表档距下
# sigma_m = 28517 / area # 架线时初伸长未释放前的最低点水平应力。单位N/mm2
# span_count = 14 # 几个档距
# # n个档距,n-1个直线塔
# h_array = [
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# 0,
# ]
# l_array = [
# 400,
# 300,
# 300,
# 500,
# 300,
# 400,
# 300,
# 300,
# 500,
# 300,
# 300,
# 500,
# 300,
# 400,
# 300,
# ]
# t = 15
# epsilon = 1e-4 # 收敛判据
# conductor_n = 6 # 导线分裂数
loop_end = 5000000 # 最大循环次数
# 架线时的状态 # 架线时的状态
# 取外过无风 # 取外过无风
string_length = 9.2 # 串长 单位m string_length = 0.5 # 串长 单位m
string_g = 60 * 9.8 # 串重 单位N string_g = 30 * 9.8 # 串重 单位N
t_m = 15 # 导线架设时的气温。单位°C t_m = -25 # 导线架设时的气温。单位°C
t_e = 20 # 架线时考虑初伸长的降温取正值。单位°C t_e = 0 # 架线时考虑初伸长的降温取正值。单位°C
alpha = 0.0000155 # 导线膨胀系数 1/°C alpha = 0.0000155 # 导线膨胀系数 1/°C
elastic = 95900 # 弹性系数 N/mm2 elastic = 95900 # 弹性系数 N/mm2
area = 154.48 # 导线面积 mm2 area = 154.48 # 导线面积 mm2
lambda_m = 14.8129 / area # 导线比载 N/(m.mm) lambda_m = 7.3256 / area # 导线比载 N/(m.mm)
lambda_i_array = [ lambda_i_array = [
lambda_m * 0.9, 14.7012 / area,
lambda_m * 1.2, 14.7012 / area,
lambda_m, 14.7012 / area,
lambda_m, 8.8007 / area,
lambda_m, 14.7012 / area,
lambda_m * 0.9, 14.7012 / area,
lambda_m * 1.5, 14.7012 / area,
lambda_m,
lambda_m,
lambda_m,
lambda_m,
lambda_m,
lambda_m,
lambda_m * 0.9,
lambda_m * 1.3,
] ]
# 取400m代表档距下 # 取400m代表档距下
sigma_m = 28517 / area # 架线时初伸长未释放前的最低点水平应力。单位N/mm2 sigma_m = 17449 / area # 架线时初伸长未释放前的最低点水平应力。单位N/mm2
span_count = 14 # 几个档距 span_count = 7 # 几个档距
# n个档距,n-1个直线塔 # n个档距,n-1个直线塔
h_array = [ h_array = [
0, 0,
@ -39,32 +102,16 @@ h_array = [
0, 0,
0, 0,
0, 0,
0,
0,
0,
0,
0,
0,
0,
0,
] ]
l_array = [ l_array = [
400, 703,
300, 720,
300, 587,
500, 620,
300, 539,
400, 450,
300, 611,
300,
500,
300,
300,
500,
300,
400,
300,
] ]
t = 15 t = 40
epsilon = 1e-4 # 收敛判据 epsilon = 1e-4 # 收敛判据
conductor_n = 6 # 导线分裂数 conductor_n = 1 # 导线分裂数

14
exp.py
View File

@ -149,7 +149,7 @@ def manual_diff_sigma_i1_d_l_i(
+ sigma_i * h_i / l_i + sigma_i * h_i / l_i
+ sigma_i / b_i * ((stringlen ** 2 - b_i ** 2) ** 0.5) + sigma_i / b_i * ((stringlen ** 2 - b_i ** 2) ** 0.5)
) )
B = ((stringlen ** 2 - b_i ** 2) ** 0.5)/b_i + h_i1 / l_i1 B = ((stringlen ** 2 - b_i ** 2) ** 0.5) / b_i + h_i1 / l_i1
dA_d_delta_L1 = ( dA_d_delta_L1 = (
sigma_i sigma_i
* ( * (
@ -169,6 +169,7 @@ def manual_diff_sigma_i1_d_l_i(
_t = -(dA_d_delta_L1 * B - A * dB_d_delta_L1) / (B ** 2) _t = -(dA_d_delta_L1 * B - A * dB_d_delta_L1) / (B ** 2)
return _t return _t
def get_lambdify_d_delta_l_i_sigma_i(_d_delta_l_i_sigma_i): def get_lambdify_d_delta_l_i_sigma_i(_d_delta_l_i_sigma_i):
( (
delta_l_i, delta_l_i,
@ -200,7 +201,7 @@ def get_lambdify_d_delta_l_i_sigma_i(_d_delta_l_i_sigma_i):
""" """
) )
return sympy.lambdify( return sympy.lambdify(
( [
delta_l_i, delta_l_i,
l_i, l_i,
lambda_i, lambda_i,
@ -213,11 +214,12 @@ def get_lambdify_d_delta_l_i_sigma_i(_d_delta_l_i_sigma_i):
sigma_m, sigma_m,
_sigma_i, _sigma_i,
beta_i, beta_i,
), ],
_d_delta_l_i_sigma_i, _d_delta_l_i_sigma_i,
) )
def get_lambdify_d_sigma_i1_d_l_i(_d_sigma_i1_d_l_i,delta_Li):
def get_lambdify_d_sigma_i1_d_l_i(_d_sigma_i1_d_l_i, delta_Li):
( (
G_i, G_i,
A, A,
@ -251,7 +253,7 @@ def get_lambdify_d_sigma_i1_d_l_i(_d_sigma_i1_d_l_i,delta_Li):
) )
return sympy.lambdify( return sympy.lambdify(
( [
G_i, G_i,
A, A,
lambda_i, lambda_i,
@ -266,6 +268,6 @@ def get_lambdify_d_sigma_i1_d_l_i(_d_sigma_i1_d_l_i,delta_Li):
beta_i, beta_i,
beta_i1, beta_i1,
*delta_Li, *delta_Li,
), ],
_d_sigma_i1_d_l_i, _d_sigma_i1_d_l_i,
) )

55
main.py
View File

@ -3,6 +3,7 @@
import math import math
import data import data
import numpy as np
# h_i 悬点高差 # h_i 悬点高差
# l_i 悬点档距 # l_i 悬点档距
@ -107,7 +108,7 @@ def cal_loop():
b_i = 0 b_i = 0
# 一次增加0.1N # 一次增加0.1N
sigma_0 = sigma_0 + 0.01 / data.area sigma_0 = sigma_0 + 0.01 / data.area
sigma_array = [sigma_0 for j in range(span_count)] sigma_array = [sigma_0 for _ in range(span_count)]
delta_l_i_array = [] delta_l_i_array = []
for i in range(span_count): for i in range(span_count):
h_i = h_array[i] h_i = h_array[i]
@ -199,19 +200,19 @@ def verify(
sigma_array: [float], sigma_array: [float],
delta_l_i_array: [float], delta_l_i_array: [float],
lambda_array: [float], lambda_array: [float],
t_i, t_i: float,
alpha, alpha: float,
elastic, elastic: float,
t_e, t_e: float,
lambda_m, lambda_m: float,
t_m, t_m: float,
sigma_m, sigma_m: float,
epsilon=1e-4, epsilon: float = 1e-4,
): ):
# 用新版大手册p329页(5-61)第一个公式校验 # 用新版大手册p329页(5-61)第一个公式校验
b_i = 0 b_i = 0
if math.fabs((math.fsum(delta_l_i_array)))>1e-5: if math.fabs((math.fsum(delta_l_i_array))) > 1e-5:
print('偏移累加不等于0') print("偏移累加不等于0")
return return
for i in range(len(delta_l_i_array)): for i in range(len(delta_l_i_array)):
sigma_i = sigma_array[i] sigma_i = sigma_array[i]
@ -260,30 +261,18 @@ def verify(
print("!!!应力等式不满足") print("!!!应力等式不满足")
return return
print("等式满足。") print("等式满足。")
# print('sigma') print("sigma")
# print(sigma_array) print(np.array(sigma_array) * area)
print('delta_li') print("delta_li")
print(delta_l_i_array) print(delta_l_i_array)
print("串偏移")
b_i = 0
b_i_list = []
for l_i in delta_l_i_array[:-1]:
b_i += l_i
b_i_list.append(b_i)
print(b_i_list)
if __name__ == "__main__": if __name__ == "__main__":
cal_loop() cal_loop()
import sympy
# sympy.init_printing(use_unicode=False)
# a, b, c, d = sympy.symbols("a b c d")
# m, w, n, t = sympy.symbols("m w n t")
# b1, b2, b3 = sympy.symbols("b1 b2 b3")
# x = sympy.symbols("x")
# fx = (a * sympy.exp(-x / b1) + b * sympy.exp(-t / b1) + c) * sympy.cos(
# w * x + d
# ) + m * sympy.exp(-t / b3) * sympy.sin(w * x + n)
# int_f = sympy.integrate(fx, x)
# sympy.pprint(int_f, use_unicode=True)
# sympy.print_mathml(int_f)
# import sympy.matrices
# u_list=sympy.symbols("u1:101")
# sympy.pprint(u_list)
# m=sympy.Matrix(u_list)
# sympy.pprint(m)
# print("Finished.")