var schrittweitenparameter=1;
function partabl(f,x,a,dai)
{
	var aa=a[dai];
	a[dai]-=1e-8;
	var y1=eval(f);
	a[dai]=aa+1e-8;
	var y2=eval(f);
	a[dai]=aa;
	return (y2-y1)*0.5e8;
}
function koeffmatrix(f,x,y,a,aa)
{
	var n=aa.length,i,j,k=0;
	var m=new Array(n*(n+1));
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)m[k++]=(j>=i)?gsumff(f,x,a,aa[i],aa[j]):m[j*(n+1)+i];
		m[k++]=gsumfy(f,x,y,a,aa[i]);
	}
	return m;
}
function gsumff(f,x,a,i,j)
{
	var s=0,k,n=x.length;
	for(k=0;k<n;k++)s+=partabl(f,x[k],a,i)*partabl(f,x[k],a,j);
	return s;
}
function gsumfy(f,xx,y,a,i)
{
	var s=0,k,n=xx.length,yy=eval(f),x;
	for(k=0;k<n;k++){x=xx[k];s+=partabl(f,xx[k],a,i)*(y[k]-eval(f));}
	return s;
}
function regrnl(f,x,y,a,iter,sw)
{
	var n=a.length,i,j;
	var aa=new Array();aaa=new Array();
	for(i=0;i<n;i++){if(f.indexOf("a["+i+"]")>-1){aa[aa.length]=a[i];aaa[aaa.length]=i;}}
	n=aa.length;
	if(iter==null)iter=1;
	if(sw==null)sw=schrittweitenparameter;
	for(i=0;i<iter;i++)
	{
		var m=koeffmatrix(f,x,y,a,aaa);
		var v=new Array(n);
		GLSL(m,v,n);
		for(j=0;j<n;j++)a[aaa[j]]+=v[j]*sw;
	}
	return a;
}
function fkt(f,x,a){return eval(f);}
function varianz(f,xx,a,y)
{
	var v=0,i,d,yy,x;
	for(i=0;i<xx.length;i++){x=xx[i];yy=eval(f);d=y[i]-yy;v+=d*d;}
	return v/xx.length;
}

