Hello, I am confused by `ApproxFun.TensorSpace`. I understand the following.
dom1, dom2 = Fourier(), Chebyshev() dom = dom1 ⊗ dom2 @assert TensorSpace(Fourier(), Chebyshev()) == dom1 ⊗ dom2 d1, d2 = Derivative(dom1), Derivative(dom2) @assert Derivative(dom1, 1) == Derivative(dom1) Here are the parts I do not understand: 1) Why doesn't the following evaluate to either error or 0? `dom1` is a single variable space Derivative(dom1, 2) * Fun([0,0,1], dom1) 2) Why isn't this statement true? `d1` is the partial derivative with respect to the first variable of `dom` Derivative(dom1) ⊗ I == Derivative(dom, 1) # --> false 3) Sorry for the dumb question but what is `Derivative(dom)`? Is `Derivative(dom)==Derivative(dom, 1)`? It looks like the following is true for all `f` (Derivative(dom1) ⊗ I) * f == Derivative(dom) * f == Derivative(dom, 1) * f # --> true whose first part seems to contradict 2). It looks like negation of derivative for the tensor space is not defined: (-Derivative(dom1)) * Fun([0,0,1],dom1) # valid expression for single variable function (-Derivative(dom)) * Fun([0,0,1],dom) # invalid expression for the tensor space Also, I would like to define the divergence and I expect div rot = 0 identically. I fail to define \partial_1\partial_2 but \partial_2\partial_1 works stream_fun = Fun(randn(5), dom) jϕ = Derivative(dom, 2) * stream_fun jz = Derivative(dom, 1) * stream_fun #Derivative(dom, 1) * jϕ # ∂_1∂_2(stream_fun) --> error Derivative(dom, 2) * jz # ∂_2∂_1(stream_fun) --> OK Last: `ApproxFun.transform(dom, y)` changes the values of `y` invalidating the convention about functions modifying its arguments. michele