牛顿法和割线法
//本程序基于.NET平台,编译环境是Microsoft Visual C++ .NET
//对于VC++6.0平台的修改,只须把stdafx.h换成iostream.h,然后去掉主函数里的“using namespace std”
//关于计数器的设计代码,需要动大手术,以优化代码,使之简洁
#include <stdafx.h>
#include <math.h>
#define eps 1e-6 //精度
using namespace std;
int ge=1;
double f(double x) //方程
{
double p=x*x+2*x-3;
return p;
}
double gexian(double xk0,double xk) //迭代函数,割线法
{
ge++;
double xk1;
cout<<"xk0="<<xk0<<'/n'<<"xk="<<xk<<'/n';
//迭代公式
xk1=xk-f(xk)*(xk-xk0)/(f(xk)-f(xk0));
//迭代替换
xk0=xk;
xk=xk1;
//
cout<<"xk1="<<xk1<<'/n'<<endl;
//判断是否继续迭代运算
while(fabs(f(xk1))>eps) xk1=gexian(xk0,xk);
// cout<<"迭代次数为:"<<ge<<endl;
return xk1;
}
double newton(double x) //迭代函数,牛顿法
{
double tem;
tem=x-(x*x+2*x-3)/(2*x+2);
return tem;
}
double main_gexian() //主函数
{
cout<<"割线法/n";
cout<<"输入一个字母(e退出):";
char exit;//定义出口
cin>>exit;
cout<<"说明:输入两个不相等的数。/n";
double x_k0,x_k,tmp_1;
while(exit!='e')
{
cout<<"输入两个数:";//初值
cin>>x_k0>>x_k;
//根
tmp_1=gexian(x_k0,x_k);
cout<<"根为"<<tmp_1<<'/n';
//出口
cout<<"迭代次数为:"<<ge<<endl;
cout<<"输入字母(e退出):";
cin>>exit;
}
return 0;
}
double main_newton() //主函数
{
cout<<"牛顿法/n";
cout<<"说明:输入一个非-1的数。输入-1退出……"<<'/n';
cout<<"输入:";
double s;
cin>>s;
cout<<endl;
while(s!=-1)
{
int count1=0,count2=0;//计数值
while(s!=-1) //正区间运算
{
double tmp_x=newton(s);
double f_x=f(tmp_x);
count1++;
if(fabs(f_x)<eps)
{
cout<<'/n'<<'/n'<<"x1="<<tmp_x;
cout<<" 运算次数为:"<<count1<<'/n'<<endl;
break;
}
else
{
cout<<"x_1="<<tmp_x<<'/n';
newton(tmp_x);
}
s=tmp_x;
};
double s0=s*(-1)-1; //将输入数转化到以-1为分界点的两个区间
if(s==0) s0=-2;
while(s0!=-1)//负区间运算
{
double tmp_y=newton(s0);
double f_y=f(tmp_y);
count2++;
if(fabs(f_y)<eps)
{
cout<<'/n'<<'/n'<<"x2="<<tmp_y;
cout<<" 运算次数为:"<<count2<<'/n';
break;
}
else
{
cout<<"x_2="<<tmp_y<<'/n';
newton(tmp_y);
}
s0=tmp_y;
};
cout<<"/n输入:";
cin>>s;
};
if(s==-1) cout<<"结束!";//判断除法可行性
return 0;
}
double main()
{
char select;
while(1)
{
cout<<"选择迭代方式/n(a为割线法,b为牛顿法,c退出):";
cin>>select;
cout<<'/n';
if(select=='a')
{
main_gexian();
}
else if(select=='b')
{
main_newton();
}
else if(select=='c') break;
}
return 0;
}

浙公网安备 33010602011771号