#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 с более простыми функциями.