1 import sys
2 from Numeric import Float64, zeros
3
6 "Function to create the chi-squared hessian."
7
8
9 - def d2chi2(self, params, diff_type, diff_params, model, relax_data, errors, print_flag=0):
10 """Function to create the chi-squared hessian.
11
12 Function arguments
13 ~~~~~~~~~~~~~~~~~~
14
15 1: params - a list containing the parameter values specific for the given model.
16 The order of parameters must be as follows:
17 m1 - {S2}
18 m2 - {S2, te}
19 m3 - {S2, Rex}
20 m4 - {S2, te, Rex}
21 m5 - {S2f, S2s, ts}
22 2: diff_type - string. The diffusion tensor, ie 'iso', 'axial', 'aniso'
23 3: diff_params - array. An array with the diffusion parameters
24 4: model - string. The model
25 5: relax_data - array. An array containing the experimental relaxation values.
26 6: errors - array. An array containing the experimental errors.
27
28
29 The chi-sqared hessian
30 ~~~~~~~~~~~~~~~~~~~~~~
31
32 Data structure: self.data.d2chi2
33 Dimension: 2D, (parameters, parameters)
34 Type: Numeric array, Float64
35 Dependencies: self.data.ri, self.data.dri, self.data.d2ri
36 Required by: None
37
38
39 Formula
40 ~~~~~~~
41 _n_
42 d2chi2 \ 1 / dRi() dRi() d2Ri() \
43 --------------- = 2 > ---------- | ------- . ------- - (Ri - Ri()) . --------------- |
44 dthetaj.dthetak /__ sigma_i**2 \ dthetaj dthetak dthetaj.dthetak /
45 i=1
46 """
47
48
49 if print_flag == 2:
50 print "\n< d2chi2 >"
51 print "Params: " + `params`
52
53 self.data.params = params
54 self.data.diff_type = diff_type
55 self.data.diff_params = diff_params
56 self.data.model = model
57 self.data.relax_data = relax_data
58 self.data.errors = errors
59
60
61
62
63 test = [ self.data.relax_data[:], self.data.errors[:], self.data.params.tolist(), self.data.model ]
64 if test != self.data.relax_test:
65 self.init_param_types()
66 self.Ri()
67 self.data.relax_test = test[:]
68 if test != self.data.gradient_test:
69 self.init_param_types()
70 self.dRi()
71 self.data.gradient_test = test[:]
72
73
74 self.d2Ri()
75
76
77 self.data.d2chi2 = zeros((len(self.data.params), len(self.data.params)), Float64)
78
79
80 for i in range(len(self.data.relax_data)):
81 if self.data.errors[i] != 0.0:
82
83 a = 2.0 / (self.data.errors[i]**2)
84 b = self.data.relax_data[i] - self.data.ri[i]
85
86
87 for param_j in range(len(self.data.params)):
88
89 for param_k in range(param_j + 1):
90 self.data.d2chi2[param_j, param_k] = self.data.d2chi2[param_j, param_k] + a * (self.data.dri[param_j, i] * self.data.dri[param_k, i] - b * self.data.d2ri[param_j, param_k, i])
91 if param_j != param_k:
92 self.data.d2chi2[param_k, param_j] = self.data.d2chi2[param_j, param_k]
93 else:
94
95 for param_k in range(len(self.data.params)):
96
97 for param_j in range(param_k + 1):
98 self.data.d2chi2[param_j, param_j] = 1e99
99 if param_j != param_k:
100 self.data.d2chi2[param_k, param_j] = 1e99
101 break
102
103
104 if print_flag == 2:
105 print "J(w): " + `self.data.jw`
106 print "dJ(w): " + `self.data.djw`
107 print "d2J(w): " + `self.data.d2jw`
108 print "Ri: " + `self.data.ri`
109 print "dRi: " + `self.data.dri`
110 print "d2Ri: " + `self.data.d2ri`
111 print "d2chi2: " + `self.data.d2chi2`
112 print "\n"
113
114 return self.data.d2chi2
115