scipy 用python求解一个四阶边值问题

cgvd09ve  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(163)

我正在解一个四阶常微分方程

  • EI*(d4y/dx4)= -k*y

这是用于软土地基上的ODE的一个版本。
我的一阶方程组如下

  • y1' = y2
  • y2“= y3
  • y3“= y4
  • y4 ′ = -k*y1

和BC

  • y3(0)= y3(L)= 0
  • y4(0)= -F/(EI)
  • y4(L)= 0

和我的代码

from scipy.integrate import solve_bvp
import numpy as np

F = 300 #kN
EI = 20000 #kNm2
D = 1 #m
M_E = 45000 #kN/m2
k = 1.4*M_E/D #kN/m3
L = 10 #m

x = np.linspace(0,L,101)

p = np.array([k,EI,F])

print(p)

def fun(x, y, p):
    k = p[0]
    EI = p[1]
    return np.vstack((y[1],y[2],y[3],-k*y[0]/EI))

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

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

from scipy.integrate import solve_bvp

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

出现以下错误:

值错误:'bc'传回的形体应该是(7,),但实际上是(4,)。

你能帮助我理解我在这里做错了什么,错误意味着什么吗?
谢谢

xmd2e60i

xmd2e60i1#

因此,在对代码进行了一些修改之后,我设法使它工作起来。解决方案是:

from scipy.integrate import solve_bvp
import numpy as np

F = 100 #kN
D = 1 #m
M_E = 50 #MN/m2
E_cm = 33600 #MN/m2
L = 10 #m
nodes = 40

x = np.linspace(0,L,nodes)

k = 1.4*M_E/D #kN/m3
EI = E_cm*0.25*np.pi*(D*0.5)**4 #kNm2

c =k*D/EI

def fun(x, y):
    return np.vstack((y[1],y[2],y[3],-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)

y = res_a.sol(x)[0]*10**3
theta = res_a.sol(x)[1]*10**3
M = EI*res_a.sol(x)[2]
V = EI*res_a.sol(x)[3]

我希望这能帮助那些正在努力实现订单高于2的ODE的人。

相关问题