最優化方法-精準一維搜尋(區間消去思想)
阿新 • • 發佈:2020-12-27
技術標籤:人工智慧
如圖,設計函式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即為所求