用C ++求解两个带有两个未知数的非线性方程组

时间:2015-06-04 14:19:04

标签: c++ matlab

我有两个带有两个未知数的非线性方程,即taup。两个方程是: p=1-(1-tau).^(n-1)tau = 2*(1-2*p) ./ ( (1-2*p)*(W+1)+(p*W).*(1-(2*p).^m))

我有兴趣找到tau的价值。我如何使用c ++代码找到这个值,我使用MATLAB完成了这个,这里是我使用的代码:

function result=tau_eq(tau)

n=6;
W=32;
m=5;

p=1-(1-tau).^(n-1);
result=tau - 2*(1-2*p) ./ ( (1-2*p)*(W+1)+(p*W).*(1-(2*p).^m));

Statement at the command window:
result=fzero(@tau_eq,[0,1],[])

因为我是C ++的新手,所以有人可以帮助我。 提前致谢

1 个答案:

答案 0 :(得分:1)

1.函数fzero解决非线性方程而不是方程组。

2.最简单的方法是二分法。这是其等式实现的变体。

#include <iostream>
#include <cmath>
#include <functional>

std::pair<bool,double> SimpleSolve(std::function<double(double)> &func,
                                   const double xbegin,
                                   const double xend);
int main()
    {
    std::function<double(const double)> func = [](const double &tau)
        {
        auto n=6;
        auto W=32;
        auto m=5;

        auto p=1-pow((1-tau),(n-1));
        return tau - 2*(1-2*p) / ( (1-2*p)*(W+1)+(p*W)*(1-pow((2*p),m)));
        };
    auto R = SimpleSolve(func,0,1);
    if(R.first)
        std::cout<<R.second<<std::endl;
    else 
        std::cout<<"Error"<<std::endl;
    return 0;
    }

std::pair<bool,double> SimpleSolve(std::function<double(double)> &func,
                                   const double xbegin,
                                   const double xend)
    {
    double a=xbegin;
    double b=xend;
    const double epsilon=0.0001;
    const double delta=0.0001;
    double f1=func(a);
    int it=0;
    while(true)
        {
        ++it;
        double c=(b+a)/2;
        if((b-a)<epsilon*2.0)
            return std::make_pair(true,c);

        if(fabs(func(c))<delta)
            return std::make_pair(true,c);
        ((func(a)*func(c))<0) ? b=c : a=c ;
        if(it>1000)
            {
            return std::make_pair(false,c);
            }
        }
    }

3。在Matlab帮助函数中写道:

  

由T. Dekker创建的算法使用二分法的组合,   割线和逆二次插值方法。 Algol 60   在Brent,R.,Algorithms for中给出了一些改进的版本   最小化没有衍生物,Prentice-Hall,1973年。一个Fortran   fzero所依据的版本是Forsythe,G。E.,M。A.   Malcolm和C. B. Moler,数学计算机方法   计算,Prentice-Hall,1976。

你可以实现它。

4.看到这个问题: What good libraries are there for solving a system of non-linear equations in C++?