牛顿法和割线法

//本程序基于.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;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值