1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- import numpy as np
- import scipy.optimize as so
-
- def phid(Wd, K, m, d_obs):
- """
- Wd = data weighting matrix
- K = complex valued forward model kernel
- m = model
- d_obs = observed data
- """
- #print("phid=", np.linalg.norm(np.dot(Wd, np.abs(np.dot(K,m)) - d_obs))**2 / len(d_obs) )
- return np.linalg.norm(np.dot(Wd, np.abs(np.dot(K,m)) - d_obs))**2
-
- def phim(Wm, m):
- """
- Wm = model weighting matrix
- x = model
- """
- return np.linalg.norm(np.dot(Wm, m))**2
-
- def PHI(m, Wd, K, d_obs, Wm, alphastar):
- """
- Global objective function
- m = model to be fit, unknown 'x'
- Wd = data weighting matrix
- K = complex forward modelling kernel
- d_obs = observed data (modulus)
- Wm = model weighting matrix
- alphastar = regularisation to use
- """
- return phid(Wd, K, m, d_obs) + alphastar*phim(Wm, m)
-
- # main
- def nonlinearinversion( x0, Wd, K, d_obs, Wm, alphastar):
- print("Performing non-linear inversion")
- args = (Wd, K, d_obs, Wm, alphastar)
- #return so.minimize(PHI, np.zeros(len(x0)), args, 'Nelder-Mead')
- bounds = np.zeros((len(x0),2))
- bounds[:,0] = x0*0.75
- bounds[:,1] = x0*1.25
- #bounds[:,0] = 0
- #bounds[:,1] = np.max(x0)*1.25
- return so.minimize(PHI, x0, args, 'L-BFGS-B', bounds=bounds) # Works well
- #return so.minimize(PHI, x0, args, 'Powell', bounds=bounds) # Slow but works
- #return so.minimize(PHI, x0, args, 'trust-constr', bounds=bounds) # very Slow
- #return so.minimize(PHI, x0, args, 'TNC', bounds=bounds) # slow
- #return so.minimize(PHI, x0, args, 'SLSQP', bounds=bounds) # slow
|