如图,设计函数f(x) = x^2 - 4*x + 6;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
double f(double x){ // x^2 - 4*x + 6
return x * x - 4 * x + 6;
}
double getDouleRand(double aL, double aR){
double tmp = 0;
do{
tmp = (rand() % (int)(aR * 10000)) * 1.0 / 10000;
}while(!(tmp > aL && tmp < aR));
return tmp;
}
int main(){
srand(time(0));
double aL = 0;
double aR = 4;
while(aR - aL > 1e-3){
double a1 = getDouleRand(aL, aR);
double a2 = getDouleRand(a1, aR);
printf("%.4lf %.4lf %.4lf %.4lf\n",aL, a1, a2, aR);
if(f(a1) < f(a2)){
aR = a2;
}else{
aL = a1;
}
}
printf("%.2lf\n", (aL + aR) / 2);
}
可以根据区间消去思想,解决
问题迎刃而解。
如果需要区间缩减率:
double ita0 = aR - aL;
//计算后的aR, aL
double ita1 = aR - aL;
printf("itaK = %.2lf\n", ita1 / ita0);
itaK即为所求