为了加快速度,将symbol公式lambdify成普通python函数
This commit is contained in:
parent
2750267b94
commit
54f789e22d
|
|
@ -60,25 +60,9 @@ lambda_i_matrix = sympy.Matrix(lambda_i_array)
|
||||||
symbol_delta_l_i = exp.delta_li()
|
symbol_delta_l_i = exp.delta_li()
|
||||||
sigma_i = sympy.symbols("sigma_i")
|
sigma_i = sympy.symbols("sigma_i")
|
||||||
d_delta_l_i_sigma_i = sympy.diff(symbol_delta_l_i, 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_Li,n个sigma_i
|
def get_lambdify_d_delta_l_i_sigma_i(_d_delta_l_i_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):
|
|
||||||
(
|
(
|
||||||
delta_l_i,
|
delta_l_i,
|
||||||
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
|
beta_i
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
val_list = []
|
return sympy.lambdify(
|
||||||
for i in range(span_count):
|
(
|
||||||
val = d_delta_l_i_sigma_i.subs(
|
delta_l_i,
|
||||||
[
|
l_i,
|
||||||
(delta_l_i, val_delta_l_li[i]),
|
lambda_i,
|
||||||
(l_i, l_array[i]),
|
alpha,
|
||||||
(lambda_i, lambda_i_array[i]),
|
E,
|
||||||
(alpha, alpha_data),
|
t_e,
|
||||||
(E, elastic_data),
|
t_i,
|
||||||
(t_e, t_e_data),
|
lambda_m,
|
||||||
(t_i, t_data),
|
t_m,
|
||||||
(lambda_m, lambda_m_data),
|
sigma_m,
|
||||||
(t_m, t_m_data),
|
_sigma_i,
|
||||||
(sigma_m, sigma_m_data),
|
beta_i,
|
||||||
(_sigma_i, val_sigma_i[i]),
|
),
|
||||||
(beta_i, math.atan(h_array[i] / l_array[i])),
|
_d_delta_l_i_sigma_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
|
fx_d_delta_l_i_sigma_i = get_lambdify_d_delta_l_i_sigma_i(d_delta_l_i_sigma_i)
|
||||||
# C只有n-1行
|
|
||||||
def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_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,
|
G_i,
|
||||||
A,
|
A,
|
||||||
|
|
@ -179,6 +154,84 @@ def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_sigma_i):
|
||||||
beta_i1,
|
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_Li,n个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 = []
|
row = []
|
||||||
for i in range(span_count - 1):
|
for i in range(span_count - 1):
|
||||||
col = []
|
col = []
|
||||||
|
|
@ -186,36 +239,31 @@ def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_sigma_i):
|
||||||
if i < j:
|
if i < j:
|
||||||
col.append(0)
|
col.append(0)
|
||||||
else:
|
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 = list(val_delta_l_li)
|
||||||
_val_delta_l_li[-1] = _val_delta_l_li[j] # 把需要求导的Δlj放最后一个位置
|
_val_delta_l_li[-1] = _val_delta_l_li[j] # 把需要求导的Δlj放最后一个位置
|
||||||
_val_delta_l_li[j] = 0
|
_val_delta_l_li[j] = 0
|
||||||
# σi1的第i+1行至倒数第2行全部清0
|
# σi1的第i+1行至倒数第2行全部清0
|
||||||
for k in range(i + 1, len(_val_delta_l_li) - 1):
|
for k in range(i + 1, len(_val_delta_l_li) - 1):
|
||||||
_val_delta_l_li[k] = 0
|
_val_delta_l_li[k] = 0
|
||||||
# if index == i:
|
_val = sympy.Float(
|
||||||
# _val = _val.subs(li, val_delta_l_li[index])
|
fx_d_sigma_i1_d_l_i(
|
||||||
# if index > i:
|
string_g / conductor_n,
|
||||||
# _val = _val.subs(li, 0)
|
area_data,
|
||||||
for index, li in enumerate(delta_Li):
|
lambda_i_array[i],
|
||||||
_val = _val.subs(li, _val_delta_l_li[index])
|
lambda_i_array[i + 1],
|
||||||
pass
|
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(
|
manual_val = exp.manual_diff_sigma_i1_d_l_i(
|
||||||
h_array[i],
|
h_array[i],
|
||||||
l_array[i],
|
l_array[i],
|
||||||
|
|
@ -267,11 +315,11 @@ def evaluate_d_sigma_i1_d_delta_sigma_i(val_delta_li):
|
||||||
|
|
||||||
def solve():
|
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_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 = [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 = [sigma_m_data for _ in range(span_count)]
|
||||||
|
|
||||||
loop = 0
|
loop = 0
|
||||||
while True:
|
while True:
|
||||||
|
|
@ -360,10 +408,10 @@ def solve():
|
||||||
b = sympy.Matrix(b_list)
|
b = sympy.Matrix(b_list)
|
||||||
# sympy.pprint(b)
|
# sympy.pprint(b)
|
||||||
x = sympy.linsolve((-A, 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 = [math.fabs(_x) for _x in x_list]
|
||||||
abs_min.sort()
|
abs_min.sort()
|
||||||
if abs_min[-1] < 1e-6:
|
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]))
|
||||||
# 更新变量
|
# 更新变量
|
||||||
|
|
@ -373,9 +421,9 @@ def solve():
|
||||||
if loop >= loop_end:
|
if loop >= loop_end:
|
||||||
print("不收敛")
|
print("不收敛")
|
||||||
else:
|
else:
|
||||||
print(loop)
|
print("经过{loop}次迭代收敛,最大偏差{bias}".format(loop=loop,bias=abs_min[-1]))
|
||||||
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
2
data.py
2
data.py
|
|
@ -24,7 +24,7 @@ lambda_i_array = [
|
||||||
]
|
]
|
||||||
# 取400m代表档距下
|
# 取400m代表档距下
|
||||||
sigma_m = 28517 / area # 架线时,初伸长未释放前的最低点水平应力。单位N/mm2
|
sigma_m = 28517 / area # 架线时,初伸长未释放前的最低点水平应力。单位N/mm2
|
||||||
span_count = 9 # 几个档距
|
span_count = 10 # 几个档距
|
||||||
# n个档距,n-1个直线塔
|
# n个档距,n-1个直线塔
|
||||||
h_array = [
|
h_array = [
|
||||||
0,
|
0,
|
||||||
|
|
|
||||||
12
main.py
12
main.py
|
|
@ -132,10 +132,10 @@ def cal_loop():
|
||||||
b_i += _delta_l_i
|
b_i += _delta_l_i
|
||||||
length_i = string_length
|
length_i = string_length
|
||||||
g_i = string_g / data.conductor_n
|
g_i = string_g / data.conductor_n
|
||||||
h_i1 = h_array[i + 1]
|
|
||||||
l_i1 = l_array[i + 1]
|
|
||||||
if i < span_count - 1:
|
if i < span_count - 1:
|
||||||
lambda_i1 = lambda_i_array[i + 1]
|
lambda_i1 = lambda_i_array[i + 1]
|
||||||
|
h_i1 = h_array[i + 1]
|
||||||
|
l_i1 = l_array[i + 1]
|
||||||
try:
|
try:
|
||||||
sigma_i1 = fun_sigma_i1(
|
sigma_i1 = fun_sigma_i1(
|
||||||
area,
|
area,
|
||||||
|
|
@ -257,10 +257,10 @@ def verify(
|
||||||
print("!!!应力等式不满足")
|
print("!!!应力等式不满足")
|
||||||
return
|
return
|
||||||
print("等式满足。")
|
print("等式满足。")
|
||||||
print('sigma')
|
# print('sigma')
|
||||||
print(sigma_array)
|
# print(sigma_array)
|
||||||
print('delta_li')
|
# print('delta_li')
|
||||||
print(delta_l_i_array)
|
# print(delta_l_i_array)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue