Nwafu-OJ-1506 Problem 9 阶段2考试题目3 二分法解方程

问题 : 阶段2考试题目3 二分法解方程

时间限制: 1 Sec  内存限制: 128 MB
提交: 4537  解决: 1017
[提交][状态][讨论版]

题目描述

编写程序,用非线性方程二分法求解函数BiRoot(),求任意方程f(x)=0在区间[a,b]之间的一个解,精确到10-6。
函数原型为:double BiRoot(double (*fun)(double), double, double)。
二分法求解的基本思路如下图所示,对于区间[a,b]上连续且f(a)•f(b)<0的函数y=f(x),通过计算a,b中点的函数值,不断把区间一分为二,并舍弃无解的半段区间,并更新a,b,使两个端点逐步逼近零点,迭代的终止条件是计算的函数值小于10-6,最终得到符合精度要求的近似解。
例:如a=-5, b=0,且f(x)= x3-10x2+3x+20.0则函数返回-1.209
如a=0, b=3, 且f(x)= x3-6x-1则函数返回2.529

提示

f(a)•f(b)>0,则意味着方程在[a,b]之间可能无解,输出信息“error! a,b have the same sign.\n”后,可直接结束程序。

该题目可参考教材P317,tabulate.c代码。

代码实现

#define _CRT_SECURE_NO_WARNINGS 1

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

double BinarySearch(double (*f)(double),double, double);
double BiRoot(double (*f)(double), double a, double b);

double BinarySearch(double (*f)(double),double a, double b)
{
    double x;

    x = (a + b) / 2.0;
    if (x - a < 1E-6)   /* 此处填空 */
        return x;
    else
    {
        if (f(a) * f(x) > 0)
            return BinarySearch(f,x, b);    /* 此处填空 */
        else
            return BinarySearch(f,a, x);    /* 此处填空 */
    }
}

double BiRoot(double (*f)(double), double a, double b) {
        double x;

        scanf("%lf%lf", &a, &b);
        if (f(a) * f(b) > 0)     /* 此处填空 */
        {
            printf("error! a,b have the same sign.\n");
            return -1;
        }
        x = BinarySearch(f, a, b);  /* 此处填空 */
        return x;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值