Python — возврат функции для 2D-массива

#python #numpy

#python #numpy

Вопрос:

Я конвертирую старый код Matlab в скрипт Python, прежде чем потеряю доступ к своей лицензии Matlab.

Целью кода Python является написание сценария, который вычисляет оптимальную геометрию двутавровой балки с учетом заданных требований к усилию и расстояния от точки силовой нагрузки.

Когда функция ничего не возвращает и просто печатает ‘vals’ (т.Е. print(vals) ), Вывод показывает мне все возможные комбинации, которые желательны. Однако, когда я возвращаю массив vals (т.е. return vals ), Результат равен всего 0.0. Я не совсем понимаю, почему я не могу вернуть vals.

В идеале я хочу получить 2D-массив из всех возможных комбинаций val (это должен быть массив размером 980×980), а затем извлечь максимальное значение val с помощью другого вызова функции.

Это мой код:

 ## Defining the system inputs
sigma = 100 # Max stress not allowed to exceed (N/mm^2)
F = 100 * 10**3 # Force applied ( N)
dist = [100, 1000, 2000, 3000, 4000] # Distance from force applied (mm)

t = 10 # Thickness of I-beam (mm)
y = np.zeros(1000 - 2*t) # Pre-allocating vector with zeroes
h = np.arange(1, 1001 - 2*t, 1)  # Height of I-beam
w = np.arange(1, 1001 - 2*t, 1) # width of I-beam

tol = 2.00 # tolerance for the system (how close we want our desired shear modulus to be to the limit)


# Writing the IBeam function
def IBeam(sigma, F, t, h, w, dist, tol):
    M = F * dist # calculating moment
    zShear = M / sigma # calculating shear modulus based on given conditions

    # iterating through all combinations of height and width
    for i in range(0, len(h)): # iterating through the height vector
        for j in range(0, len(w)): # iterating through the width vector
            XSA = 2*t*w[j]   t*h[i] # calculating XSA for each h/w combination   
            Ix = ((t*h[i]**3)/12)   (w[j]/12)*((2*t h[i])**3 - h[i]**3) # calculating Ix for each h/w combination
            y = h[i]/2   t # calculating y for each h combination 

            zInt = Ix / y # calculating zInt for each Ix/y combination

            # Check to see if our zInt < zShear since this is not ideal
            if (zInt <= zShear):
                zInt = 0
            # Check to see if our zInt >= tol * zShear since this is not ideal    
            if (zInt >= tol * zShear):
                zInt = 0
            
            # Creating the relationship between zInt and XSA
            vals = zInt / XSA 
    # return vals
    return vals

# Calling the IBeam and max function
iBeamVals = IBeam(sigma, F, t, h, w, dist[0], tol)
print(iBeamVals)
 

Извиняюсь, если эти вопросы задавались ранее или в аналогичном объеме заранее.

Спасибо AJ

Комментарии:

1. «Когда функция ничего не возвращает и просто печатает «vals» (т.е. print (vals))» Если вы задаете вопрос относительно двух версий кода, пожалуйста, убедитесь, что точно ясно, каков полный код в каждом конкретном случае. Но в любом случае, похоже, что ваш код явно перебирает массив и использует отдельные элементы, что вызывает два вопроса: 1) Что, как вы надеетесь, Numpy сделает для вашего кода здесь? 2) Как вы ожидаете vals , что в конечном итоге будет содержаться массив, а не одно число — какая часть вашего кода, по вашему мнению, приведет к тому, что это произойдет?

2. Вы читали какой-либо учебник по использованию Numpy? Вы слышали термин broadcasting ? Знаете ли вы, например, что массивы Numpy позволяют вам умножать массив на числовое значение, а семантика заключается в том, что он умножает каждое значение по элементам?

3. Также: какова цель dist списка, если вы собираетесь использовать только один элемент из него?

4. Понимаете вы это или нет, похоже, что вопрос, который у вас на самом деле есть, больше похож на «Как мне использовать Numpy для применения формулы к нескольким комбинациям входных значений?» Существует несколько разных подходов к этому.

5. Повторяется ли ваш код matlab подобным образом? Как он возвращает значения для всех i, j? Я вижу ‘preallocate of y , но не индексированное присвоение ему. Внутри функции есть y= строка, но это всего лишь присвоение локальной переменной. Я думаю, вам нужно практиковать python с более простыми функциями.