MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Impedance Equation fit to Complex Data

  • To: mathgroup at smc.vnet.net
  • Subject: [mg86495] Re: Impedance Equation fit to Complex Data
  • From: Szabolcs <szhorvat at gmail.com>
  • Date: Wed, 12 Mar 2008 05:27:03 -0500 (EST)
  • References: <fr7opm$39a$1@smc.vnet.net>

On Mar 12, 6:13 am, AgustusBenja... at gmail.com wrote:
> Dear Group,
>
>    I'm trying to fit an equation to data using FindFit.  When I type
> in the equation and data and then FindFit, I get this:
>
> Z := [Omega]^(-(2 ArcTan[H/G])/[Pi]) (G - i H) + R
>
> Data := {{1.`, 2.658637`- 8.389573` i}, {1.5`,
>    1.784396`- 6.214955` i}, {2.5`,
>    1.656569`- 3.97147` i}, {3.5`,
>    1.633799`- 2.878841` i}, {5.5`,
>    1.357069`- 1.776964` i}, {6.5`,
>    1.259121`- 1.848249` i}, {8.5`,
>    1.105417`- 1.344566` i}, {9.5`,
>    1.119456`- 1.148945` i}, {11.5`,
>    1.082122`- 1.064767` i}, {14.5`,
>    1.015714`- 0.8684088` i}, {15.5`,
>    1.055329`- 0.664562` i}, {18.5`,
>    0.8675349`- 0.5107938` i}, {20.5`,
>    0.8968949`- 0.4148388` i}}
>
> FindFit[Data, Z, {R, G, H}, \[Omega]]
>
> FindFit::nrlnum: The function value {-0.658637+7.38957 \
> \[ImaginaryI],0.0321006+5.39846 \[ImaginaryI],-0.0241135+3.33901 \
> \[ImaginaryI],<<5>>,0.212762+0.769883 \[ImaginaryI],0.246899+0.605796
> \
> \[ImaginaryI],<<3>>} is not a list of real numbers with dimensions \
> {13} at {R,G,H} = {1.,1.,1.}. >>
>
> Why?!?!?  Why can't FindFit handle this?  What's wrong with it not
> being a list of real numbers?  I'm pulling my hair out.  I've looked
> at others' suggestions for similar problems and they don't work for
> this problem.  Am I out of my mind?  Does anyone have a suggeston?


I was curious about this, so I searched MathGroup, and the suggested
solution appears to be to use a "real-valued" norm function instead:

FindFit[ ... , NormFunction -> (Abs@Norm[#]&)

This solution does works.

http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/=
thread/6afe1f108e51190b/d31cd1dd0cb8519b?lnk=gst&q=FindFit+complex#d31cd=
1dd0cb8519b

However, when I read this, I got suspicious.  Doesn't the Norm[]
function *always* return a real number?  Perhaps FindFit calls Norm
with more than one argument?  We can try

FindFit[ ... , NormFunction -> (Norm[#]&) ]

to suppress all but the first argument, but it returns the same error
that we get when using simply Norm!  (FindFit[ ... , NormFunction ->
Norm ])

This was really strange, so I experimented a bit with different norm
functions.  According to the documentation, Norm[#]& is equivalent to
Sqrt[#.Conjugate[#]& for vectors, still, using Norm[#]& with FindFit
gives an error, while using Sqrt[#.Conjugate[#]& works.  I tried
printing the arguments of the norm function, and it really *is* being
called with a simple vector.

Finally I discovered that using the norm function

norm[x_] := Norm[x]

works too, so FindFit is probably not calling Norm[] at all when
NormFunction -> Norm is used!  (An alternative explanation would be
that the norm function is compiled and something goes wrong during the
compilation of Norm. But even though Norm was introduces in version
5.0, it is still not compilable in version 6.0 ...  so this cannot be
the case)

I think that WRI is taking this "black box function" thing too far.
It is not a good idea to make a function *appear* to do one thing,
when in fact it does something else.   Users should be aware of what
is happening inside the function.

Could someone from WRI please explain what is going on here?  Am I
missing something obvious?

Szabolcs Horv=E1t


  • Prev by Date: Re: Adapting function to input type
  • Next by Date: Re: FullSimplify interpretation
  • Previous by thread: Re: Impedance Equation fit to Complex Data
  • Next by thread: Re: Impedance Equation fit to Complex Data