def Gram_matrix(self, F, F1, F2, F3, lower, upper):
assert self.input_dim == <NUM_LIT:1><EOL>def L(x,i):<EOL><INDENT>return(<NUM_LIT:5>*np.sqrt(<NUM_LIT:5>)/self.lengthscale**<NUM_LIT:3>*F[i](x) + <NUM_LIT>/self.lengthscale**<NUM_LIT:2>*F1[i](x)+ <NUM_LIT:3>*np.sqrt(<NUM_LIT:5>)/self.lengthscale*F2[i](x) + F3[i](x))<EOL><DEDENT>n = F.shape[<NUM_LIT:0>]<EOL>G = np.zeros((n,n))<EOL>for i in range(n):<EOL><INDENT>for j in range(i,n):<EOL><INDENT>G[i,j] = G[j,i] = integrate.quad(lambda x : L(x,i)*L(x,j),lower,upper)[<NUM_LIT:0>]<EOL><DEDENT><DEDENT>G_coef = <NUM_LIT>*self.lengthscale**<NUM_LIT:5>/(<NUM_LIT>*np.sqrt(<NUM_LIT:5>))<EOL>Flower = np.array([f(lower) for f in F])[:,None]<EOL>F1lower = np.array([f(lower) for f in F1])[:,None]<EOL>F2lower = np.array([f(lower) for f in F2])[:,None]<EOL>orig = <NUM_LIT>/<NUM_LIT:8>*np.dot(Flower,Flower.T) + <NUM_LIT>*self.lengthscale**<NUM_LIT:4>/<NUM_LIT:200>*np.dot(F2lower,F2lower.T)<EOL>orig2 = <NUM_LIT>/<NUM_LIT:5>*self.lengthscale**<NUM_LIT:2> * ( np.dot(F1lower,F1lower.T) + <NUM_LIT:1.>/<NUM_LIT:8>*np.dot(Flower,F2lower.T) + <NUM_LIT:1.>/<NUM_LIT:8>*np.dot(F2lower,Flower.T))<EOL>return(<NUM_LIT:1.>/self.variance* (G_coef*G + orig + orig2))<EOL>
Return the Gram matrix of the vector of functions F with respect to the RKHS norm. The use of this function is limited to input_dim=1.

:param F: vector of functions
:type F: np.array
:param F1: vector of derivatives of F
:type F1: np.array
:param F2: vector of second derivatives of F
:type F2: np.array
:param F3: vector of third derivatives of F
:type F3: np.array
:param lower,upper: boundaries of the input domain
:type lower,upper: floats