I am using scipy.optimize.minimize() from scipy to implement LBFGS method. But I am having the following problem:
Line search cannot locate an adequate point after MAXLS
function and gradient evaluations.
Previous x, f and g restored.
Possible causes: 1 error in function or gradient evaluation;
2 rounding error dominate computation.
My code is the next one:
import scipy
import scipy.optimize
import numpy as np
import matplotlib.pyplot as plt
import timeit
from funcion_objetivo import funcion_objetivo
from funcion_gradiente import gradiente
Nx = 210
Nz = 68
tEnd = 2.5
dt = 0.004
t = np.arange(0,tEnd,dt)
frec = 3
Nt = tEnd/dt
Nt= int(Nt)
dz = 25
dx = 25
Sx1 = 25
Sx2 = 185
Sx3 = 105
Sx4 = 65
Sx5 = 145
Sz = 3
offset_max = 4000
a = (np.pi*frec)**2
t0 = 1
g1 = (-2*a*(t-t0)*np.exp(-a*(t-t0)**2)).T
g1 = np.reshape(g1,(np.size(g1),1))
######### Modelo original
vp_ori = np.load('modelo_original.npy')
######### Modelo inicial
vp_ite = np.load('modelo_inicial1.npy')
start=timeit.default_timer()
p = scipy.optimize.minimize(funcion_objetivo, vp_ite.flatten(),
method='L-BFGS-B', jac=True, args=(vp_ori,),
options={'disp':True, 'maxiter':5})
stop=timeit.default_timer()
print('time:', stop-start)
vp_ori and vp_ite are matrix of (210, 68).
FWI_Grad and propagator are predefined functions. The first one returns a vector and the second one a tuple of len = 3 each contains a matrix, for example Pt_obs1[0].shape = (625, 165).
This is my objective function:
from propagator import propagator
import numpy as np
from funcion_gradiente import gradiente
from numba import jit
@jit
def funcion_objetivo(vp_ite, vp_ori):
Sx1 = 25
Sx2=185
Sx3=105
Sx4=65
Sx5=145
Sz=3
dx=25
dz=25
dt=0.004
frec=3
a = (np.pi*frec)**2
t0 = 1
tEnd = 2.5
dt = 0.004
t = np.arange(0,tEnd,dt)
g1 = (-2*a*(t-t0)*np.exp(-a*(t-t0)**2)).T
g1 = np.reshape(g1,(np.size(g1),1))
Pt_obs1 = propagator(vp_ori, g1, Sx1, Sz, dx, dz, dt, 4000, frec)
print('Punto observado 1 done')
Pt_obs2 = propagator(vp_ori, g1, Sx2, Sz, dx, dz, dt, 4000, frec)
print('Punto observado 2 done')
Pt_obs3 = propagator(vp_ori, g1, Sx3, Sz, dx, dz, dt, 2125, frec)
print('Punto observado 3 done')
Pt_obs4 = propagator(vp_ori, g1, Sx4, Sz, dx, dz, dt, 3125, frec)
print('Punto observado 4 done')
Pt_obs5 = propagator(vp_ori, g1, Sx5, Sz, dx, dz, dt, 3125, frec)
print('Punto observado 5 done')
Pt_mod1 = propagator(vp_ite, g1, Sx1, Sz, dx, dz, dt, 4000, frec)
print('Punto modelado 1 done')
Pt_mod2 = propagator(vp_ite, g1, Sx2, Sz, dx, dz, dt, 4000, frec)
print('Punto modelado 2 done')
Pt_mod3 = propagator(vp_ite, g1, Sx3, Sz, dx, dz, dt, 2125, frec)
print('Punto modelado 3 done')
Pt_mod4 = propagator(vp_ite, g1, Sx4, Sz, dx, dz, dt, 3125, frec)
print('Punto modelado 4 done')
Pt_mod5 = propagator(vp_ite, g1, Sx5, Sz, dx, dz, dt, 3125, frec)
print('Punto modelado 5 done')
r1 = np.sum(Pt_mod1[0] - Pt_obs1[0])
r2 = np.sum(Pt_mod2[0] - Pt_obs2[0])
r3 = np.sum(Pt_mod3[0] - Pt_obs3[0])
r4 = np.sum(Pt_mod4[0] - Pt_obs4[0])
r5 = np.sum(Pt_mod5[0] - Pt_obs5[0])
r = (r1**2 + r2**2 + r3**2 + r4**2 + r5**2)
norma = 0.5*np.sqrt(r)
print('la norma es: ', norma)
grad = gradiente(vp_ite, vp_ori)
print('el gradiente es: ', grad)
return norma, grad
This is my gradient function:
from FWI_GRAD import FWI_GRAD
import numpy as np
from numba import jit
from propagator import propagator
@jit
def gradiente(vp_ite, vp_ori):
Nx = 210
Nz = 68
dz = 25
Sx1 = 25
Sx2=185
Sx3=105
Sx4=65
Sx5=145
Sz=3
dx=25
dz=25
dt=0.004
frec=3
a = (np.pi*frec)**2
t0 = 1
tEnd = 2.5
dt = 0.004
t = np.arange(0,tEnd,dt)
g1 = (-2*a*(t-t0)*np.exp(-a*(t-t0)**2)).T
g1 = np.reshape(g1,(np.size(g1),1))
dt = 0.004
frec = 3
beta = 1
Nt = tEnd/dt
Nt= int(Nt)
Pt_obs1 = propagator(vp_ori, g1, Sx1, Sz, dx, dz, dt, 4000, frec)
print('Punto observado 1 done')
Pt_obs2 = propagator(vp_ori, g1, Sx2, Sz, dx, dz, dt, 4000, frec)
print('Punto observado 2 done')
Pt_obs3 = propagator(vp_ori, g1, Sx3, Sz, dx, dz, dt, 2125, frec)
print('Punto observado 3 done')
Pt_obs4 = propagator(vp_ori, g1, Sx4, Sz, dx, dz, dt, 3125, frec)
print('Punto observado 4 done')
Pt_obs5 = propagator(vp_ori, g1, Sx5, Sz, dx, dz, dt, 3125, frec)
print('Punto observado 5 done')
f1,grad1 = FWI_GRAD(vp_ite, Nx, Nz, Nt, g1, Sx1, Sz, dx, dz, dt, 4000, frec, Pt_obs1[0], 1)
f2,grad2 = FWI_GRAD(vp_ite, Nx, Nz, Nt, g1, Sx2, Sz, dx, dz, dt, 4000, frec, Pt_obs2[0], 2)
f3,grad3 = FWI_GRAD(vp_ite, Nx, Nz, Nt, g1, Sx3, Sz, dx, dz, dt, 2125, frec, Pt_obs3[0], 3)
f4,grad4 = FWI_GRAD(vp_ite, Nx, Nz, Nt, g1, Sx4, Sz, dx, dz, dt, 3125, frec, Pt_obs4[0], 4)
f5,grad5 = FWI_GRAD(vp_ite, Nx, Nz, Nt, g1, Sx5, Sz, dx, dz, dt, 3125, frec, Pt_obs5[0], 5)
grad = beta*grad1 + beta*grad2 + beta*grad3 + beta*grad4 + beta*grad5
return grad
What are the possible reasons that I should investigate? Do you know what is the error? I would appreciate any help.
I tried to return from objective function just ‘norma’ and set jac=gradiente but it did not work.
Gabriel Mantilla is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.