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

📄 math.cpp

📁 非线性方程求根的各种算法的比较
💻 CPP
字号:
//求非线性方程的根
//程序中共给出了以下几种方法求非线性方程的根
//  (1)二分法 (2)牛顿法 (3)普通迭代法 (4)斯蒂芬森迭代法 (5)弦截法
//程序中用到的函数为: f(x)=x^3-x-1
//其中:(1)普通迭代法用的迭代函数为:x=(x+1)^(1/3)
//     (2)斯蒂芬森迭代法用的迭代函数为:x=x^3-1

#include "iostream.h"
#include  <math.h>

int Num;   //全局变量 保存迭代次数
int flag=0;//全局标示符 
           //flag=1时标示发生了函数微分值为零,不能在继续计算(主要针对牛顿迭代法)
           //flag=2标示牛顿迭代法中超过最大迭代次数,迭代失败

float fFunction(float); //函数f(x)
float fFunWeifen(float);//函数f(x)的导函数f'(x)
float fFunDiedai(float);//斯蒂芬森迭代法用的迭代函数
float fFunComonDiedai(float);//普通迭代法用的迭代函数
float ErFenMethold(float,float,float);//二分法
float Newton(float,float,int);//牛顿法
float Steffensen(float,float,float);//斯蒂芬森迭代法
float DiedaiMethold(float,float,float);//普通迭代法
float XianjieMethold(float,float,float,float);//弦截法

void main()
{
	float cdd;
	cout<<"(1)二分法求非线性方程的根"<<endl;
	cout<<"k"<<"  "<<"a1"<<"    "<<"b1"<<"   "<<"x"<<endl;
	ErFenMethold(1,1.5,0.00001);

	cout<<endl;
	cout<<"(2)牛顿法求非线性方程的根"<<endl;
	Newton(1.25,0.00001,100); //设定最大迭代次数为10次

	cout<<endl;
	cout<<"(3)普通迭代法求非线性方程的根"<<endl;
	DiedaiMethold(1.5,0.00001,1000);

	cout<<endl;
	cout<<"(4)斯蒂芬森迭代法求非线性方程的根"<<endl;
	Steffensen(1.25,0.00001,100);  //设定最大迭代次数为10次

	cout<<endl;
	cout<<"(5)弦截法求非线性方程的根"<<endl;
	XianjieMethold(1.25,1.29,0.00001,100);
}

//二分法
float ErFenMethold(float a,float b,float xlon) 
{
	float result,a1,b1,y,y0,x;
	a1=a;
	b1=b;
	y0=fFunction(a);
	int k=0;
	do 
	{
		x=(a1+b1)/2;
		y=fFunction(x);
		if ((y*y0) > 0)
		a1=x;
		else
		b1=x;
		k++;
		cout<<k<<"  "<<a1<<"  "<<b1<<"  "<<x<<endl;
	} while ((b1-a1)>=xlon);
	result=x;
	Num=k;
	return result;//返回结果
}

//牛顿迭代法
float Newton(float x0,float xlon,int N) 
{
	int k=1;
	float result,x1;
	for (k;k<N;k++)
	{
		if (fFunWeifen(x0)==0)
		{
			flag=1;
			return 0;
		}
		else
		{
			x1=x0-fFunction(x0)/fFunWeifen(x0);
			if (fabs(x1-x0)<xlon)
			{
				result=x1;
				cout<<k<<"  "<<result<<endl;
				return result;
			}
			x0=x1;
		}
	}
	if (k==N)
	{
		flag=2;
		cout<<" !!!此种情况下迭代法不收敛"<<endl;
		return 0;
	}
	
}

//普通迭代法
float DiedaiMethold(float x0,float xlon,float N)
{
	float result;
	int k=0;
	float x,x1;
	x1=x0;
	for (k;k<=N;k++)
	{
		x=fFunComonDiedai(x1);
		if (fabs(x-x1)<xlon)
		{
			result=x;
			cout<<k<<"  "<<result<<endl;
			return result;
		}
		x1=x;
	}
	if (k=N)
	{
		cout<<" !!!此种情况下迭代法不收敛"<<endl;
	}
}

//斯蒂芬森迭代法
float Steffensen(float x0,float xlon,float N)
{
	float result;
	float x,x1;
	int k=0;
	x1=x0;
	for (k;k<=N;k++)
	{
		x=x1-(fFunDiedai(x1)-x1)*(fFunDiedai(x1)-x1)/(x1-2*fFunDiedai(x1)+fFunDiedai(fFunDiedai(x1)));
		if (fabs(x-x1)<xlon)
		{
			result=x;
			cout<<k<<"  "<<result<<endl;
			return result;
		}
		x1=x;
	}
	if (k=N)
	{
		cout<<" !!!此种情况下迭代法不收敛"<<endl;
	}

}

//弦截法
float XianjieMethold(float x1,float x2,float xlon,float N)
{
	float result;
	int k=0;
	float xFirst,xSecond,xThird;
	xFirst=x2;
	xSecond=x1;
	for (k;k<=N;k++)
	{
		xThird=xSecond-fFunction(xSecond)*(xSecond-xFirst)/(fFunction(xSecond)-fFunction(xFirst));
		if (fabs(xThird-xSecond)<xlon)
		{
			result=xThird;
			cout<<k<<"  "<<result<<endl;
			return result;
		}
		xFirst=xSecond;
		xSecond=xThird;
	}
	if (k=N)
	{
		cout<<" !!!此种情况下迭代法不收敛"<<endl;
	}
}

//初始给定的函数f(x)
float fFunction(float x)
{
	float result;
	result=x*x*x-x-1;
	return result;
}
float fFunComonDiedai(float x)
{
	float result;
	result=pow(x+1,0.3333);
	return result;
}

float fFunDiedai(float x)
{
	float result;
	result=x*x*x-1;
	return result;
}

//函数f(x)的导函数f'(x)
float fFunWeifen(float x)
{
	float result;
	result=3*x*x-1;
	return result;
}

⌨️ 快捷键说明

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