C++版
1.二分法
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
using namespace std;
int num[100+5];//多项式系数
int n;
double ep;
double a,b;
double getval(double k)
{
double sum=num[0];
for(int i=0;i<n-1;i++)
{
sum=num[i+1]+sum*k;
}
return sum;
}
bool binary_solve(double &res,int &coun)//存取结果以及迭代次数
{
double x,fa,fb,fx;
int hh=0;
fa=getval(a);
fb=getval(b);
if(fa*fb>0)
{
return false;
}
while(abs(b-a)>ep)
{
x=(a+b)/2.0;
fx=getval(x);
if(fx*fa<0)
{
b=x;
fb=fx;
}
else
{
a=x;
fa=fx;
}
hh++;
}
res=(a+b)/2.0;
coun=hh;
return true;
}
int main()
{
double res;
int coun;
cout<<"总共有多少项:"<<endl;
cin>>n;//总共几项,最高项次数为n-1
cout<<"请依次从最高项输入系数:"<<endl;
for(int i=0;i<n;i++)
{
cin>>num[i];//高次位开始输入
}
cout<<"输入二分范围: "<<endl;
cin>>a>>b;
cout<<"输入精度:"<<endl;
cin>>ep;
if(binary_solve(res,coun))
{
cout<<"所求得的根为:"<<res<<endl;
cout<<"迭代次数:"<<coun<<endl;
}
else
{
cout<<"范围有毒"<<endl;
}
return 0;
}
Matlab版
1.二分法
function [x_star,k]=bs(f,a,b,ep)
% 二分法求解线性方程,f(x)=0
% a,b为初始区间端点
% x_star为所求的根,k为迭代次数
% 默认误差精度为1E-3
% 迭代次数为0表示次区间没有根存在
if nargin<3 % nargin代表函数输入参数个数
ep=1.0e-3;
end
%计算左端点值
fa=feval(f,a);
%计算右端点值
fb=feval(f,b);
if fa*fb>0
k=0;
x_star=[fa,fb];
return;
end
k=1;
while abs(b-a)/2>ep
x=(a+b)/2;
fx=feval(f,x);
if fa*fx<0
b=x;
fb=fx;
else
a=x;
fa=fx;
end
k=k+1;
end
x_star=(a+b)/2;
% 调用示例
% 假设我们求x^3-x-1=0这个式子在[1,1.5]这个区间里的根,要求误差不超过0.005
% 在Matlab中可以用inline把字符串转变成函数
>>f=inline('x^3-x-1');
>>[x_star,k]=bs(f,1,1.5,0.005)
x_star =
1.3242
k =
7