Author: tlinnet
Date: Mon Aug 25 20:57:15 2014
New Revision: 25255
URL: http://svn.gna.org/viewcvs/relax?rev=25255&view=rev
Log:
Tried algorithms:
newton
Newton-CG
Steepest descent
Fletcher-Reeves
None of them work.
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=25255&r1=25254&r2=25255&view=diff
==============================================================================
--- trunk/specific_analyses/relax_disp/estimate_r2eff.py (original)
+++ trunk/specific_analyses/relax_disp/estimate_r2eff.py Mon Aug 25
20:57:15 2014
@@ -26,6 +26,7 @@
from copy import deepcopy
from numpy import asarray, array, diag, dot, exp, inf, log, sqrt, sum,
transpose, zeros
from minfx.generic import generic_minimise
+from re import match, search
import sys
from warnings import warn
@@ -113,7 +114,19 @@
else:
#self.min_algor = 'simplex'
- self.min_algor = 'newton'
+
+ # Newton does not work.
+ #self.min_algor = 'newton'
+
+ # Newton-CG does not work.
+ self.min_algor = 'Newton-CG'
+
+ # Also not work.
+ #self.min_algor = 'Steepest descent'
+
+ # Also not work.#
+ #self.min_algor = 'Fletcher-Reeves'
+
self.min_options = ()
self.A = None
self.b = None
@@ -122,7 +135,11 @@
self.back_calc = deepcopy(self.values)
# Define function to minimise for minfx.
- self.func = self.func_exp
+ if match('^[Ss]implex$', self.min_algor):
+ self.func = self.func_exp
+ else:
+ self.func = self.func_exp_chi2
+
self.dfunc = self.func_exp_grad
self.d2func = self.func_exp_hess
@@ -213,6 +230,29 @@
return self.calc_exp_chi2(r2eff=r2eff, i0=i0)
+ def func_exp_chi2(self, params):
+ """Target function for exponential fit in minfx.
+
+ @param params: The vector of parameter values.
+ @type params: numpy rank-1 float array
+ @return: The chi-squared value.
+ @rtype: float
+ """
+
+ # Scaling.
+ if self.scaling_flag:
+ params = dot(params, self.scaling_matrix)
+
+ # Unpack the parameter values.
+ r2eff = params[0]
+ i0 = params[1]
+
+ chi2 = 1.0 * ( -i0 * exp( -r2eff * self.relax_times) +
self.values)**2 / self.errors**2
+
+ # Calculate and return the chi-squared value.
+ return chi2
+
+
def func_exp_grad(self, params):
"""Target function for the gradient (Jacobian matrix) for
exponential fit in minfx.
@@ -244,6 +284,8 @@
# Define Jacobian as m rows with function derivatives and n
columns of parameters.
jacobian_matrix = transpose(array( [d_chi2_d_r2eff , d_chi2_d_i0]
) )
+ #print jacobian_matrix
+
# Return Jacobian matrix.
return jacobian_matrix
@@ -283,6 +325,8 @@
# Form hessian.
hessian_matrix = transpose(array( [d2_chi2_d_r2eff_d_r2eff,
d2_chi2_d_r2eff_d_i0, d2_chi2_d_i0_d_r2eff, d2_chi2_d_i0_d_i0] ) )
+
+ #print hessian_matrix
# Return Jacobian matrix.
return hessian_matrix
_______________________________________________
relax (http://www.nmr-relax.com)
This is the relax-commits mailing list
relax-commits@xxxxxxx
To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-commits