正确实现Python For循环:批量求解非对称截面梁的正应力值
问题描述
我目前需要温习Python相关知识,当前遇到的问题是无法将下述冗长代码改写为可返回数组结果的简单For循环。
我正在编写求解非对称截面梁正应力的代码,直接输出正确计算结果的代码实现难度不高,我也已经完成了该部分开发,但我明确可以使用For循环将现有代码大幅精简。
原始代码
import numpy as np Ixx = 5.6667 * 10**5 Iyy = 1.493 * 10**5 Ixy = - .8 * 10**5 x = 66.7 y = -50 Sy = np.array([400, 600, 800, 1000, 1200, -400, -800,-1000, -1200]) Sx = np.array([600, 600, 400, -400, -600, 600, 400, -400, 600]) Mx = -Sx * 1000 My = Sy * 1000 DEN = (Ixx * Iyy) - (Ixy**2) Sigma0 = (((((My[0] * Ixx) - (Mx[0]*Ixy)) * x) + ((Mx[0] * Iyy) - (My[0] * Ixy)) * y)) / DEN print(Sigma0, 'MPa') Sigma1 = (((((My[1] * Ixx) - (Mx[1]*Ixy)) * x) + ((Mx[1] * Iyy) - (My[1] * Ixy)) * y)) / DEN print(Sigma1, 'MPa') Sigma2 = (((((My[2] * Ixx) - (Mx[2]*Ixy)) * x) + ((Mx[2] * Iyy) - (My[2] * Ixy)) * y)) / DEN print(Sigma2, 'MPa') Sigma3 = (((((My[3] * Ixx) - (Mx[3]*Ixy)) * x) + ((Mx[3] * Iyy) - (My[3] * Ixy)) * y)) / DEN print(Sigma3, 'MPa') Sigma4 = (((((My[4] * Ixx) - (Mx[4]*Ixy)) * x) + ((Mx[4] * Iyy) - (My[4] * Ixy)) * y)) / DEN print(Sigma4, 'MPa') Sigma5 = (((((My[5] * Ixx) - (Mx[5]*Ixy)) * x) + ((Mx[5] * Iyy) - (My[5] * Ixy)) * y)) / DEN print(Sigma5, 'MPa') Sigma6 = (((((My[6] * Ixx) - (Mx[6]*Ixy)) * x) + ((Mx[6] * Iyy) - (My[6] * Ixy)) * y)) / DEN print(Sigma6, 'MPa') Sigma7 = (((((My[7] * Ixx) - (Mx[7]*Ixy)) * x) + ((Mx[7] * Iyy) - (My[7] * Ixy)) * y)) / DEN print(Sigma7, 'MPa') Sigma8 = (((((My[8] * Ixx) - (Mx[8]*Ixy)) * x) + ((Mx[8] * Iyy) - (My[8] * Ixy)) * y)) / DEN print(Sigma8, 'MPa')
尝试改写的For循环版本
def CalcStress(Ixx, Iyy, Ixy, Mx, My, x, y, DEN): n = My.shape[0] result = np.zeros_like(Mx) for i in range(0, n-1): result[i] = (((((My[i] * Ixx) - (Mx[i]*Ixy)) * x) + ((Mx[i] * Iyy) - (My[i] * Ixy)) * y)) / DEN return result
解决方案
你的代码存在两个核心问题:
- 循环范围错误:Python的
range是左闭右开区间,你写的range(0, n-1)只会遍历到索引n-2,会漏掉最后一个元素,直接改成range(n)即可覆盖所有0到n-1的索引。 - 函数仅定义未调用:你只是声明了
CalcStress函数,没有主动执行它,也没有打印返回结果,自然不会有输出。
修正后的循环实现
def CalcStress(Ixx, Iyy, Ixy, Mx, My, x, y, DEN): n = My.shape[0] result = np.zeros_like(Mx) # 修正循环范围 for i in range(n): result[i] = (((((My[i] * Ixx) - (Mx[i]*Ixy)) * x) + ((Mx[i] * Iyy) - (My[i] * Ixy)) * y)) / DEN return result # 调用函数并打印结果 stress_result = CalcStress(Ixx, Iyy, Ixy, Mx, My, x, y, DEN) for idx, sigma in enumerate(stress_result): print(f"Sigma{idx}: {sigma} MPa")
更高效的NumPy向量化实现(无需显式写循环)
NumPy数组原生支持广播运算,可以直接对整个数组做计算,省略手动写循环的步骤,代码更简洁运行效率也更高:
stress_result = ((((My * Ixx - Mx * Ixy) * x) + ((Mx * Iyy - My * Ixy) * y))) / DEN # 批量打印结果 for idx, sigma in enumerate(stress_result): print(f"Sigma{idx}: {sigma} MPa")
内容的提问来源于stack exchange,提问作者Student01
相关产品推荐
相关产品推荐

