📄 math.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 + -