二分法的MATLAB和C++代码
数值分析学习(一)
二分法(Bisection method) 是将区间一分为不断二寻找数值解方法。
设[a,b]为方程解存在的闭区间,逐次二分法就是不断构造如下的区间([a(n),b(n)]),初始值a0=a,b0=b,且对任一自然数n,[a(n+1),b(n+1)]或者等于[a(n),c(n)],或者等于[c(n),b(n)],以此来缩小数值解存在的区间,最终找出数值解,其中c(n)表示[a(n),b(n)]的中点。
MATLAB语言:
function f=half(f,a,b)
%y=f,给出函数f(x)的表达式
%i=0; 二分次数记数
%a=a; %求根区间左端
%b=b; %求根区间右端
i=0;%迭代次数
fa=f(a); %计算f(a)的值
fb=f(b); %计算f(b)的值
c=(a+b)/2; %计算区间中点
fc=f(c); %计算区间中点f(c)
while abs(fc)>=ε; %判断f(c)是否为零点
if fa*fc>=0; %判断左侧区间是否有根
fa=fc;
a=c;
else fb=fc;
b=c;
end
c=(a+b)/2;
fc=f(c);
i=i+1;
end
C++语言:
#include <iostream>
#include <cmath>
using namespace std;
double y(double x);
const double Accu = pow(10.0, -3.0); // 定义误差——即精确度
int main()
{
double a, b, c;
a = b = c = 0;
do
{
cout << "输入一个范围的最小值和最大值: \n";
cin >> a >> b;
} while (!cin || y(a) * y(b) >= 0); // 没有输入或者 f(a) * f(b) >= 0
do
{
c = (a + b) / 2.0; // c是a,b中点
if (y(a) * y(c) < 0)
b = c;
else if (y(b) * y(c) < 0)
a = c;
else
break;
} while ( abs(y(c)) > Accu); // 判断是否满足精度要求
cout << "Solution: " << c;
return 0;
}
double y(double x) //得到方程的函数
{
return (12 - 6 * x * x + 6 * x - 6);
return 0;
}