这个太简单了,直接上代码……
// 二分法求解非线性方程
// f: 函数
// y: 对应的y值
// a-b: x 值所在的区间
// eps: x 的精确度
// eta: y 的精确度
// 返回值: 在 [a,b] 区间内使 |f(x)-y|<eps 成立的 x 值。
double binarySolve(
NA::functionDP_DP f,
double y,
double a, double b,
double eps,
double eta
) {
double ascending = f(a)<f(b); // 递增?
if (ascending) {
NA_ASSERT ( (f(a)<y && y<f(b)) || !"No solution!" );
} else {
NA_ASSERT ( (f(a)>y && y>f(b)) || !"No solution!" );
}
double x=(a+b)/2.0, y0;
for(y0 = f(x); fabs(y0-y)>=eta; x=(a+b)/2.0 ) {
y0 = f(x);
if ( y0>y ) {
if (ascending)
b=x;
else
a=x;
} else {
if (ascending)
a=x;
else
b=x;
}
if ( b-a<=eps )
return a;
}
return x;
}
OVER
转发至微博
转发至微博
评论