1

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:

  1. 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]])
  1. 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)

  1. at this point my idea, I use scipy.integrate.solve_bvp to 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 ?

GMV871
  • 33
  • 3

1 Answers1

1

As mentioned by @MaximUmansky, you are, probably, better using a discretization method such as (see this answer):

Finite differences are really simple to understand as discretization technique but the boundary conditions get messy really fast, particularly for your higher order case.

I would suggest to go with the Finite Element Method. If you insist in using the shooting method, you could check this answer.

nicoguaro
  • 8,500
  • 6
  • 23
  • 49