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

📄 header.h

📁 求解一元高次方程
💻 H
📖 第 1 页 / 共 2 页
字号:
/*! @file
********************************************************************************
<PRE>
模块名       : 函数模块
文件名       : header.h
相关文件     : 
文件实现功能 : 包含了一系列函数,主要有输出函数,计算界的函数,二分法函数,strum函数
,等
作者         : <xxx>
版本         : 1.0
--------------------------------------------------------------------------------
备注         : 
--------------------------------------------------------------------------------
修改记录 : 
日 期						版本				修改人					修改内容 
YYYY/MM/DD					1.0					<xxx>					  创建
2008/12/19					1.0					<Name>					  创建
 </PRE>
********************************************************************************

* 版权所有(c) YYYY, <xxx>, 保留所有权利

*******************************************************************************/

#ifndef HEADER_INCLUDED
#define HEADER_INCLUDED
/*! @function
********************************************************************************
<PRE>
函数名   : ArrayDisplay
功能     : 输出一个double数组
参数     : double*dp_array,int i_degree
返回值   : 
抛出异常 : 
--------------------------------------------------------------------------------
备注     : 
典型用法 : ArrayDisplay(arrayname,degree_of_array);
--------------------------------------------------------------------------------
作者     : <xxx>
</PRE>
*******************************************************************************/
void ArrayDisplay(double*dp_array,int i_degree)
{
	cout<<endl<<"---------------------------------------------------------------------"<<endl;
	cout<<"数组元素分别为:"<<endl;
	for (int i=0;i<=i_degree;i++)
	{
		cout<<dp_array[i]<<"      ";
	}
	cout<<endl;
	cout<<"---------------------------------------------------------------------"<<endl<<endl;

}

/*! @function
********************************************************************************
<PRE>
函数名   : CalculateEquation
功能     : 计算一个函数值
参数     : double*dp_array,int i_degree,double d_value
返回值   : double 
抛出异常 : 
--------------------------------------------------------------------------------
备注     : 
典型用法 : double test=CalculateEquation(dp_array,i_degree,d_value);
--------------------------------------------------------------------------------
作者     : <xxx>
</PRE>
*******************************************************************************/
double CalculateEquation(double*dp_array,int i_degree,double d_value)
{
	double result=0;
	for (int i=0;i<=i_degree;i++)
	{
		double temp=pow(d_value,i_degree-i);
		result+=dp_array[i]*temp;
	}
	return result;
}
/*! @function
********************************************************************************
<PRE>
函数名   : int GetDegree(double * dp_equation,int i_degree)
功能     : 返回一个方程的次数
参数     : double * dp_equation 方程式,i_degree 方程的原次数
返回值   : int 返回方程的实际次数
抛出异常 : 
--------------------------------------------------------------------------------
备注     : 
典型用法 : 
--------------------------------------------------------------------------------
作者     : <xxx>
</PRE>
*******************************************************************************/
int GetDegree(double * dp_equation,int i_degree)
{
	int i = 0;
	int i_realDegree = i_degree;
	for (i = 0;i<= i_degree;i++)
	{
		if (fabs(dp_equation[i])<= 1e-6)
		{
			i_realDegree--;
		}
		else
		{
			break;
		}
	}
	return i_realDegree;

}
/*! @function
********************************************************************************
<PRE>
函数名   : double CalculateBoundary(double*dpArray,int i_degree)
功能     : 求一元高次方程解的界限
参数     : double*dpArray,int i_degree
返回值   : 解的上界值
抛出异常 : 
--------------------------------------------------------------------------------
备注     : 
典型用法 : CalculateBoundary(dpArray,i_degree);
--------------------------------------------------------------------------------
作者     : <xxx>
</PRE>
*******************************************************************************/
double CalculateBoundary(double*dpArray,int i_degree)
{
	double a0=fabs(dpArray[0]);
	double dTemp=0.0;
	double dAbsoluteValue=0.0;      /*注------------------------*/
	for (int i=1;i<=i_degree;i++)  //是否应该是i=1?根的界限中dTemp好像不包括a0?
	{
		dAbsoluteValue=fabs(dpArray[i]);
		if (dAbsoluteValue>dTemp)
		{
			dTemp=dAbsoluteValue;
		}
	}
	return 1.0+(dTemp/a0);
}
/*! @function
********************************************************************************
<PRE>
函数名   : double Bisection(double*dp_array,int i_degree,double d_left,
			double d_right,double d_precision)
功能     : 二分法求解方程的一个解
参数     : double*dp_array,int i_degree,double d_left,double d_right,double d_precision
返回值   : 返回方程的一个解
抛出异常 : 
--------------------------------------------------------------------------------
备注     : 用d_precision控制精度
典型用法 : cout<<Bisection(dp_coefficient,i_degree,0.0,3.0,0.0005);
--------------------------------------------------------------------------------
作者     : <xxx>
</PRE>
*******************************************************************************/
double Bisection(double*dp_array,int i_degree,double d_left,double d_right,double d_precision)
{
	double d_centerValue=CalculateEquation(dp_array,i_degree,(d_right+d_left)/2);

	//若在精度范围内返回
	if (fabs(d_centerValue)<=d_precision)
	{
		return (d_left+d_right)/2;
	}
	//精度不够递归求解
	else
	{
		double d_leftValue=CalculateEquation(dp_array,i_degree,d_left);
		double d_rightValue=CalculateEquation(dp_array,i_degree,d_right);
		if (d_leftValue*d_centerValue<0)
		{
			return	Bisection(dp_array,i_degree,d_left,(d_left+d_right)/2,d_precision);
		}                                                                              
		else                                                                            
		{
			return Bisection(dp_array,i_degree,(d_left+d_right)/2,d_right,d_precision);
		}	
	}
}
/*! @function
********************************************************************************
<PRE>
函数名   : double* Divide(const double* dp_Upper,const double* dp_Lower , int i_degree)
功能     : 输入dp_Upper为被除式,dp_Lower为除式,i_degree为输入的方程次数
参数     : 
返回值   : double* 返回余式
抛出异常 : 
--------------------------------------------------------------------------------
备注     : 
典型用法 : 
--------------------------------------------------------------------------------
作者     : <xxx>
</PRE>
*******************************************************************************/
double* Divide(const double* dp_UpperOriginal,const double* dp_Lower , int i_degree)
{
	int i=0;
	int i_UpperDegree=i_degree;
	int i_LowerDegree=i_degree;

	double*dp_Upper=new double[i_degree+1];
	for (i=0;i<=i_degree;i++)
	{
		dp_Upper[i]=dp_UpperOriginal[i];
	}
	//获取输出两个式子的次数
	for (i=0;i<=i_degree;i++)
	{
		if (fabs(dp_Upper[i])<=1e-6)  // if(fabs(dp_Upper[i])<1e-6)?有必要没?
		{                        
			i_UpperDegree--;     
		}                        
		else                      
		{
			break;
		}
	}
	for (i=0;i<=i_degree;i++)
	{
		if (fabs(dp_Lower[i])<=1e-6)  // if(fabs(dp_Lower[i])<1e-6)?有必要没?
		{
			i_LowerDegree--;
		}
		else
		{
			break;
		}
	}
	int j=0;
	double temp=0.0;
	while (true)
	{
		j=i_degree-i_UpperDegree;
		temp=dp_Upper[i_degree-i_UpperDegree];
		for (i=i_degree-i_LowerDegree;i<=i_degree;i++)
		{
			dp_Upper[j]=dp_Upper[j]-(temp*dp_Lower[i])/dp_Lower[i_degree-i_LowerDegree];
			j++;
		}
		i_UpperDegree=i_degree;
		for (i=0;i<=i_degree;i++)
		{
			if (fabs(dp_Upper[i])<=1e-6)// if(fabs(dp_Upper[i])<1e-6)?dp_Upper[0]必是0.0,但dp_Upper[1]不一定0.0,这时近似是0?
			{                          //如:// 3 3.000001   
				i_UpperDegree--;            //- 3 3
			}                               //-------------
			else                             // 0  0.000001
			{
				break;
			}
		}
		if (i_UpperDegree<i_LowerDegree)
		{
			break;
		}
	}

	for (i=0;i<=i_degree;i++)
	{
		dp_Upper[i]=-dp_Upper[i];
	}
	return dp_Upper;
}

/*! @function
********************************************************************************
<PRE>
函数名   : 
功能     : 
参数     : 
返回值   : 
抛出异常 : 
--------------------------------------------------------------------------------
备注     : 
典型用法 : 
--------------------------------------------------------------------------------
作者     : <xxx>
</PRE>
*******************************************************************************/
double* NewEquation(const double* dp_UpperOriginal,double* dp_Lower , int i_degree)
{
	int i=0;
	int i_UpperDegree=i_degree;
	int i_LowerDegree=i_degree;
	
	double*dp_Upper=new double[i_degree+1];
	for (i=0;i<=i_degree;i++)
	{
		dp_Upper[i]=dp_UpperOriginal[i];
	}
	//获取输出两个式子的次数
	i_UpperDegree = GetDegree(dp_Upper,i_degree);
// 	for (i=0;i<=i_degree;i++)
// 	{
// 		if (fabs(dp_Upper[i])<=1e-6)  // if(fabs(dp_Upper[i])<1e-6)?有必要没?
// 		{                        
// 			i_UpperDegree--;     
// 		}                        
// 		else                      
// 		{
// 			break;
// 		}
// 	}
	i_LowerDegree = GetDegree(dp_Lower, i_degree);
// 	for (i=0;i<=i_degree;i++)
// 	{
// 		if (fabs(dp_Lower[i])<=1e-6)  // if(fabs(dp_Lower[i])<1e-6)?有必要没?
// 		{
// 			i_LowerDegree--;
// 		}
// 		else
// 		{
// 			break;
// 		}
// 	}
	int j=0;
	double temp=0.0;
	double * dp_equation;
	int i_newDegree = i_UpperDegree-i_LowerDegree;
	dp_equation = new double [i_newDegree+1];
	for (int k=0;k<=i_newDegree;k++)
	{
		j=i_degree-i_UpperDegree;
		temp=dp_Upper[i_degree-i_UpperDegree];
		for (i=i_degree-i_LowerDegree;i<=i_degree;i++)
		{
			dp_Upper[j]=dp_Upper[j]-(temp*dp_Lower[i])/dp_Lower[i_degree-i_LowerDegree];
			j++;
 		}
		i_UpperDegree--;
// 		i_UpperDegree=i_degree;
// 		for (i=0;i<=i_degree;i++)
// 		{
// 			if (fabs(dp_Upper[i])<=1e-6)// if(fabs(dp_Upper[i])<1e-6)?dp_Upper[0]必是0.0,但dp_Upper[1]不一定0.0,这时近似是0?
// 			{                          //如:// 3 3.000001   
// 				i_UpperDegree--;            //- 3 3
// 			}                               //-------------
// 			else                             // 0  0.000001
// 			{
// 				break;
// 			}
//  		}
		dp_equation[k] = temp/dp_Lower[i_degree-i_LowerDegree];
	}                                                          
	i_degree = i_newDegree;
	return dp_equation;
}

/*! @function
********************************************************************************
<PRE>
函数名   : void Sturm(double* dp_equation,int i_degree,double** &dp_sturm)
功能     : 计算sturm数组
参数     : double* dp_equation [in],int i_degree [in],double** &dp_sturm [out]
返回值   : void
抛出异常 : 
--------------------------------------------------------------------------------
备注     : 
典型用法 : Sturm(dp_equation,i_realDegree,dp_sturm);

⌨️ 快捷键说明

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