数值计算方法 牛顿迭代,简单迭代,二分法

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

double f1(double x);

void erfenfa(double a,double b)
{
 double root,fa,fb,froot;
 int i,act_b;
 fa=f1(a);
 fb=f1(b);
 if(fa*fb>0)
  {
   printf("方法错误。");
   exit(0);
  }
 for(i=1;i<=50;i++)
  {
   root=(a+b)/2;
   froot=f1(root);
   if(froot==0)
   {
    a=root;
    b=root;
   }
   else if(fb*froot>0)
   {
    b=root;
    fb=froot;
   }
   else
   {
    a=root;
    fa=froot;
   }
   if(fabs(b-a)<0.000001)
    break;
  }
  root=(a+b)/2;
  froot=f1(root);
  act_b=i;
  printf("root=%f  次数=%d",root,i);
 }

double g(double x)
 {
  return (pow((x+1),1.0/3.0));
 }

void iterate(double a,double b,double x0)
 {
  int k=1;
  double x1;
  while(k<=50)
  {
   x1=g(x0);
   if((x1<a)||(x1>b))
   {
    printf("有错误。");
    exit(0);
   }
   if(fabs(x1-x0)<0.00001)
   {
    //printf("成功。");
    printf("root=%10.6lf   ",x1);
    break;
   }
   x0=x1;
   k++;
  }
  printf("次数=%d/n",k);
  if(k>50)
   printf("方法错误。");
 }

double f1(double x)
 {
  return (x*x*x-x-1);
 }

double fdao(double x)
 {
  return (3*x*x-1);
 }

void f(double a,double b)
 {
  int k=1;
  double x,x0=1.5,temp1,tempd;
  while(k<=50)
  {
   temp1=f1(x0);
   tempd=fdao(x0);
   x=(x0-temp1/tempd);
   if(x<a||x>b)
   {
    printf("请另选值。");
    exit(0);
   }
   if(fabs(x-x0)<0.00001)
   {
    printf("%lf  次数=%d",x,k);
    break;
   }
   x0=x;
   k++;
  }

  if(k>50)
   printf("迭代次数达到上界,不收敛。/n");
  }
int main()
   {
   double a=0,b=2.0;
   int maxs=50;
   printf("二分法:");
   erfenfa(1,2);//二分法
   printf("/n");
   double a_jd=1.0,b_jd=2.0,x0=(a_jd+b_jd)/2;
   printf("简单迭代:");
   iterate(a_jd,b_jd,x0);//简单迭代
   printf("牛顿迭代:");
   f(1,2);//牛顿迭代
   printf("/n");
   return 0;
   } 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值