为了加快速度,将symbol公式lambdify成普通python函数

This commit is contained in:
facat 2020-12-14 14:50:55 +08:00
parent 2750267b94
commit 54f789e22d
3 changed files with 142 additions and 94 deletions

View File

@ -60,25 +60,9 @@ lambda_i_matrix = sympy.Matrix(lambda_i_array)
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)
symbol_sigma_i1 = exp.fun_sigma_i1(delta_Li)
d_sigma_i1_sigma_i = sympy.diff(symbol_sigma_i1, sigma_i)
# sigma_i1 = sympy.symbols("sigma_i1")
# d_sigma_i1_sigma_i1 = sympy.diff(symbol_sigma_i1, sigma_i)
delta_Li_i = sympy.symbols("delta_Li_i")
d_sigma_i1_d_l_i = sympy.diff(symbol_sigma_i1, delta_Li_i)
# 一共2n个变量n个delta_Lin个sigma_i
# 分 [
# A B
# C D
# E1 E2
# ]
# 6块
# B为dΔli/dσi
def evaluate_d_delta_l_i_sigma_i(val_delta_l_li, val_sigma_i):
def get_lambdify_d_delta_l_i_sigma_i(_d_delta_l_i_sigma_i):
(
delta_l_i,
l_i,
@ -108,46 +92,37 @@ def evaluate_d_delta_l_i_sigma_i(val_delta_l_li, val_sigma_i):
beta_i
"""
)
val_list = []
for i in range(span_count):
val = d_delta_l_i_sigma_i.subs(
[
(delta_l_i, val_delta_l_li[i]),
(l_i, l_array[i]),
(lambda_i, lambda_i_array[i]),
(alpha, alpha_data),
(E, elastic_data),
(t_e, t_e_data),
(t_i, t_data),
(lambda_m, lambda_m_data),
(t_m, t_m_data),
(sigma_m, sigma_m_data),
(_sigma_i, val_sigma_i[i]),
(beta_i, math.atan(h_array[i] / l_array[i])),
]
)
manual_val = exp.manual_diff_delta_li_sigma_i(
h_array[i],
l_array[i],
lambda_m_data,
lambda_i_array[i],
val_sigma_i[i],
sigma_m_data,
alpha_data,
t_data,
t_e_data,
t_m_data,
elastic_data,
)
if math.fabs(val - manual_val) > 1e-5:
raise Exception("d_delta_l_i_sigma_i 自动和手动微分不匹配")
val_list.append(val)
return val_list
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,
)
# C为dσi1dΔli
# C只有n-1行
def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_sigma_i):
fx_d_delta_l_i_sigma_i = get_lambdify_d_delta_l_i_sigma_i(d_delta_l_i_sigma_i)
symbol_sigma_i1 = exp.fun_sigma_i1(delta_Li)
# d_sigma_i1_sigma_i = sympy.diff(symbol_sigma_i1, sigma_i)
# sigma_i1 = sympy.symbols("sigma_i1")
# d_sigma_i1_sigma_i1 = sympy.diff(symbol_sigma_i1, sigma_i)
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,
@ -179,6 +154,84 @@ def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_sigma_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)
# 一共2n个变量n个delta_Lin个sigma_i
# 分 [
# A B
# C D
# E1 E2
# ]
# 6块
# B为dΔli/dσi
def evaluate_d_delta_l_i_sigma_i(val_delta_l_li, val_sigma_i):
val_list = []
for i in range(span_count):
val = sympy.Float(
fx_d_delta_l_i_sigma_i(
val_delta_l_li[i],
l_array[i],
lambda_i_array[i],
alpha_data,
elastic_data,
t_e_data,
t_data,
lambda_m_data,
t_m_data,
sigma_m_data,
val_sigma_i[i],
math.atan(h_array[i] / l_array[i]),
)
)
manual_val = exp.manual_diff_delta_li_sigma_i(
h_array[i],
l_array[i],
lambda_m_data,
lambda_i_array[i],
val_sigma_i[i],
sigma_m_data,
alpha_data,
t_data,
t_e_data,
t_m_data,
elastic_data,
)
if math.fabs(val - manual_val) > 1e-5:
raise Exception("d_delta_l_i_sigma_i 自动和手动微分不匹配")
val_list.append(val)
return val_list
# C为dσi1dΔli
# C只有n-1行
def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_sigma_i):
row = []
for i in range(span_count - 1):
col = []
@ -186,36 +239,31 @@ def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_sigma_i):
if i < j:
col.append(0)
else:
_val = d_sigma_i1_d_l_i.subs(
[
(G_i, string_g / conductor_n),
(A, area_data),
(lambda_i, lambda_i_array[i]),
(lambda_i1, lambda_i_array[i + 1]),
(_sigma_i, val_sigma_i[i]),
(h_i, h_array[i]),
(h_i1, h_array[i + 1]),
(l_i, l_array[i]),
(l_i1, l_array[i + 1]),
(stringlen_i, string_length),
(_sigma_i1, val_sigma_i[i + 1]),
(beta_i, math.atan(h_array[i] / l_array[i])),
(beta_i1, math.atan(h_array[i + 1] / l_array[i + 1])),
]
)
_val_delta_l_li = list(val_delta_l_li)
_val_delta_l_li[-1] = _val_delta_l_li[j] # 把需要求导的Δlj放最后一个位置
_val_delta_l_li[j] = 0
# σi1的第i+1行至倒数第2行全部清0
for k in range(i + 1, len(_val_delta_l_li) - 1):
_val_delta_l_li[k] = 0
# if index == i:
# _val = _val.subs(li, val_delta_l_li[index])
# if index > i:
# _val = _val.subs(li, 0)
for index, li in enumerate(delta_Li):
_val = _val.subs(li, _val_delta_l_li[index])
pass
_val = sympy.Float(
fx_d_sigma_i1_d_l_i(
string_g / conductor_n,
area_data,
lambda_i_array[i],
lambda_i_array[i + 1],
val_sigma_i[i],
h_array[i],
h_array[i + 1],
l_array[i],
l_array[i + 1],
string_length,
val_sigma_i[i + 1],
math.atan(h_array[i] / l_array[i]),
math.atan(h_array[i + 1] / l_array[i + 1]),
*_val_delta_l_li
)
)
manual_val = exp.manual_diff_sigma_i1_d_l_i(
h_array[i],
l_array[i],
@ -267,11 +315,11 @@ 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 = [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)]
# 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:
@ -360,10 +408,10 @@ def solve():
b = sympy.Matrix(b_list)
# sympy.pprint(b)
x = sympy.linsolve((-A, b))
x_list = list(x)[0]
x_list = [float(_x) for _x in list(x)[0]]
abs_min = [math.fabs(_x) for _x in x_list]
abs_min.sort()
if abs_min[-1] < 1e-6:
if abs_min[-1] < 1e-5:
break
print("最大偏差{max_dx}".format(max_dx=abs_min[-1]))
# 更新变量
@ -373,9 +421,9 @@ def solve():
if loop >= loop_end:
print("不收敛")
else:
print(loop)
print(val_delta_li)
print(val_sigma_i)
print("经过{loop}次迭代收敛,最大偏差{bias}".format(loop=loop,bias=abs_min[-1]))
# print(val_delta_li)
# print(val_sigma_i)
verify(val_delta_li, val_sigma_i)

View File

@ -24,7 +24,7 @@ lambda_i_array = [
]
# 取400m代表档距下
sigma_m = 28517 / area # 架线时初伸长未释放前的最低点水平应力。单位N/mm2
span_count = 9 # 几个档距
span_count = 10 # 几个档距
# n个档距,n-1个直线塔
h_array = [
0,

12
main.py
View File

@ -132,10 +132,10 @@ def cal_loop():
b_i += _delta_l_i
length_i = string_length
g_i = string_g / data.conductor_n
h_i1 = h_array[i + 1]
l_i1 = l_array[i + 1]
if i < span_count - 1:
lambda_i1 = lambda_i_array[i + 1]
h_i1 = h_array[i + 1]
l_i1 = l_array[i + 1]
try:
sigma_i1 = fun_sigma_i1(
area,
@ -257,10 +257,10 @@ def verify(
print("!!!应力等式不满足")
return
print("等式满足。")
print('sigma')
print(sigma_array)
print('delta_li')
print(delta_l_i_array)
# print('sigma')
# print(sigma_array)
# print('delta_li')
# print(delta_l_i_array)
if __name__ == "__main__":