I am trying to compute the natural frequency of a cantilevered beam. The Euler-Bernoulli equation reduces to the following problem : $$ v''''=\lambda v, \text{with }, v(0)=0, v'(0)=0, v'''(1)=0,v''(1)=0 $$
where superscript $'$ correspond to derivation. These are the steps to obtain a solution:
- reduce the problem to a system of first order differential equation
$$
v'=v_1\\
v_1'=v_2\\
v_2'=v_3\\
v_3'=\lambda v
$$
with the boundary conditions
$$
v(0)=0\\
v_1(0)=0\\
v_2(1)=0\\
v_3(1)=0
$$
2) write the system in python (kcorrespond to $\lambda$)
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]])
- define grid and initial conditions
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)
- at this point my idea, I use
scipy.integrate.solve_bvpto solve the boundary value problem varying the parameter $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')
And take as the right eigenvalue the value for which soly.sol is equal to $0$, but, for the previous code, I obtain a solution for all the value in k_list.
Even if I implement a shooting method, which is the right method to check to see if I got the right eigenvalue ?