Hello, I was playing around with the poisson equation example and wonder if I could replace the RHS $f$ with something like $\delta (x) \delta (y)$. I tried to construct the RHS like this:
fx = KroneckerDelta()
fy = KroneckerDelta()
f = Fun((x,y) -> fx(x) * fy(y))
But I got the error that ERROR: MethodError: no method matching isless(::Int64, ::Nothing)
. What is the proper way for me to do that? Thanks in advance!
I’m trying to implement something like this FAQ example,
S = Chebyshev(1..2);
p = points(S,20); # the default grid
v = exp.(p); # values at the default grid
f = Fun(S,ApproxFun.transform(S,v));
but multi-variate (2D tensor Chebyshev will do). The canonical thing,
S = Chebyshev((1..2)^2)
p = points(S, 20)
errors. Of course I could just construct the points via tensor products, but then I’m unsure how to use the ApproxFun.transform(S,v)
correctly. Is this documented somewhere? Is there an example I can look at?
Basically, I just want to freeze the polynomial degree, rather than prescribe a solver tolerance.
ApproxFun
to evaluate the basis functions...
ApproxFun
might be useful. I noticed e.g. that restricting the degree in \
rather than the tolerance throws warnings even if it is intended. By “manual mode” I mean non-adaptive.
julia (v1.2)> f = Fun(cos);
julia (v1.2)> f(.1)
0.9950041652780257
julia (v1.2)> f(.1 + .1im)
0.0
julia (v1.2)> f(.1 + .0im)
0.9950041652780257 + 0.0im
julia (v1.2)> g = Fun(Chebyshev(), randn(Complex{Float64}, 20));
julia (v1.2)> g(.1)
2.1013219596855888 - 0.11052912191219874im
julia (v1.2)> g(.1 + .1im)
0.0 + 0.0im
julia (v1.2)> cos(.1 + .1im)
0.9999833333373015 - 0.00999998888888977im
Circle
or Segment
extrapolate(f,x)
in ApproxFun if you wish
using ApproxFun, Plots, LinearAlgebra
const c₀ = 3.0*10^8
d = Circle(0.0, 1.0, true) # Defines a circle
Δ = Laplacian(d) # Represent the Laplacian
f = ones(∂(d)) # one at the boundary
ω = Interval(0.0..10.0^9)
k = ω/c₀
u = \([Dirichlet(d); Δ+k*I], [f;0.]; # Solve the PDE
tolerance=1E-5)
surface(u) # Surface plot
I get the error 'Implement Laplacian(Laurant(:clock:), 1)'
When looking in to the code for ApproxFun, i can find no reference to the laplacian, only a confusing macro for implementing general derivative operators.
Where would I go to work out how to implement new Operators?
I was also wondering if it was yet possible to build spaces of arbitrary dimension to solve 3D PDEs, possibly with extra non spatial dimensions to represent free parameters
Disk()
? That sort of existed at one point but the code is crusty. We do have a version in MultivariateOrthogonalPolynomials.jl which uses @MikaelSlevinsky’s awesome FastTransform to do function approximation on the disk, but there’s no build script for that