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