常微分方程的特征值问题

计算科学 特征值 scipy
2021-12-15 07:05:45

我正在尝试计算悬臂梁的自然频率。Euler-Bernoulli 方程简化为以下问题:

v=λv,with ,v(0)=0,v(0)=0,v(1)=0,v(1)=0

其中上标对应于推导。这些是获得解决方案的步骤:

  1. 将问题简化为一阶微分方程组

v=v1v1=v2v2=v3v3=λv
边界条件为 2) 用python写系统(对应
v(0)=0v1(0)=0v2(1)=0v3(1)=0
kλ

def fun(x, y):
    return np.vstack((y[1],y[2],y[3], k*y[0]))
def bc(ya, yb):
    return np.array([ya[0], ya[1],yb[2],yb[3]])
  1. 定义网格和初始条件
x = np.linspace(0, 1, 100)

y_0 = np.zeros((4, x.size))
y_0[0]=np.sinh(x)
y_0[1]=np.cosh(x)
y_0[2]=-np.sinh(x)
y_0[3]=-np.cosh(x)
  1. 在这一点上我的想法,我scipy.integrate.solve_bvp 用来解决改变参数的边界值问题:k
k_list=[1.80,1.81,1.82,1.83,1.84,1.85]    
for k in k_list:    
    soly= solve_bvp(fun, bc, x, y_b)
    print(soly.status)
    y_plot = soly.sol(x)[0]
    plt.plot(x, y_plot, label='y_b')

soly.sol并将等于的值作为右特征值,但是,对于前面的代码,我获得了 中所有值的解0k_list

即使我实现了一个拍摄方法,这是检查我是否得到正确的特征值的正确方法?

1个回答

正如@MaximUmansky 所提到的,您可能会更好地使用离散化方法,例如(请参阅此答案):

有限差分非常容易理解为离散化技术,但边界条件很快就会变得混乱,特别是对于您的高阶情况。

我建议使用有限元方法。如果您坚持使用拍摄方法,您可以查看此答案