線性方程求根
阿新 • • 發佈:2018-11-18
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