Compare commits

...

7 Commits

Author SHA1 Message Date
n3040
ba4668e97b 准备修改成通用程序。 2022-08-22 16:09:08 +08:00
dbbba95996 1.重新整理代码
2.收敛条件强制让不等式满足要求
2020-12-14 16:34:23 +08:00
c8c245e717 利用numpy增强数值稳定性 2020-12-14 16:05:17 +08:00
9d4b1e312a 修复indent 2020-12-14 14:51:44 +08:00
54f789e22d 为了加快速度,将symbol公式lambdify成普通python函数 2020-12-14 14:50:55 +08:00
2750267b94 1.增加与手动微分公式比较。
2.牛顿法对初值比较敏感。
2020-12-14 10:31:29 +08:00
b4db8b612e 在自动微分中引用等式检查。 2020-12-13 17:07:53 +08:00
5 changed files with 431 additions and 213 deletions

3
.gitignore vendored
View File

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

View File

@@ -1,9 +1,13 @@
# 利用自动微分计算 # 利用自动微分计算
import datetime
from typing import List
import sympy import sympy
import data import data
import exp import exp
import math import math
import main import main
import numpy as np
sympy.init_printing() sympy.init_printing()
# h_i 悬点高差 # h_i 悬点高差
@@ -19,16 +23,6 @@ sympy.init_printing()
# _t_m 导线架线时时导线温度 单位°C # _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"),
)
# sigma_i = sympy.symbols("sigma_i:{span_count}".format(span_count=data.span_count))
loop_end = data.loop_end # 最大循环次数 loop_end = data.loop_end # 最大循环次数
# 架线时的状态 # 架线时的状态
# 取外过无风 # 取外过无风
@@ -37,37 +31,37 @@ string_g = data.string_g # 串重 单位N
t_m_data = data.t_m # 导线架设时的气温。单位°C t_m_data = data.t_m # 导线架设时的气温。单位°C
t_e_data = data.t_e # 架线时考虑初伸长的降温取正值。单位°C t_e_data = data.t_e # 架线时考虑初伸长的降温取正值。单位°C
alpha_data = data.alpha # 导线膨胀系数 1/°C alpha_data = data.alpha # 导线膨胀系数 1/°C
elastic = data.elastic # 弹性系数 N/mm2 elastic_data = data.elastic # 弹性系数 N/mm2
area = data.area # 导线面积 mm2 area_data = data.area # 导线面积 mm2
lambda_m_data = data.lambda_m # 导线比载 N/(m.mm) lambda_m_data = data.lambda_m # 导线比载 N/(m.mm)
sigma_m_data = data.sigma_m # 架线时初伸长未释放前的最低点水平应力。单位N/mm2 sigma_m_data = data.sigma_m # 架线时初伸长未释放前的最低点水平应力。单位N/mm2
span_count = data.span_count # 几个档距 span_count = data.span_count # 几个档距
# n个档距,n-1个直线塔 # n个档距,n-1个直线塔
h_array = data.h_array h_array = data.h_array
hi_matrix = sympy.Matrix(h_array)
# sympy.pprint(hi_matrix)
l_array = data.l_array l_array = data.l_array
l_matrix = sympy.Matrix(l_array)
t_data = data.t t_data = data.t
conductor_n = data.conductor_n conductor_n = data.conductor_n
# ti_matrix = sympy.Matrix(t_array)
lambda_i_array = data.lambda_i_array lambda_i_array = data.lambda_i_array
# TODO: 暂时没考虑荷载变化 # TODO: 暂时没考虑荷载变化
lambda_m_matrix = sympy.Matrix(lambda_i_array)
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)
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) 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") delta_Li_i = sympy.symbols("delta_Li_i")
d_sigma_i1_d_l_i = sympy.diff(symbol_sigma_i1, delta_Li_i) d_sigma_i1_d_l_i = sympy.diff(symbol_sigma_i1, delta_Li_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_Lin个sigma_i # 一共2n个变量n个delta_Lin个sigma_i
# 分 [ # 分 [
# A B # A B
@@ -79,53 +73,40 @@ d_sigma_i1_d_l_i = sympy.diff(symbol_sigma_i1, delta_Li_i)
# B为dΔli/dσi # B为dΔli/dσi
def evaluate_d_delta_l_i_sigma_i(val_delta_l_li, val_sigma_i): def evaluate_d_delta_l_i_sigma_i(val_delta_l_li, val_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
"""
)
val_list = [] val_list = []
for i in range(span_count): for i in range(span_count):
val = d_delta_l_i_sigma_i.subs( val = sympy.Float(
[ fx_d_delta_l_i_sigma_i(
(delta_l_i, val_delta_l_li[i]), val_delta_l_li[i],
(l_i, l_array[i]), l_array[i],
(lambda_i, lambda_i_array[i]), lambda_i_array[i],
(alpha, alpha_data), alpha_data,
(E, elastic), elastic_data,
(t_e, t_e_data), t_e_data,
(t_i, t_data), t_data,
(lambda_m, lambda_m_data), lambda_m_data,
(t_m, t_m_data), t_m_data,
(sigma_m, sigma_m_data), sigma_m_data,
(_sigma_i, val_sigma_i[i]), val_sigma_i[i],
(beta_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(
# 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) val_list.append(val)
return val_list return val_list
@@ -133,37 +114,7 @@ def evaluate_d_delta_l_i_sigma_i(val_delta_l_li, val_sigma_i):
# C为dσi1dΔli # C为dσi1dΔli
# C只有n-1行 # C只有n-1行
def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_sigma_i): def evaluate_d_sigma_i1_d_delta_l_i(val_delta_l_li, val_sigma_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,
"""
)
row = [] row = []
for i in range(span_count - 1): for i in range(span_count - 1):
col = [] col = []
@@ -171,36 +122,46 @@ 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),
(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(
# h_array[i],
# l_array[i],
# h_array[i + 1],
# l_array[i + 1],
# string_g / conductor_n,
# area_data,
# lambda_i_array[i],
# lambda_i_array[i + 1],
# val_sigma_i[i],
# string_length,
# math.fsum(val_delta_l_li[0 : i + 1]),
# )
# if math.fabs(manual_val - _val) > 1e-5:
# 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)
@@ -236,17 +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 i in range(span_count)] val_delta_li = [data.string_length / (span_count + 1) for _ in range(span_count)]
# val_delta_li = [0.15864687475316822, -0.1935189734784845, 0.03478489898855073]
val_sigma_i = [sigma_m_data for _ in range(span_count)] val_sigma_i = [sigma_m_data for _ in range(span_count)]
# val_sigma_i = [175.38451579479482, 176.01015153076614, 175.88355419459572]
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
@@ -268,7 +226,6 @@ def solve():
A = sympy.Matrix([[M_A, M_B], [M_C, M_D], [M_E]]) A = sympy.Matrix([[M_A, M_B], [M_C, M_D], [M_E]])
fx_delta_Li = [] fx_delta_Li = []
fx_sigma_i1 = [] fx_sigma_i1 = []
b_i = 0
for i in range(span_count): for i in range(span_count):
fx_delta_Li.append( fx_delta_Li.append(
val_delta_li[i] val_delta_li[i]
@@ -277,7 +234,7 @@ def solve():
l_array[i], l_array[i],
lambda_i_array[i], lambda_i_array[i],
alpha_data, alpha_data,
elastic, elastic_data,
t_e_data, t_e_data,
t_data, t_data,
val_sigma_i[i], val_sigma_i[i],
@@ -290,7 +247,7 @@ def solve():
fx_sigma_i1.append( fx_sigma_i1.append(
val_sigma_i[i + 1] val_sigma_i[i + 1]
- main.fun_sigma_i1( - main.fun_sigma_i1(
area, area_data,
val_sigma_i[i], val_sigma_i[i],
math.fsum(val_delta_li[0 : i + 1]), math.fsum(val_delta_li[0 : i + 1]),
string_length, string_length,
@@ -303,39 +260,23 @@ def solve():
lambda_i_array[i + 1], lambda_i_array[i + 1],
) )
) )
# lambda_i1 = lambda_i_array[i + 1]
# h_i1 = h_array[i + 1]
# l_i1 = l_array[i + 1]
# h_i = h_array[i]
# l_i = l_array[i]
# beta_i = math.atan(h_i / l_i)
# beta_i1 = math.atan(h_i1 / l_i1)
# w_i = (
# lambda_i_array[i] * l_array[i] / 2 / math.cos(beta_i)
# + val_sigma_i[i] * h_i / l_i
# + (lambda_i1 * l_i1 / 2 / math.cos(beta_i1) - val_sigma_i[i+1] * h_i1 / l_i1)
# )
# b_i += val_delta_li[i]
# # 新版大手册p329 (5-61) 最上方公式
# right_equ = val_sigma_i[i] + b_i / math.sqrt(string_length ** 2 - b_i ** 2) * (
# string_g/conductor_n / 2 / area + w_i # string_g已在传入时考虑了导线分裂数
# )
fx_sum_Li = [math.fsum(val_delta_li)] fx_sum_Li = [math.fsum(val_delta_li)]
b_list = [] b_list = []
b_list.extend(fx_delta_Li) b_list.extend(fx_delta_Li)
b_list.extend(fx_sigma_i1) b_list.extend(fx_sigma_i1)
b_list.extend(fx_sum_Li) b_list.extend(fx_sum_Li)
b = sympy.Matrix(b_list) AA = np.array(A.tolist(), dtype=np.float64)
# sympy.pprint(b) b = np.array(b_list, dtype=np.float64)
x = sympy.linsolve((-A, b)) x = np.linalg.solve(-AA, b)
x_list = list(x)[0] x_list = x
abs_min = [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() 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]
@@ -343,10 +284,36 @@ 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)
endtime = datetime.datetime.now()
# print('执行时间{t}'.format(t=(endtime-starttime).microseconds/1000))
pass
def verify(val_delta_li, val_sigma_i):
main.verify(
area_data,
h_array,
l_array,
string_length,
string_g / conductor_n,
val_sigma_i,
val_delta_li,
lambda_i_array,
t_data,
alpha_data,
elastic_data,
t_e_data,
lambda_m_data,
t_m_data,
sigma_m_data,
1e-5,
)
solve() solve()
print("Finished.") print("Finished.")

123
data.py
View File

@@ -1,22 +1,117 @@
#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_m*0.9,lambda_m*1.3,lambda_m,lambda_m,lambda_m] lambda_i_array = [
14.7012 / area,
14.7012 / area,
14.7012 / area,
8.8007 / area,
14.7012 / area,
14.7012 / area,
14.7012 / area,
]
# 取400m代表档距下 # 取400m代表档距下
sigma_m = 28517 / area # 架线时初伸长未释放前的最低点水平应力。单位N/mm2 sigma_m = 17449 / area # 架线时初伸长未释放前的最低点水平应力。单位N/mm2
span_count = 3 # 几个档距 span_count = 7 # 几个档距
# n个档距,n-1个直线塔 # n个档距,n-1个直线塔
h_array = [0, 0, 0, 0, 0] h_array = [
l_array = [400, 300, 300, 500, 300] 0,
t = 15 0,
0,
0,
0,
0,
0,
]
l_array = [
703,
720,
587,
620,
539,
450,
611,
]
t = 40
epsilon = 1e-4 # 收敛判据 epsilon = 1e-4 # 收敛判据
conductor_n = 6 # 导线分裂数 conductor_n = 1 # 导线分裂数

161
exp.py
View File

@@ -27,7 +27,7 @@ def delta_li():
t_m, t_m,
sigma_m, sigma_m,
sigma_i, sigma_i,
beta_i beta_i,
) = sympy.symbols( ) = sympy.symbols(
""" """
delta_l_i, delta_l_i,
@@ -43,7 +43,6 @@ def delta_li():
sigma_i, sigma_i,
beta_i,""" beta_i,"""
) )
# beta_i = sympy.atan(h_i / l_i) # 高差角
_delta_li = delta_l_i - ( _delta_li = delta_l_i - (
l_i l_i
/ ((sympy.cos(beta_i) ** 2) * (1 + (lambda_i * l_i / sigma_i) ** 2 / 8)) / ((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) + alpha * (t_i + t_e - t_m)
) )
) )
# d_delta_li_sigma_i = sympy.diff(_delta_li, sigma_i)
return _delta_li return _delta_li
@@ -106,6 +104,7 @@ def fun_sigma_i1(delta_Li):
for f in delta_Li: for f in delta_Li:
_t += f _t += f
return _t return _t
_sigma_i1 = sigma_i1 - ( _sigma_i1 = sigma_i1 - (
( (
G_i / 2 / A # G_i传入时已考虑导线分裂数 G_i / 2 / A # G_i传入时已考虑导线分裂数
@@ -116,3 +115,159 @@ def fun_sigma_i1(delta_Li):
+ sigma_i / b_i() * sympy.sqrt(stringlen_i ** 2 - b_i() ** 2) + sigma_i / b_i() * sympy.sqrt(stringlen_i ** 2 - b_i() ** 2)
) / (sympy.sqrt(stringlen_i ** 2 - b_i() ** 2) / b_i() + h_i1 / l_i1) ) / (sympy.sqrt(stringlen_i ** 2 - b_i() ** 2) / b_i() + h_i1 / l_i1)
return _sigma_i1 return _sigma_i1
def manual_diff_delta_li_sigma_i(
h_i, l_i, lambda_m, lambda_i, sigma_i, sigma_m, alpha, t_i, t_e, t_m, E
):
beta_i = math.atan(h_i / l_i)
A = (
(l_i * math.cos(beta_i)) ** 2
/ 24
* ((lambda_m / sigma_m) ** 2 - (lambda_i / sigma_i) ** 2)
+ (sigma_i - sigma_m) / E / math.cos(beta_i)
+ alpha * (t_i + t_e - t_m)
)
B = 1 + (lambda_i * l_i / sigma_i) ** 2 / 8
dA_dsigma_i = ((l_i * math.cos(beta_i)) ** 2) / 24 * 2 * lambda_i ** 2 * (
sigma_i ** (-3)
) + 1 / E / math.cos(beta_i)
dB_dsigma_i = -2 * (lambda_i * l_i) ** 2 / 8 * (sigma_i ** (-3))
_t = -l_i / (math.cos(beta_i) ** 2) * (dA_dsigma_i * B - A * dB_dsigma_i) / (B ** 2)
return _t
def manual_diff_sigma_i1_d_l_i(
h_i, l_i, h_i1, l_i1, Gi, A, lambda_i, lambda_i1, sigma_i, stringlen, b_i
):
beta_i = math.atan(h_i / l_i)
beta_i1 = math.atan(h_i1 / l_i1)
A = (
Gi / 2 / A
+ 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 * ((stringlen ** 2 - b_i ** 2) ** 0.5)
)
B = ((stringlen ** 2 - b_i ** 2) ** 0.5) / b_i + h_i1 / l_i1
dA_d_delta_L1 = (
sigma_i
* (
-((stringlen ** 2 - b_i ** 2) ** -0.5) * (b_i ** 2)
- (stringlen ** 2 - b_i ** 2) ** 0.5
)
/ (b_i ** 2)
)
dB_d_delta_L1 = (
1
/ (b_i ** 2)
* (
-((stringlen ** 2 - b_i ** 2) ** -0.5) * (b_i ** 2)
- (stringlen ** 2 - b_i ** 2) ** 0.5
)
)
_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,
)

72
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 悬点档距
@@ -106,8 +107,8 @@ def cal_loop():
while True: while True:
b_i = 0 b_i = 0
# 一次增加0.1N # 一次增加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)] 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]
@@ -132,10 +133,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] if i < span_count - 1:
l_i1 = l_array[i + 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,
@@ -160,7 +161,9 @@ def cal_loop():
for i in range(span_count): for i in range(span_count):
print("{i}档导线应力为{tension}".format(i=i, tension=sigma_array[i])) print("{i}档导线应力为{tension}".format(i=i, tension=sigma_array[i]))
for i in range(span_count - 1): for i in range(span_count - 1):
print("{i}串偏移值为{bias}".format(i=i, bias=math.fsum(delta_l_i_array[0:i]))) print(
"{i}串偏移值为{bias}".format(i=i, bias=math.fsum(delta_l_i_array[0:i]))
)
verify( verify(
area, area,
h_array, h_array,
@@ -197,16 +200,20 @@ 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: 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:
print("偏移累加不等于0")
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]
_delta_l_i = delta_l_i_array[i] _delta_l_i = delta_l_i_array[i]
@@ -230,7 +237,7 @@ def verify(
) )
if math.fabs(cal_delta_l_i - _delta_l_i) > 1e-4: if math.fabs(cal_delta_l_i - _delta_l_i) > 1e-4:
print("!!!偏移等式不满足。") print("!!!偏移等式不满足。")
if i<len(delta_l_i_array)-1: if i < len(delta_l_i_array) - 1:
sigma_i1 = sigma_array[i + 1] sigma_i1 = sigma_array[i + 1]
left_equ = sigma_array[i + 1] left_equ = sigma_array[i + 1]
lambda_i1 = lambda_array[i + 1] lambda_i1 = lambda_array[i + 1]
@@ -244,35 +251,28 @@ def verify(
+ (lambda_i1 * l_i1 / 2 / math.cos(beta_i1) - sigma_i1 * h_i1 / l_i1) + (lambda_i1 * l_i1 / 2 / math.cos(beta_i1) - sigma_i1 * h_i1 / l_i1)
) )
b_i += delta_l_i_array[i] b_i += delta_l_i_array[i]
#新版大手册p329 (5-61) 最上方公式 # 新版大手册p329 (5-61) 最上方公式
right_equ = sigma_i + b_i / math.sqrt(string_length ** 2 - b_i ** 2) * ( right_equ = sigma_i + b_i / math.sqrt(string_length ** 2 - b_i ** 2) * (
string_g / 2 / area + w_i # string_g已在传入时考虑了导线分裂数 string_g / 2 / area + w_i # string_g已在传入时考虑了导线分裂数
) )
# TODO 等式允许误差是否可调? # TODO 等式允许误差是否可调?
if math.fabs(right_equ - left_equ) > 1e-4: if math.fabs(right_equ - left_equ) > epsilon:
print(math.fabs(right_equ - left_equ)) print(math.fabs(right_equ - left_equ))
print("!!!应力等式不满足") print("!!!应力等式不满足")
return return
print("等式满足。") print("等式满足。")
print("sigma")
print(np.array(sigma_array) * area)
print("delta_li")
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.")