def compare_analytical_and_finite(obs, hkl, d_star_sq, params, out): grads_fin = d_target_d_params_finite( obs=obs, hkl=hkl, d_star_sq=d_star_sq, params=params) print >> out, "grads_fin:", pack_gradients(grads_fin) sf = structure_factor(hkl=hkl, d_star_sq=d_star_sq, params=params) target = least_squares(obs=obs, calc=sf.f()) grads_ana = sf.d_target_d_params(target=target) print >> out, "grads_ana:", pack_gradients(grads_ana) assert approx_equal(pack_gradients(grads_ana), pack_gradients(grads_fin)) curvs_fin = d2_target_d_params_finite( obs=obs, hkl=hkl, d_star_sq=d_star_sq, params=params) print >> out, "curvs_fin:", curvs_fin curvs_ana = sf.d2_target_d_params(target=target) print >> out, "curvs_ana:", curvs_ana assert approx_equal(curvs_ana, curvs_fin, 1.e-5) print >> out
def compare_analytical_and_finite(obs, hkl, d_star_sq, params, out): grads_fin = d_target_d_params_finite(obs=obs, hkl=hkl, d_star_sq=d_star_sq, params=params) print >> out, "grads_fin:", pack_gradients(grads_fin) sf = structure_factor(hkl=hkl, d_star_sq=d_star_sq, params=params) target = least_squares(obs=obs, calc=sf.f()) grads_ana = sf.d_target_d_params(target=target) print >> out, "grads_ana:", pack_gradients(grads_ana) assert approx_equal(pack_gradients(grads_ana), pack_gradients(grads_fin)) curvs_fin = d2_target_d_params_finite(obs=obs, hkl=hkl, d_star_sq=d_star_sq, params=params) print >> out, "curvs_fin:", curvs_fin curvs_ana = sf.d2_target_d_params(target=target) print >> out, "curvs_ana:", curvs_ana assert approx_equal(curvs_ana, curvs_fin, 1.e-5) print >> out
def d2_target_d_params_finite(obs, hkl, d_star_sq, params, eps=1.e-8): result = [] params_eps = copy.deepcopy(params) for i_param in xrange(len(params)): for ix in xrange(7): gs = [] for signed_eps in [eps, -eps]: pi_eps = params[i_param].as_list() pi_eps[ix] += signed_eps params_eps[i_param] = parameters(pi_eps[:3], *pi_eps[3:]) sf = structure_factor(hkl=hkl, d_star_sq=d_star_sq, params=params_eps) target = least_squares(obs=obs, calc=sf.f()) dp = sf.d_target_d_params(target=target) gs.append(pack_gradients(dp)) result.append([(gp-gm)/(2*eps) for gp,gm in zip(gs[0],gs[1])]) params_eps[i_param] = params[i_param] return result
def d2_target_d_params_finite(obs, hkl, d_star_sq, params, eps=1.e-8): result = [] params_eps = copy.deepcopy(params) for i_param in xrange(len(params)): for ix in xrange(7): gs = [] for signed_eps in [eps, -eps]: pi_eps = params[i_param].as_list() pi_eps[ix] += signed_eps params_eps[i_param] = parameters(pi_eps[:3], *pi_eps[3:]) sf = structure_factor(hkl=hkl, d_star_sq=d_star_sq, params=params_eps) target = least_squares(obs=obs, calc=sf.f()) dp = sf.d_target_d_params(target=target) gs.append(pack_gradients(dp)) result.append([(gp - gm) / (2 * eps) for gp, gm in zip(gs[0], gs[1])]) params_eps[i_param] = params[i_param] return result