線性方程求根

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章