CalcStress 函数的数学公式表示
函数描述
CalcStress 函数用于从当前速度计算模型截面的弹性应力。该函数涉及多个物理量和计算步骤,包括轴向内力、剪切内力、正应力和剪切应力的计算。
参数说明
- Vcur:当前速度
- V0:初始速度
- Sn:截面面积
- Cn,X2str、Cs,X2str、SG,X2str:应力相关参数
- SG:空化数数组
- Cnx、Csy:力系数
- FlagStress:应力计算标志
- Jend:应力计算结束索引
- Xmstr:截面位置
- Lmm:模型长度(毫米)
- Lf:前体长度
- ρf、ρa:流体和空气密度
- Sm:截面面积
- TMkg:模型总质量
- Xc:质心位置
- Ic:惯性矩
- Rmstr:截面半径
- Rnmm:归一化半径
- CoBeg1、CoEnd1、CoFact1:应力集中因子(前体)
- CoBeg2、CoEnd2、CoFact2:应力集中因子(后体)
- FlagStress:截面应力计算标志
- X1,str:特定截面位置
数学公式表示
1. 空化数和力系数的选择
根据 FlagStress 的值选择空化数和力系数:
⎩⎨⎧SG,cur=SG,X2strCn,cur=Cn,X2strCs,cur=∣Cs,X2str∣SG,cur=SG[Jend]Cn,cur=CnxCs,cur=∣Csy∣if FlagStress=Trueotherwise
2. 轴向内力Nx的计算
Nx[0]=103⋅(Vcur⋅V0)2⋅Sn⋅Cn,cur⋅(1+SG,cur)/2(单位:牛顿)
Ax=TMkgNx[0]
Nx[i]=Nx[i−1]−103⋅Ax⋅(0.5⋅0.005⋅Lm⋅(ρ1⋅Sm[i−1]+ρ2⋅Sm[i]))for i=1,2,…,200
其中:
ρ1={ρfρaif Xmstr[i−1]⋅Lmm<Lfotherwise
ρ2={ρfρaif Xmstr[i]⋅Lmm<Lfotherwise
3. 正应力σx1的计算
σx1=10−6⋅SmNx(单位:MPa)
4. 剪切内力Qy的计算
Fs=103⋅(Vcur⋅V0)2⋅Sn⋅Cs,cur/2(单位:牛顿)
Ay=TMkgFs
Qy[i]=103⋅Ay⋅(0.5⋅0.005⋅Lm⋅(ρ1⋅Sm[i−1]+ρ2⋅Sm[i]))for i=1,2,…,200
5. 剪切应力τy的计算
τy=10−6⋅3⋅Sm4⋅Qy(单位:MPa)
6. 弯矩Mz的计算
Mz[i]=Xmstr[i]⋅Lm⋅Qy[i]−(Ay−IcFs⋅Lm⋅(1−Xc))⋅103⋅(0.5⋅0.005⋅Lm2⋅(ρ1⋅Xmstr[i−1]⋅Sm[i−1]+ρ2⋅Xmstr[i]⋅Sm[i]))for i=1,2,…,200
7. 正应力σx2的计算
σx2[i]=10−6⋅π⋅(Rmstr[i]⋅Rnmm/103)4/4Mz[i]⋅Rmstr[i]⋅Rnmm/103(单位:MPa)
8. 总正应力σx的计算
σx=σx1+σx2(单位:MPa)
9. 应力集中处理
σx[i]=⎩⎨⎧σx[i]⋅CoFact1σx[i]⋅CoFact2σx[i]if CoBeg1<Xmstr[i]⋅Lmm<CoEnd1if CoBeg2<Xmstr[i]⋅Lmm<CoEnd2otherwise
10. 最大正应力和最大剪切应力的计算
σmax=max(σx)
Xσmax=Xmstr[argmax(σx)]
τmax=max(∣τy∣)
Xτmax=Xmstr[argmax(∣τy∣)]
11. 特定截面的应力值
如果需要,计算特定截面的应力值:
QX1,str=interp(X1,str,Xmstr,Qy)
τX1,str=interp(X1,str,Xmstr,τy)
MX1,str=interp(X1,str,Xmstr,Mz)
σX1,str=interp(X1,str,Xmstr,σx)
Python代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
| def CalcStress(self, Vcur): """ 从当前速度计算模型截面的弹性应力。 参数: - Vcur: 当前速度 - V0: 初始速度 - Sn: 截面面积 - Cn_X2str, Cs_X2str, SG_X2str: 应力相关参数 - SG: 空化数数组 - Cnx, Csy: 力系数 - FlagStress: 应力计算标志 - Jend: 应力计算结束索引 - Xmstr: 截面位置 - Lmm: 模型长度 - Lf: 前体长度 - Rhof, Rhoa: 流体和空气密度 - Sm: 截面面积 - TMkg: 模型总质量 - Xc: 质心位置 - Ic: 惯性矩 - Rmstr: 截面半径 - Rnmm: 归一化半径 - CoBeg1, CoEnd1, CoFact1: 应力集中因子 - CoBeg2, CoEnd2, CoFact2: 应力集中因子 - FlagStress_section: 截面应力计算标志 - X1str: 特定截面位置 """ FlagStress = self.FlagStress SG_X2str = self.SG_X2str Cn_X2str = self.Cn_X2str Cs_X2str = self.Cs_X2str SG = self.SG Jend = self.Jend Cnx = self.Cnx Csy = self.Csy V0 = self.V0 Sn = self.Sn TMkg = self.TMkg Rhof = self.Rhof Xmstr = self.Xmstr Lmm = self.Lmm Lf = self.Lf Lm = self.Lm Rhoa = self.Rhoa Sm = self.Sm Xc = self.Xc Ic = self.Ic Rmstr = self.Rmstr Rnmm = self.Rnmm CoBeg1 = self.CoBeg1 CoEnd1 = self.CoEnd1 CoFact1 = self.CoFact1 CoBeg2 = self.CoBeg2 CoEnd2 = self.CoEnd2 CoFact2 = self.CoFact2 X1str = self.X1str
if FlagStress: SGcur = SG_X2str Cncur = Cn_X2str Cscur = abs(Cs_X2str) else: SGcur = SG[Jend] Cncur = Cnx Cscur = abs(Csy)
Nx = np.zeros(201) Nx[0] = 1e3 * (Vcur * V0) ** 2 * Sn * Cncur * (1 + SGcur) / 2 Ax = Nx[0] / TMkg
for i in range(1, 201): Rho1 = Rhof if Xmstr[i - 1] * Lmm < Lf else Rhoa Rho2 = Rhof if Xmstr[i] * Lmm < Lf else Rhoa work = 0.5 * 0.005 * Lm * (Rho1 * Sm[i - 1] + Rho2 * Sm[i]) Nx[i] = Nx[i - 1] - 1e3 * Ax * work
SGx1 = 1e-6 * Nx / Sm
Fs = 1e3 * (Vcur * V0) ** 2 * Sn * Cscur / 2
Qy = np.zeros(201) Ay = Fs / TMkg Int1 = 0.0
for i in range(1, 201): Rho1 = Rhof if Xmstr[i - 1] * Lmm < Lf else Rhoa Rho2 = Rhof if Xmstr[i] * Lmm < Lf else Rhoa Int1 += 0.5 * 0.005 * Lm * (Rho1 * Sm[i - 1] + Rho2 * Sm[i]) Qy[i] = 1e3 * Ay * Int1
TAUy = 1e-6 * 4 * Qy / (3 * Sm)
Mz = np.zeros(201) Int2 = 0.0 Int3 = 0.0 work1 = Fs * Lm * (1 - Xc) / Ic
for i in range(1, 201): Rho1 = Rhof if Xmstr[i - 1] * Lmm < Lf else Rhoa Rho2 = Rhof if Xmstr[i] * Lmm < Lf else Rhoa Int2 += 0.5 * 0.005 * Lm ** 2 * (Rho1 * Xmstr[i - 1] * Sm[i - 1] + Rho2 * Xmstr[i] * Sm[i]) Int3 += 0.5 * 0.005 * Lm ** 3 * (Rho1 * Xmstr[i - 1] ** 2 * Sm[i - 1] + Rho2 * Xmstr[i] ** 2 * Sm[i]) Mz[i] = Xmstr[i] * Lm * Qy[i] - (Ay - work1 * Xc * Lm) * 1e3 * Int2 - work1 * 1e3 * Int3
SGx2 = np.zeros(201) for i in range(201): Rmm = Rmstr[i] * Rnmm / 1e3 Jz = np.pi * Rmm ** 4 / 4 SGx2[i] = 1e-6 * Mz[i] * Rmm / Jz
SGx = SGx1 + SGx2
for i in range(201): if CoBeg1 < Xmstr[i] * Lmm < CoEnd1: SGx[i] *= CoFact1 elif CoBeg2 < Xmstr[i] * Lmm < CoEnd2: SGx[i] *= CoFact2
SGmax = np.max(SGx) X_SGmax = Xmstr[np.argmax(SGx)]
TAUmax = np.max(np.abs(TAUy)) X_TAUmax = Xmstr[np.argmax(np.abs(TAUy))]
if FlagStress: Q_X1str = np.interp(X1str, Xmstr, Qy) TAU_X1str = np.interp(X1str, Xmstr, TAUy) M_X1str = np.interp(X1str, Xmstr, Mz) SG_X1str = np.interp(X1str, Xmstr, SGx)
self.Nx = Nx self.SGx1 = SGx1 self.Qy = Qy self.TAUy = TAUy self.Mz = Mz self.SGx2 = SGx2 self.SGx = SGx self.SGmax = SGmax self.X_SGmax = X_SGmax self.TAUmax = TAUmax self.X_TAUmax = X_TAUmax self.Q_X1str = Q_X1str self.TAU_X1str = TAU_X1str self.M_X1str = M_X1str self.SG_X1str = SG_X1str
|