Problem I. L03-09 二分法求方程的根

//前文解析:

                二分法是求方程近似解的一种简单直观的方法,设函数f(x)在[a,b]上连续,且f(a)*f(b)<0,则表明f(x)在[a,b]上至少有一个零点(零点定理&&介值定理).然后通过二分区间,缩小区间范围,当小到一定的精确度的时候,这个x就是我们所求的近似根了.

局限性:1、只能求一个零点   2、二分法只能计算方程的实根,如果没有零点就尴尬了

//题目:

用二分法求方程2x^3-4x^2+3x-6=0在区间(一10,10)之间的根。

输入

输出

要求误差小于10^-6

样例

标准输入复制文本
 
标准输出复制文本
2.000000

本题AC代码

#include <bits/stdc++.h>
const double eps = 1e-6; //定义我们计算的精度

double f(double x) //定义我们的函数
{
	return 2*x*x*x+(-4)*x*x+3*x-6;
}

int main()
{
    double m=-10,n=10,i;//求根区间[m,n],中点i
    
      while(fabs(m-n)>eps)
       {
          i=(m+n)/2.0;//i是中点,要在循环里面写!
		           
          if(f(i)*f(m)<0)
          {
              n=i; //修正区间,将[m,n]换成[m,i]
          }  
          
          else if(f(i)*f(n)<0)
          {
              m=i;//修正区间,将[m,n]换成[i,n]
          }
       }
    printf("%.6lf",i);
}

 

这里是借鉴了 WUST_CST_1501班大佬的思路,他的代码更完整,所以我贴上了,大家可以看看

/********************************************
    > File Name: Binary.c
    > Author:chendiyang
    > School:WUST_CST_1501班
    > Myblog:www.chendsir.com
    > Mail:1441353519@qq.com 
    > Created Time: 2017年04月18日 星期二 23时55分13秒
 **************************************************/
#include <stdio.h>
#include <math.h>

const double eps = 1e-6; //定义我们计算的精度
double a,b,c,d;        //假定我们输入的函数是一元三次方程组,a*x*x*x+b*x*x+c*x+d=0

double f(double x) //定义我们的函数
{
return a*x*x*x+b*x*x+c*x+d;
}

int main()
{
    double m,n;//求根区间[m,n]
    double i,j,sum;
    printf("请输入一元三次方程组的系数:a,b,c,d:");
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    printf("\n请输入求根区间[m,n]:");
    scanf("%lf%lf",&m,&n);
    if(f(m)*f(n)<0)
    {
        while(fabs(m-n)>eps)
        {
          i=(m+n)/2.0;
          sum=f(i);
          printf("[%lf  %lf]\n",m,n);
          if(fabs(sum)<eps)
           {
               break;
            //printf("\n该方程组的近似根为:x2*=%lf\n",i);
            //return 1;
           }
          else if(f(i)*f(m)<0)
          {
              n=i; //修正区间,将[m,n]换成[m,i],这里的i是中点
          }  
          else if(f(i)*f(n)<0)
          {
              m=i;//修正区间,将[m,n]换成[i,n],这里的i是中点
          }
        }
    }   
    j=(m+n)/2;
    printf("\n该方程组的近似根为:x*=%lf\n",j);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值