我有两个带有两个未知数的非线性方程,即tau
和p
。两个方程是:
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 ++的新手,所以有人可以帮助我。 提前致谢
答案 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++?