正确实现For循环

2024-10-06 12:19:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在需要复习一下我的python。。。出于某种原因,我在将这段冗长的代码转换为返回数组中的值的简单for循环时遇到了麻烦

我正在创建一个代码来解决非对称横截面梁的直接应力。编写正确的答案并不难,我也没有问题,但我知道我可以利用for循环将代码减少到几行

以下是我编写的代码:

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课是大约两年前,我正试图通过编写我知道答案的简单压力问题来复习它。似乎是一个简单的问题,我错过了,但似乎找不到什么。提前感谢您的帮助


Tags: 答案代码formynpresultarrayprint
3条回答

我更喜欢可读性更强的内容:

def calc_stress(Ixx, Iyy, Ixy, Mx, My, x, y, DEN):
    out = []
    for xx, yy in zip(Mx, My):
        pt1 = x * (yy * Ixx - xx * Ixy)
        pt2 = y * (xx * Iyy - yy * Ixy)
        out += [(pt1 + pt2) / DEN]
    return out

res = calc_stress(Ixx, Iyy, Ixy, Mx, My, x, y, DEN)
[print(f"{x} MPa") for x in res]

输出:

189.19988203646955 MPa
275.6327039784023 MPa
356.620779869467 MPa
...
-443.05360181139974 MPa
-502.2626934989924 MPa

使用原始数据索引打印输出的版本:

[print(f"{idx}: {x} MPa") for idx, x in enumerate(aaa)]

输出:

0: 189.19988203646955 MPa
1: 275.6327039784023 MPa
2: 356.620779869467 MPa
...
7: -443.05360181139974 MPa
8: -502.2626934989924 MPa

您可以将其用于循环:

for ix in range(len(Sy)):

    Sigma = (((((My[ix] * Ixx) - (Mx[ix]*Ixy)) * x) + ((Mx[ix] * Iyy) - (My[ix] * Ixy)) * y)) / DEN
    print(Sigma, 'MPa')

或者,如果要使用该函数,则必须调用该函数,并且可以交替使用:

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

xy = CalcStress(Ixx, Iyy, Ixy, Mx, My, x, y, DEN)

for element in xy:
    print (element)

我最终发现了问题所在。当试图打印CalcStress时,我没有包含参数。我现在做的这段代码给出了我想要的数组中的答案

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)

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):
        result[i] = (((((My[i] * Ixx) - (Mx[i]*Ixy)) * x) + ((Mx[i] * Iyy) - (My[i] * Ixy)) * y)) / DEN

    return result
        
print(CalcStress(Ixx, Iyy, Ixy, Mx, My, x, y, DEN))

结果=[189275356421502,-156,-334,-443,-502]

相关问题 更多 >