`

牛顿迭代--高斯方程求解

 
阅读更多

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;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics