Scipysolve_bvp() меняет размер массива во время итерацииPython

Программы на Python
Ответить
Anonymous
 Scipysolve_bvp() меняет размер массива во время итерации

Сообщение Anonymous »

Я пытаюсь решить ОДУ 4-го порядка для балки на упругом основании. Я применяю эту задачу к свае с боковой нагрузкой, которая заделана в несколько слоев почвы, которые можно указать в коде. Массив c содержит параметры жесткости системы, которые мне нужно поэлементно умножить на y[0].

Однако в какой-то момент в исходном коде появляется проблема y[0] становится короче на 1 элемент, и я получаю ошибка:
ValueError: operands could not be broadcast together with shapes (40,) (39,)

Кто-нибудь знает, как это исправить? Я попробовал добавить
if c.size < y[0].size:
np.delete(c,-1)

прямо перед оператором return в fun(x,y), но безуспешно.

# ODE-Solver ---------------------------------------------------

from scipy.integrate import solve_bvp
import numpy as np

#Input ---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*

layers = [2,2,6] #m
M_Es = (10**3)*[45,20,60] #MN/m2

E_c = 33.6*10**6

F = 1000 #kN
D = 1 #m
nodes = 40

#---------------------------------------------------

#total length of the pile:
L = sum(layers) #m

#x-coordinates of the pile
x = np.linspace(0,L,nodes)

#Empty arr. for soil's compression modulus:
M_E = np.zeros(nodes)

#soil layer boundaries' depths:
depth = np.zeros(len(layers)+1)

for i in range(1,len(depth)):
depth = sum(layers[:i])

i=0

#assign M_E to the nodes of the current soil layer "j"
#while x lies between two boundaries assign the i-th value in "M_Es" array
for j in range(len(depth)-1):
while x >= sum_layers[j] and x < sum_layers[j+1]:
M_E = M_Es[j]
i += 1

#calculate the spring stiffness of the soil "k_sh" and the flexural rigidity of the pile "EI"
k_sh = 1.4*M_E/D #kN/m3
EI = E_c*0.25*np.pi*(D*0.5)**4 #kNm2

c = k_sh*D/(EI)

def fun(x, y):
return np.vstack((y[1],y[2],y[3],np.multiply(-c,y[0])))

def bc(ya, yb):
return np.array([ya[2], yb[2], ya[3]+F/EI, yb[3]])

y_a = np.zeros((4, x.size))

res_a = solve_bvp(fun, bc, x, y_a)


Подробнее здесь: https://stackoverflow.com/questions/739 ... -iteration
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»