void shootf(nvar,v1,v2,delv1,delv2,n1,n2,x1,x2,xf,eps,h1,hmin,f,dv1,dv2)
int nvar,n1,n2;
float v1[],v2[],delv1[],delv2[],x1,x2,xf,eps,h1,hmin,f[],dv1[],dv2[];
{
	int nok,nbad,j,iv,i,*indx,*ivector();
	void odeint(),ludcmp(),lubksb(),derivs(),
		rkqc(),free_matrix(),free_vector(),free_ivector();
	void load1();	/* ANSI: void load1(float,float *,float *); */
	void load2();	/* ANSI: void load2(float,float *,float *); */
	void score();	/* ANSI: void score(float,float *,float *); */
	float sav,det,*y,*f1,*f2,**dfdv,**matrix(),*vector();

	dfdv=matrix(1,nvar,1,nvar);
	y=vector(1,nvar);
	f1=vector(1,nvar);
	f2=vector(1,nvar);
	indx=ivector(1,nvar);
	load1(x1,v1,y);
	odeint(y,nvar,x1,xf,eps,h1,hmin,&nok,&nbad,derivs,rkqc);
	score(xf,y,f1);
	load2(x2,v2,y);
	odeint(y,nvar,x2,xf,eps,h1,hmin,&nok,&nbad,derivs,rkqc);
	score(xf,y,f2);
	j=0;
	for (iv=1;iv<=n2;iv++) {
		j++;
		sav=v1[iv];
		v1[iv] += delv1[iv];
		load1(x1,v1,y);
		odeint(y,nvar,x1,xf,eps,h1,hmin,&nok,&nbad,derivs,rkqc);
		score(xf,y,f);
		for (i=1;i<=nvar;i++)
			dfdv[i][j]=(f[i]-f1[i])/delv1[iv];
		v1[iv]=sav;
	}
	for (iv=1;iv<=n1;iv++) {
		j++;
		sav=v2[iv];
		v2[iv] += delv2[iv];
		load2(x2,v2,y);
		odeint(y,nvar,x2,xf,eps,h1,hmin,&nok,&nbad,derivs,rkqc);
		score(xf,y,f);
		for (i=1;i<=nvar;i++)
			dfdv[i][j]=(f2[i]-f[i])/delv2[iv];
		v2[iv]=sav;
	}
	for (i=1;i<=nvar;i++) {
		f[i]=f1[i]-f2[i];
		f1[i]=(-f[i]);
	}
	ludcmp(dfdv,nvar,indx,&det);
	lubksb(dfdv,nvar,indx,f1);
	j=0;
	for (iv=1;iv<=n2;iv++) {
		v1[iv] += f1[++j];
		dv1[iv]=f1[j];
	}
	for (iv=1;iv<=n1;iv++) {
		v2[iv] += f1[++j];
		dv2[iv]=f1[j];
	}
	free_ivector(indx,1,nvar);
	free_vector(f2,1,nvar);
	free_vector(f1,1,nvar);
	free_vector(y,1,nvar);
	free_matrix(dfdv,1,nvar,1,nvar);
}