Solving for eigenvalues of an equation system in ApproxFun.jl

I’m trying to solve an eigenvalue problem for a system of equations using ApproxFun; however I’m getting an implementation error ERROR: Implement Conversion from Chebyshev{Interval{:closed,:closed,Int64},Float64} to ApproxFunBase.UnsetSpace. I suspect that I’m just misformulating something as its the first time I’ve used the package - any tips? Not-working MWE below:

using ApproxFun

d = Interval(0,1000)
μ = 1e9
ρ = 1000.0

D = Derivative(d)
ω = 1.0

Bu = lneumann(d)
Bl = rdirichlet(d)

B = [Bu 0;
     Bl 0]

I = ones(d)

L = [0 I/μ;
     ρ*ω^2*I+D*μ*D 0]

λ, v = ApproxFun.eigs(B, L, 500,tolerance=1E-10)

You’ve defined I to be Fun, that is, its equivalent to Fun(1, d), so ApproxFun doesn’t understand what you want. It’s also probably a bad idea to overwrite I anyways. So I would do:

E = Operator(I,d)

L = [0 E/μ;
            ρ*ω^2*I+D*μ*D 0]

That said, you are trying to compute over a domain of size 1000 and so you’ll probably need 20_000 discretization size before you see anything, which may be too high for eigs which uses dense generalized eigenvalue solver. Using inverse iteration would be better.

1 Like

Thanks - for this type of problem you can normally have a good guess for the eigenvalue you want so that should help - is there some out-of-the-box support for inverse iteration in ApproxFun or is it implement yourself?

It’s pretty easy to implement, something like

μ = 0.1 # guess of eigenvalue
u = Fun(1, d) # initial guess of eigenvector
v = Fun(1, d) 
for _=1:100
   u,v = [B; L - μ*I] \ [0,0,u,v]
   n = norm(u)+norm(v)
   u /= n
   v /= n
end
1 Like