Author: tlinnet Date: Fri Aug 29 15:17:05 2014 New Revision: 25434 URL: http://svn.gna.org/viewcvs/relax?rev=25434&view=rev Log: Replaced the way to calculate the chi2 Jacobian, for exponential fit in minfx. This is only for the test class, but reuses library code. This should make it much easier in the future to implement chi2 gradient functions to minfx, since it is only necessary to implement the direct gradient of the function, and then pass the direct gradient to chi2 library, which turn it into the chi2 gradient function which minfx use. task #7822(https://gna.org/task/index.php?7822): Implement user function to estimate R2eff and associated errors for exponential curve fitting. Modified: trunk/specific_analyses/relax_disp/estimate_r2eff.py Modified: trunk/specific_analyses/relax_disp/estimate_r2eff.py URL: http://svn.gna.org/viewcvs/relax/trunk/specific_analyses/relax_disp/estimate_r2eff.py?rev=25434&r1=25433&r2=25434&view=diff ============================================================================== --- trunk/specific_analyses/relax_disp/estimate_r2eff.py (original) +++ trunk/specific_analyses/relax_disp/estimate_r2eff.py Fri Aug 29 15:17:05 2014 @@ -591,7 +591,7 @@ def func_exp_chi2_grad(self, params=None, times=None, values=None, errors=None): - """Target function for the gradient (Jacobian matrix) of func_exp_chi2() to minfx, for exponential fit . + """Target function for the gradient (Jacobian matrix) to minfx, for exponential fit . @param params: The vector of parameter values. @type params: numpy rank-1 float array @@ -605,25 +605,6 @@ @rtype: numpy array """ - # Get the Jacobian. - exp_chi2_grad = func_exp_chi2_grad(params=params, times=times, values=values, errors=errors) - - # Transpose back, to get rows. - exp_chi2_grad_t = transpose(exp_chi2_grad) - - # Extract vectors: - d_chi2_d_r2eff = exp_chi2_grad_t[0] - d_chi2_d_i0 = exp_chi2_grad_t[1] - - # Take the sum, to send to minfx. - sum_d_chi2_d_r2eff = sum( d_chi2_d_r2eff ) - sum_d_chi2_d_i0 = sum( d_chi2_d_i0 ) - - # Define Jacobian as m rows with function derivatives and n columns of parameters. - sum_jacobian_matrix_exp_chi2 = transpose(array( [sum_d_chi2_d_r2eff , sum_d_chi2_d_i0] ) ) - - ######### Try with lib function. - # Get the back calc. back_calc = self.func_exp(params=params, times=times) @@ -637,21 +618,13 @@ n = len(params) # Define array to update parameters in. - sum_jacobian_matrix_exp_chi2_minfx = zeros([2]) + jacobian_chi2_minfx = zeros([n]) # Update value elements. - dchi2(dchi2=sum_jacobian_matrix_exp_chi2_minfx, M=n, data=values, back_calc_vals=back_calc, back_calc_grad=exp_grad_t, errors=errors) - - # Make test of two methods. - test_eq = allclose(sum_jacobian_matrix_exp_chi2, sum_jacobian_matrix_exp_chi2_minfx, rtol=1e-15, atol=1e-15) - - if not test_eq: - print("Chi2 gradient are not equal.") - print(asd) - + dchi2(dchi2=jacobian_chi2_minfx, M=n, data=values, back_calc_vals=back_calc, back_calc_grad=exp_grad_t, errors=errors) # Return Jacobian matrix. - return sum_jacobian_matrix_exp_chi2_minfx + return jacobian_chi2_minfx def estimate_r2eff(method='minfx', min_algor='simplex', c_code=True, constraints=False, chi2_jacobian=False, spin_id=None, ftol=1e-15, xtol=1e-15, maxfev=10000000, factor=100.0, verbosity=1):