⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linearequation.inl

📁 特征值和特征向量的计算,每种算法都用c++以函数形式实现
💻 INL
📖 第 1 页 / 共 2 页
字号:
	
    for(j = 1; j < n; j++) a(0, j) /= a(0, 0);
    
	for(i = 1; i < n; i++)
	{
        for(j = 1; j <= i; j++)
            a(i, i) = a(i, i) - a((j - 1), i) * a((j - 1), i);
    
		a(i, i) = sqrt(a(i, i));
        if(i != (n - 1))
		{
			for(j = i + 1; j < n; j++)
			{
                for(k = 1; k <= i; k++)
					a(i, j) -= a((k - 1), i) * a((k - 1), j);
                
				a(i, j) /= a(i, i);
			}
		}
	}
    
	for(j = 0; j < m; j++)
	{
		d(0, j) = d(0, j) / a(0, 0);
        for(i = 1; i < n; i++)
		{
            for(k = 1; k <= i; k++)
				d(i, j) -= a((k - 1), i) * d((k - 1), j);
            
			d(i, j) /= a(i, i);
		}
	}
    
	for(j = 0; j < m; j++)
	{
        d((n - 1), j) = d((n - 1), j) / a((n - 1), (n - 1));
		
		for(k = n - 1; k >= 1; k --)
		{
		    for(i = k; i < n; i++)
		        d((k - 1), j) -= a((k - 1), i) * d(i, j);
        
            d((k - 1), j) /= a((k - 1), (k - 1));			
		}
	}
    
	return (1);	//运行成功,正常返回
}

//求解大型稀疏方程组的全选主元高斯-约当消去法
template <class _Ty>
int LE_SparseEuationTotalChoiceGaussJordan(matrix<_Ty> & a, valarray<_Ty> & b)
{ 
	int i, j, k, is;
    _Ty d, t;

    int n = a.GetColNum();		//方程组阶数
    valarray<int> js(n);
	
    for(k = 0; k < n; k++)
	{ 
		d = 0.0;
    	for(i = k; i < n; i++)
			for(j = k; j < n; j++)
			{
				t = Abs(a(i, j));
		
				if(t > d)
				{ 
					d = t;
					js[k] = j; 
					is = i;
				}
			}
		
		if( FloatEqual(d, 0.0) )	//主元为0
		{					
			cout<<"fail 1"<<endl;
			return (0);
		}
		
		if(is != k)
		{ 
			for(j = k; j < n; j++)
			{
				t = a(k, j);
				a(k, j) = a(is, j);
				a(is, j) = t;
			}
			
			t = b[k];
			b[k] = b[is];
			b[is] = t;
		}
		
		if(js[k] != k)
			for(i = 0; i < n; i++)
			{
				t = a(i, k);
				a(i, k) = a(i, js[k]); 
				a(i, js[k]) = t;
			}
		
		t = a(k, k);
		
		for(j = k + 1; j < n; j++)
		{
			if(a(k, j) != 0.0)
				a(k, j) = a(k, j) / t;
		}
		
		b[k] = b[k] / t;
		for(j = k + 1; j < n; j++)
		{ 
			if(a(k, j) != 0.0)
			{
				for(i = 0; i < n; i++)
				{
					if((i != k) && (a(i, k) != 0.0))
					{ 
						a(i, j) = a(i, j) - a(i, k) * a(k, j);
					}
				}
			}
		}
		
		for(i = 0; i <  n; i++)
		{
			if((i != k) && (a(i, k) != 0.0))
				b[i] = b[i] - a(i, k) * b[k];
		}
	}
	
	for(k = n - 1; k >= 0; k--)
		if(k != js[k])
		{
			t = b[k];
			b[k] = b[js[k]]; 
			b[js[k]] = t;
		}
	   
	return (1);	//运行成功,正常返回
}

//求解托伯利兹方程组的列文逊方法
template <class _Ty>
int LE_ToeplitzEuationLevinson(valarray<_Ty>& t,  valarray<_Ty>& b, valarray<_Ty>& x)
{
	int i, j, k;
    _Ty a, beta, q, c, h;
	bool yn;

    int n = t.size();			//方程组阶数
	valarray<_Ty> y(n);
	valarray<_Ty> s(n);

	a = t[0];
	yn = FloatEqual(a, 0.0);
    if(yn)
	{
		cout << "fail 1" << endl;
		return(-1);
	}
    
	y[0] = 1.0;
	x[0] = b[0] / a;

    for(k = 1; k < n; k++)
	{
		beta = 0.0;
		q = 0.0;
        
		for(j = 0; j < k; j++)
		{
			beta = beta + y[j] * t[j + 1];
            q = q + x[j] * t[k - j];
		}
        
		yn = FloatEqual(a, 0.0);
		if(yn)		
		{
			cout << "fail 2" << endl;
			return(-1);
		}
        
		c = -beta / a; 
		s[0] = c * y[k - 1]; 
		y[k] = y[k - 1];
        
		if(k != 1)
			for(i = 1; i < k; i++)
				s[i] = y[i - 1] + c * y[k - i - 1];
			
		a = a + c * beta;
        
		yn = FloatEqual(a, 0.0);
		if(yn)
		{
			cout << "fail 3" << endl;
			return (-1);
		}

        h = (b[k] - q) / a;
        
		for(i = 0; i < k ; i++)
		{
			x[i] = x[i] + h * s[i];
			y[i] = s[i];
		}
        
		x[k] = h * y[k];
	}
  
	return (1);	//运行成功,正常返回
}

//高斯-赛德尔迭代
template <class _Ty>
int LE_GaussSeidelIteration(matrix<_Ty>& a, valarray<_Ty>& b, 
											valarray<_Ty>& x, _Ty eps)
{
	int i, j;
    _Ty p, t, s, q;

	int n = a.GetColNum();		//方程组阶数
    
	for(i = 0; i < n; i++)
	{	
		p = 0.0;
		x[i] = 0.0;
        
		for(j = 0; j < n; j++)
			if(i != j)
				p = p + Abs(a(i, j));
        
		if(p >= Abs(a(i, i)) )	//主对角线不占绝对优势
		{
			cout<<"fail 1"<<endl;
			return(-1);
		}
	}
    
	p = eps + 1.0;
    while(p > eps  || FloatEqual(p, eps))
	{
		p = 0.0;
        for(i = 0; i < n; i++)
		{
			t = x[i];
			s = 0.0;
            for(j = 0; j < n; j++)
				if(j != i) 
					s = s + a(i, j) * x[j];
			
			x[i] = (b[i] - s) / a(i, i);
            q = Abs(x[i] - t) / (1.0 + Abs(x[i]));
            if(q > p) p = q;
		}
	}

	return (1);	//运行成功,正常返回
}
    
//求解对称正定方程组的共轭梯度法
template <class _Ty>
int LE_SymmetryRegularEuationConjugateGradient(matrix<_Ty> & a, 
						valarray<_Ty> & b, _Ty eps, valarray<_Ty> & x)
{
	int i, k;
    _Ty  alpha, beta, d, e;
	
	if(MatrixSymmetryRegular(a,1) != 2)	//判别矩阵a是否对称正定
		return(-1);						//矩阵a不对称正定
    
	int n = a.GetColNum();				//方程组阶数
    valarray<_Ty> r(n);
    
	matrix<double> q(n, 1);
    matrix<double> p(n, 1);
	matrix<double> s(n, 1);
    matrix<double> xx(n, 1);
    
	for(i = 0; i < n; i++) 
		xx(i, 0) = x[i];

    for(i = 0; i < n; i++)
	{
		xx(i,0) = 0.0;
		p(i, 0) = b[i];
		r[i] = b[i]; 
	}
    
	i = 0;

    while(i < n)
	{		
		MatrixMultiply(s, a, p);
        d = 0.0;
		e = 0.0;
        
		for(k = 0; k < n; k++)
		{
			d = d + p(k, 0) * b[k];
			e = e + p(k, 0) * s(k,0); 
		}
        
		alpha = d / e;
        
		for(k = 0; k < n; k++)
			xx(k,0) = xx(k, 0) + alpha * p(k, 0);
        		
		MatrixMultiply(q, a, xx);
        
		d = 0.0;
        
		for(k = 0; k < n; k++)
		{
			r[k] = b[k] - q(k, 0);
			d = d + r[k] * s(k, 0);
		}
        
		beta = d / e;
		d = 0.0;
        
		for(k = 0; k < n; k++) d = d + r[k] * r[k];
        
		d = sqrt(d);
        
		if(d < eps) 
		{
			for(i = 0; i < n; i++) 
				x[i] = xx(i, 0);

		}

        for(k = 0; k < n; k++) 
 			p(k, 0) = r[k] - beta * p(k, 0);
        
		i++;
	}

	for(i = 0; i < n; i++) 
		x[i] = xx(i, 0);

	return (1);	//运行成功,正常返回
}

//求解线性最小二乘问题的豪斯荷尔德变换法
template <class _Ty>
int LE_LinearLeastSquareHouseholder(matrix<_Ty>& a, valarray<_Ty>& b, matrix<_Ty>& q)
{
	int i,j;
    _Ty d;

    int n = a.GetColNum();		//系数矩阵a的行数,m>=n
	int m = a.GetRowNum();		//系数矩阵a的列数,n<=m
    
	valarray<_Ty> c(n);

    i = MatrixQR(a, q);			//一般m×n阶的实矩阵QR分解函数

    if(i == 0)
	{
		return (-1);
	}

	for(i = 0; i < n; i++)
	{
		d = 0.0;

        for(j = 0; j < m; j ++)
				d = d + q(j ,i) * b[j];
        
		c[i] = d;
	}
    
	b[n - 1] = c[n - 1] / a((n - 1), (n - 1));
	
    for(i = n - 2; i >= 0; i--)
	{
		d = 0.0;

        for(j = i + 1; j < n; j++)
				d = d + a(i,j) * b[j];
        
		b[i] = (c[i] - d) / a(i, i);
	}
	return (1);	//运行成功,正常返回
}

//求解线性最小二乘问题的广义逆法
template <class _Ty>
int LE_LinearLeastSquareGeneralizedInverse(matrix<_Ty>& a, 
				valarray<_Ty>& b, valarray<_Ty>& x, matrix<_Ty>& aa, 
								_Ty eps, matrix<_Ty>& u, matrix<_Ty>& v)
{
	int i, j, ii;
       
	int n = a.GetColNum();	//系数矩阵a的列数
	int m = a.GetRowNum();	//系数矩阵a的行数
    
	int ka = (n > m) ? n : m;	
	
	ka++;

	ii = GeneralizedInversionSingularValue(a, aa, eps, u, v);
    
	if(ii < 0)  return(-1);
    
	for(i = 0; i < n; i ++)
	{
		x[i] = 0.0;
        for(j = 0; j < m; j ++)
		{		
			x[i] += aa(i, j) * b[j];			
		}
	}
    
	return (1);	//运行成功,正常返回
}

//病态方程组的求解
template <class _Ty>
int LE_IllConditionedEquation(matrix<_Ty> & a, valarray<_Ty> & b, _Ty eps, valarray<_Ty> & x)
{
	int i(60), j, kk;
    _Ty q, qq;

    int n = a.GetColNum();			//方程组阶数

	matrix<_Ty> p(n, n);
	matrix<_Ty> ee(n, 1);
	matrix<_Ty> xx(n, 1);
	valarray<double> rr(n);
	    
	for(int k = 0; k < n; k++)
		for(j = 0; j < n; j++)
			p(k, j) = a(k, j);
	
	for(k = 0; k < n; k++) x[k] = b[k];
    kk = LE_TotalChoiceGauss(p, x);
	
	for(int w = 0; w < n; w++) xx(w, 0) = x[w];  
	
	if(kk == 0)
	{ 
		for( w = 0; w < n; w++) x[w] = xx(w, 0);
	    
		return 0;
	}
    
	q = 1.0 + eps;
    while(q > eps || FloatEqual(q, eps))
	{
		if(i == 0)
		{ 
			for( w = 0; w < n; w++) x[w] = xx(w, 0);
			
			return 0;
		}
        i--;        
		
		MatrixMultiply(ee, a, xx);
		for( w = 0; w < n; w++) x[w] = xx(w, 0);        
			
		for(k = 0; k < n; k++) rr[k] = b[k] - ee(k, 0);

        for(k = 0; k < n; k++)
			for(j = 0; j < n; j++) p(k, j) = a(k, j);
			
		kk = LE_TotalChoiceGauss(p, rr);	

        if(kk == 0)
		{ 
			for( w = 0; w < n; w++) x[w] = xx(w, 0);
	
			return 0;
		}
        
		q = 0.0;
        for(k = 0; k < n; k++)
		{
			qq = Abs(rr[k]) / (1.0 + Abs(x[k] + rr[k]));
            if(qq > q) q = qq;
		}
        
		for(k = 0; k < n; k++) xx(k, 0) = xx(k, 0) + rr[k];
		for(int w = 0; w < n; w++)  x[w] = xx(w, 0);	    
	}
		
	for( w = 0; w < n; w++) x[w] = xx(w, 0);
	
	return (1);	//运行成功,正常返回
}

#endif //_LINEAREQUATION_INL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -