y = alnx + x + x*x + x *x *x + Math.pow(x,0.021222) + Math.exp(x) = 0
这个方程无法用常规的求导等方法求出,也没有固定的求解公式。
这个时候就需要算法来 求解、利用牛顿迭代能很好的求解。
具体公式可以百度下
x n+1 = x n + f(x n)/f(x n)'
依次迭代下去,知道 |x n+1 - x n| < 0.000001 (精确度值) 这个时候得到的X n+1 即为解
当然这里涉及到一个初始的x n 在此我们定义为 x 0
x 0的选取,理论上来讲应该是个随意的值。但是由于曲线的情况是各种各样的。
一个固定的x0 无法满足我们的需求,这个时候我们就需要根据具体的情况变动x0的值,迭代至一个固定的深度,仍然无解,这个时候我们更换x0,如果继续无解,继续更换。知道找到一个满足的解为止,当然这是在确定必然有解的情况下。为防死循环,我们还是要加一个总得迭代深度。
如下是项目的部分算法:
double x0 = 2;
if(B > 0) {
x0 = 100000;
} else {
x0 = 0.000001;
}
double xx = 0.000000001;
double x1 = diedai(x0, A, B, a, b);
if((Double.isNaN(x1) || x1 < 0) && x0 == 100000) {
x1 = 0.000001;
} else if ((Double.isNaN(x1) || x1 < 0) && x0 == 0.000001) {
x1 = 100000;
}
int i = 0;
; double xvar = 1;
while (Math.abs(x1 - x0) > xx) {
i ++;
if(i == 100000) {
x1 = a;
break;
}
double temp = x0;
x0 = x1;
x1 = diedai(x0, A, B, a, b);
if(x1 < 0 || x1 == temp) {
xvar ++;
x1 = xvar;
}
}
return x1;