3

I want to demonstrate FourierTransform in a lecture. However if you give FourierTransform a differential equation it does not know about linearity and just returns the answer.

e = x''[t] + 2 z w0 x'[t] + w0^2 x[t] == g[t];
FourierTransform[e, t, w]

enter image description here

Which is not much help. Fortunately, @xzczd has developed this shell to provide standard rules. This is implemented by

ClearAll[FT];
FT[(h : List | Plus | Equal)[a__], t_, w_] := FT[#, t, w] & /@ h[a]
FT[a_ b_, t_, w_] /; FreeQ[b, Alternatives @@ t] := b FT[a, t, w]
FT[a_, t_, w_] := FourierTransform[a, t, w]

This now works on the differential equation thus

FT[e, t, w]

enter image description here

However I would like to take this one step further by using the convention that lower case letters in the time domain give rise to capital letters in the frequency domain. I can do this for specific cases using replacement rules as follows.

ClearAll[FT];
FT[(h : List | Plus | Equal)[a__], t_, w_] := FT[#, t, w] & /@ h[a]
FT[a_ b_, t_, w_] /; FreeQ[b, Alternatives @@ t] := b FT[a, t, w]
FT[a_, t_, w_] := 
 FourierTransform[a, t, w] /. {FourierTransform[x[t], t, w] -> X[w], 
   FourierTransform[g[t], t, w] -> G[w]}

This gives the form I want

sol = FT[e, t, w]

(* -w^2 X[w] + w0^2 X[w] - 2 I w w0 z X[w] == G[w] *)

One can now do further operations such as

Solve[sol, X[w]]

(* {{X[w] -> -(G[w]/(w^2 - w0^2 + 2 I w w0 z))}}*)

However, it is specific to the symbols of x[t] and g[t] I have implimented. Can this be done so that any lower case letter, e.g. a in the form FourierTransform[a[t], t, w] goes to A[w]?

Hugh
  • 16,387
  • 3
  • 31
  • 83
  • Would something like this work? FourierTransform[op_[t_], t_, w_] :> Symbol@*Capitalize@*ToString@*op@w, in place of {FourierTransform[x[t], t, w] -> X[w], FourierTransform[g[t], t, w] -> G[w]}? If so, I'll write an answer. – march Nov 28 '23 at 16:36
  • @march I Can' get it to work. I get a RuleDelayed error if I apply it as a rule. Would a Format statement work? – Hugh Nov 28 '23 at 17:01
  • @march If I write it as {FourierTransform[op_[t_], t_, w_] :> Symbol[Capitalize[ToString[op]]][w]} then it gives a warning but works. Please post your answer. – Hugh Nov 28 '23 at 17:17
  • Just to compare. e = x''[t] + 2 z w0 x'[t] + w0^2 x[t] == g[t]; LaplaceTransform[e, t, w] results in w^2 LaplaceTransform[x[t], t, w] + w0^2 LaplaceTransform[x[t], t, w] + 2 w0 z (w LaplaceTransform[x[t], t, w] - x[0]) - w x[0] - Derivative[1][x][0] == LaplaceTransform[g[t], t, w]. As far as I know it, LaplaceTransfom is more often used for solving linear ODEs. – user64494 Nov 28 '23 at 18:11
  • @user64494 I agree the Laplace transform is much better for symbolic work with ODEs. However, I am starting with the Fourier transform and moving towards numerical Laplace transforms. So there is a logic to my needs. – Hugh Nov 28 '23 at 18:27

1 Answers1

4

To create a replacement rule that works in general, we use the String function Capitalize, like so:

FourierTransform[op_[t_], t_, w_] :> (Symbol@Capitalize@ToString@op)@w
march
  • 23,399
  • 2
  • 44
  • 100