pythonnumpyscipycurve-fitting

two dimensional fit with python


I need to fit a function

z(u,v) = C u v^p

That is, I have a two-dimensional data set, and I have to find two parameters, C and p. Is there something in numpy or scipy that can do this in a straightforward manner? I took a look at scipy.optimize.leastsq, but it's not clear to me how I would use it here.


Solution

  • def f(x,u,v,z_data):
      C = x[0]
      p = x[1]
      modelled_z = C*u*v**p
      diffs = modelled_z - z_data
      return diffs.flatten() # it expects a 1D array out. 
           # it doesn't matter that it's conceptually 2D, provided flatten it consistently
    
    result = scipy.optimize.leastsq(f,[1.0,1.0], # initial guess at starting point
                            args = (u,v,z_data) # alternatively you can do this with closure variables in f if you like
                                  )
    # result is the best fit point
    

    For your specific function you might be able to do it better - for example, for any given value of p there is one best value of C that can be determined by straightforward linear algebra.