一、二分法
对于一个连续函数f(x),若它有根,显然在根的两边会改变符号。假设在区间[a,b]有根,那么应该有f(a)*f(b)≤0;在二分法中,我们只需要找该区间的中点c=(a+b)/2,利用根的两边符号改变去不断取中值,使得点迫近根。
二分法定理这不作过多叙述
在了解大概后,我们还需要知道何时需要终止程序的运行:
终止条件主要取决于这几个方面
1、迭代次数的限制
int n = floor((log(b - a) - log(0.5 * pow(10, -d))) * 1.0 / log(2));
2、当f©=0时或区间[a,b]的大小(b-a)/2小于半个精度
if (c1 == 0 || (b - a) / 2 < 0.5 * pow(10, -d))
二分法例题
【问题描述】如果在240个月内每月付款300美元,使用二分法在利率区间[a,b] 内,求能够满足在这240个月之后使本金和利息的总值达到50万美元的利率值,精确到小数点后第d位。
【输入形式】在屏幕上输入3个数,依次为利率区间左端点值a、右端点值b和精确到小数点后d位。各数间都以一个空格分隔。测试用例的输入满足:b>a>0, 1<=d<=8, d为正整数。若在区间[a, b]内没有根,则输出error。
【输出形式】输出两行数据,第一行为迭代次数,第二行为求得的利率,保留d位小数。
【样例1输入】
0.15 0.16 8
【样例1输出】
20
0.15753931
【样例说明】输入:左端点值为0.15,右端点值为0.16,求得的利率精确到小数点后8位。输出:表示经 20 次迭代,求得满足条件的利率值为 0.15753931。
AC代码:
C++:
/*
* @Author: your name
* @Date: 2021-03-04 09:22:52
* @LastEditTime: 2021-03-04 12:16:20
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \code_formal\course\cal\01_2.cpp
*/
#include <iostream>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <string.h>
#include <string>
#include <cmath>
#include <map>
#include <vector>
#include <cstdio>
typedef long long int ll;
using namespace std;
double f(double c