线性方程求根

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bengshakalakaka/article/details/82946278

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

猜你喜欢

转载自blog.csdn.net/bengshakalakaka/article/details/82946278