def LmodtestM(lam,i, p): x0=np.array([56.,100.,760.,35.,9888.]) dx=np.array([5.6,10.,76.,3.5,988.8]) x0h=x0+lam*dx dxlam=lam*dx mxdx=DAm.nldalec(x0h,i)[1][i-1] mx=DAm.nldalec(x0,i)[1][i-1] M=DAm.ldalec(x0,i)[2] Mdx=M*np.matrix(dxlam).T if p=='all': err=(np.linalg.norm(mxdx-mx))/(np.linalg.norm(Mdx)) else: err=(np.linalg.norm(mxdx[p]-mx[p]))/(np.linalg.norm(Mdx[p])) return err #(np.linalg.norm(mxdx))/(np.linalg.norm(Mdx)+np.linalg.norm(mx))
def d2J(X): Mlist,GPP_diff=DAm.ldalec(X,lenrun) nlhx=DAm.nldalec(X,lenrun) X1=[X[0],X[1],X[2],X[3],X[4]] X0=np.matrix(X1).T #Figure out Hi's, y and y_err H=[] hx=[] y=[] y_err=[] for x in range(lenrun): temp=[] temp2=[] yi=[] yi_err=[] obs=False if d.gpp[x]!=None: temp.append([GPP_diff[x],0,0,0,0]) temp2.append(nlhx[x,0]) yi=np.append(yi,[d.gpp[x]]) yi_err=np.append(yi_err,[d.gpp_err[x]**2]) obs=True if d.lf[x]!=None: temp.append([d.p_5,0,0,0,0]) temp2.append(nlhx[x,1]) yi=np.append(yi,[d.lf[x]]) yi_err=np.append(yi_err,[d.lf_err[x]**2]) obs=True if d.lw[x]!=None: temp.append([0,0,d.p_6,0,0]) temp2.append(nlhx[x,2]) yi=np.append(yi,[d.lw[x]]) yi_err=np.append(yi_err,[d.lw_err[x]**2]) obs=True if d.rt[x]!=None: temp.append([d.p_2*GPP_diff[x],0,0,d.p_8*d.T[x],d.p_9*d.T[x]]) temp2.append(nlhx[x,3]) yi=np.append(yi,[d.rt[x]]) yi_err=np.append(yi_err,[d.rt_err[x]**2]) obs=True if d.nee[x]!=None: temp.append([-(1-d.p_2)*GPP_diff[x],0,0,-d.p_8*d.T[x],-d.p_9*d.T[x]]) temp2.append(nlhx[x,4]) yi=np.append(yi,[d.nee[x]]) yi_err=np.append(yi_err,[d.nee_err[x]**2]) obs=True if obs==False: temp.append([0,0,0,0,0]) temp2.append(0) yi=np.append(yi,0) yi_err=np.append(yi_err,0) H.append(np.matrix(np.vstack(temp))) hx.append(temp2) y.append(yi) y_err.append(yi_err) #yhx=np.matrix((np.hstack(y)-np.hstack(hx))).T #R=Rmat(np.hstack(y_err)) stacklist=[H[0]] #Creates H hat matrix for x in xrange(1,lenrun): stacklist.append(H[x]*Mfac(Mlist,x)) #Hhat=np.matrix(np.vstack(stacklist)) #d2J=B.I+Hhat.T*R.I*Hhat #Incr=[np.matrix(Rmat(y_err[i])).I*yhx[i] for i in range(0,lenrun,1)] d2jlist=[0]*lenrun for i in range(lenrun): if np.linalg.norm(y_err[i])!=0: d2jlist[i]=stacklist[i].T*np.matrix(Rmat(y_err[i])).I*stacklist[i] d2J=B.I+sum(d2jlist) return d2J
def dJ(X): Mlist,GPP_diff,M=DAm.ldalec(X,lenrun) #run linear model out list of linear model matrices and value for GPP derivative at each time step nlhx=DAm.nldalec(X,lenrun)[0] #run nonlinear model for obs guess output X1=[X[0],X[1],X[2],X[3],X[4]] X0=np.matrix(X1).T #Creates H_i's, y_i's and y_err_i's H=[] #linear obs operator hx=[] #h(x) y=[] #obs y_err=[] #obs error for x in range(lenrun): temp=[] temp2=[] yi=[] yi_err=[] obs=False if d.gpp[x]!=None: temp.append([GPP_diff[x],0,0,0,0]) temp2.append(nlhx[x,0]) yi=np.append(yi,[d.gpp[x]]) yi_err=np.append(yi_err,[d.gpp_err[x]**2]) obs=True if d.lf[x]!=None: temp.append([d.p_5,0,0,0,0]) temp2.append(nlhx[x,1]) yi=np.append(yi,[d.lf[x]]) yi_err=np.append(yi_err,[d.lf_err[x]**2]) obs=True if d.lw[x]!=None: temp.append([0,0,d.p_6,0,0]) temp2.append(nlhx[x,2]) yi=np.append(yi,[d.lw[x]]) yi_err=np.append(yi_err,[d.lw_err[x]**2]) obs=True if d.rt[x]!=None: temp.append([d.p_2*GPP_diff[x],0,0,d.p_8*d.T[x],d.p_9*d.T[x]]) temp2.append(nlhx[x,3]) yi=np.append(yi,[d.rt[x]]) yi_err=np.append(yi_err,[d.rt_err[x]**2]) obs=True if d.nee[x]!=None: temp.append([-(1-d.p_2)*GPP_diff[x],0,0,-d.p_8*d.T[x],-d.p_9*d.T[x]]) temp2.append(nlhx[x,4]) yi=np.append(yi,[d.nee[x]]) yi_err=np.append(yi_err,[d.nee_err[x]**2]) obs=True if d.cf[x]!=None: temp.append([1,0,0,0,0]) temp2.append(nlhx[x,5]) yi=np.append(yi,[d.cf[x]]) yi_err=np.append(yi_err,[d.cf_err[x]**2]) obs=True if obs==False: temp.append([0,0,0,0,0]) temp2.append(0) yi=np.append(yi,0) yi_err=np.append(yi_err,0) H.append(np.matrix(np.vstack(temp))) hx.append(np.matrix(temp2)) y.append(np.matrix(yi)) y_err.append((yi_err)) yhx=[y[i].T-hx[i].T for i in range(len(y))] #Create y-h(x) incriment #stacklist1=[H[0]] #Creates H hat matrix #for x in xrange(1,len(y)): # stacklist1.append(H[x]*Mfac(Mlist,x)) stacklist2=[H[0].T] #creats M^T*H^T for each time step for x in xrange(1,len(y)): stacklist2.append(MfacAdj(Mlist,x)*H[x].T) #Incr=[stacklist2[i]*np.matrix(Rmat(y_err[i])).I*yhx[i] for i in range(len(y))] #Creates obs incriment Incr=[] for i in range(lenrun): if np.linalg.norm(y_err[i])!=0: Incr.append(stacklist2[i]*np.matrix(Rmat(y_err[i])).I*yhx[i]) dJ=B.I*(X0-XB) -np.sum(Incr, axis=0) #Cost function first derivative dJlist=[float(dJ[0]),float(dJ[1]),float(dJ[2]),float(dJ[3]),float(dJ[4])] return dJ.T #np.array(dJlist)
def Adjtest(i): Mlist,gppdiff=DAm.ldalec(x0,i) M=DAC3.Mfac(Mlist,i) MT=DAC3.MfacAdj(Mlist,i) t=M*np.matrix(dx).T return t.T*t, np.matrix(dx)*MT*t