Take one inverse-Hessian step, using SVD to control funny steps
Definition at line 546 of file fitting_toolkit.py. 00546 : 00547 "take one Hessian fitting step using singular-value-decomposition" 00548 00549 try: 00550 n=self.pointcount 00551 self.set_weights() 00552 00553 if not self.scalar_weights: 00554 raise exceptions.AssertionError, "SVD solutions require, for now, scalar weights" 00555 00556 sigi=Numeric.sqrt(self.weights) 00557 if not operator.isSequenceType(sigi): 00558 design=self.derivs()*float(sigi) 00559 else: 00560 design=self.derivs()*sigi[:,Numeric.NewAxis] #w should be a column vector 00561 00562 if(self.firstpass): 00563 self.funcvals=self.compute_funcvals() 00564 self.firstpass=0 00565 00566 u, w, v = singular_value_decomposition(design) 00567 w=self.singular_value_edit(w) 00568 for i in range(self.param_count): 00569 if w[i] != 0: 00570 w[i] = 1.0/w[i] 00571 b=(self.yarray[:n]-self.funcvals)*sigi 00572 self.fitvector=Numeric.sum(dot(Numeric.transpose(u*w),b)*Numeric.transpose(v), -1) 00573 self.svd_u=u 00574 self.svd_v=v 00575 self.svd_winv=w 00576 except: 00577 import traceback 00578 traceback.print_exc() 00579 raise 00580 00581 if damping is None: 00582 self.funcparams=self.funcparams+self.fitvector*(1-self.frozen) 00583 else: 00584 self.funcparams=self.funcparams+self.fitvector*(1-self.frozen)*damping 00585 00586 self.funcvals=self.compute_funcvals() 00587 self.compute_chi2()
|