Example #1
0
int qrisymtri(real_t **a, int n, real_t d[], real_t b[], real_t bb[],
					real_t em[])
{
	void rotcol(int, int, int, int, real_t **, real_t, real_t);
	int j,j1,k,m,m1,count,max;
	real_t bbmax,r,s,sin,t,cos,oldcos,g,p,w,tol,tol2,lambda,dk1;

	tol=em[2]*em[1];
	tol2=tol*tol;
	count=0;
	bbmax=0.0;
	max=em[4];
	m=n;
	do {
		k=m;
		m1=m-1;
		while (1) {
			k--;
			if (k <= 0) break;
			if (bb[k] < tol2) {
				if (bb[k] > bbmax) bbmax=bb[k];
				break;
			}
		}
		if (k == m1)
			m=m1;
		else {
			t=d[m]-d[m1];
			r=bb[m1];
			if (fabs(t) < tol)
				s=sqrt(r);
			else {
				w=2.0/t;
				s=w*r/(sqrt(w*w*r+1.0)+1.0);
			}
			if (k == m-2) {
				d[m] += s;
				d[m1] -= s;
				t = -s/b[m1];
				r=sqrt(t*t+1.0);
				cos=1.0/r;
				sin=t/r;
				rotcol(1,n,m1,m,a,cos,sin);
				m -= 2;
			} else {
				count++;
				if (count > max) break;
				lambda=d[m]+s;
				if (fabs(t) < tol) {
					w=d[m1]-s;
					if (fabs(w) < fabs(lambda)) lambda=w;
				}
				k++;
				t=d[k]-lambda;
				cos=1.0;
				w=b[k];
				p=sqrt(t*t+w*w);
				j1=k;
				for (j=k+1; j<=m; j++) {
					oldcos=cos;
					cos=t/p;
					sin=w/p;
					dk1=d[j]-lambda;
					t *= oldcos;
					d[j1]=(t+dk1)*sin*sin+lambda+t;
					t=cos*dk1-sin*w*oldcos;
					w=b[j];
					p=sqrt(t*t+w*w);
					g=b[j1]=sin*p;
					bb[j1]=g*g;
					rotcol(1,n,j1,j,a,cos,sin);
					j1=j;
				}
				d[m]=cos*t+lambda;
				if (t < 0.0) b[m1] = -g;
			}
		}
	} while (m > 0);
	em[3]=sqrt(bbmax);
	em[5]=count;
	return m;
}
Example #2
0
int Ti_Optimization::qrisngvaldecbid(double d[], double b[], int m, int n, double **u,
			     double **v, double em[])
	{
	int n0,n1,k,k1,i,i1,count,max,rnk;
	double tol,bmax,z,x,y,g,h,f,c,s,min;

	tol=em[2]*em[2];
	count=0;
	bmax=0.0;
	max=(int)em[4];
	min=em[6];
	rnk=n0=n;
	do 
		{
		k=n;
		n1=n-1;
		while (1) 
			{
			k--;
			if (k <= 0) break;
			if (fabs(b[k]) >= tol) 
				{
				if (fabs(d[k]) < tol) 
					{
					c=0.0;
					s=1.0;
					for (i=k; i<=n1; i++)
						{
						f=s*b[i];
						b[i] *= c;
						i1=i+1;
						if (fabs(f) < tol)
							break;
						g=d[i1];
						d[i1]=h=sqrt(f*f+g*g);
						c=g/h;
						s = -f/h;
						rotcol(1,m,k,i1,u,c,s);
						}
					break;
					}
				} 
			else 
				{
				if (fabs(b[k]) > bmax) bmax=fabs(b[k]);
				break;
				}
			}//end while
		if (k == n1) 
			{
			if (d[n] < 0.0) 
				{
				d[n] = -d[n];
				for (i=1; i<=n0; i++) v[i][n] = -v[i][n];
				}
			if (d[n] <= min) rnk--;
			n=n1;
			} 
		else 
			{
			count++;
			if (count > max) break;
			k1=k+1;
			z=d[n];
			x=d[k1];
			y=d[n1];
			g = (n1 == 1) ? 0.0 : b[n1-1];
			h=b[n1];
			f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);
			g=sqrt(f*f+1.0);
			f=((x-z)*(x+z)+h*(y/((f < 0.0) ? f-g : f+g)-h))/x;
			c=s=1.0;
			for (i=k1+1; i<=n; i++) 
				{
				i1=i-1;
				g=b[i1];
				y=d[i];
				h=s*g;
				g *= c;
				z=sqrt(f*f+h*h);
				c=f/z;
				s=h/z;
				if (i1 != k1) b[i1-1]=z;
				f=x*c+g*s;
				g=g*c-x*s;
				h=y*s;
				y *= c;
				rotcol(1,n0,i1,i,v,c,s);
				d[i1]=z=sqrt(f*f+h*h);
				c=f/z;
				s=h/z;
				f=c*g+s*y;
				x=c*y-s*g;
				rotcol(1,m,i1,i,u,c,s);
				}
			b[n1]=f;
			d[n]=x;
			}
		} while (n > 0);
	em[3]=bmax;
	em[5]=count;
	em[7]=rnk;
	return n;
	}