黄金分割算法求极值迭代的最终判断是两次函数值的结果差是否很小,如果小,则说明该处函数的斜率很小,就是一个极值点。
过程如下:
以下是代码:
//黄金分割法!
/*
================================================================
题目:用黄金分割法求解3*x*x*x-2*x*x-16=0的根。
================================================================
*/
#include<stdio.h>
#include <math.h>
#define E 0.5 //精度
//方程的解,可以通过修改方程求解不同的问题
double hs(double x)
{
return x*x-x+2;
}
double gen(double a, double b) //黄金分割算法求解函数,a为左区间,b为右区间
{
double g,a1,b1;
g = (sqrt(5) - 1.0) / 2; //黄金分割的值
a1 = a + (1 - g)*(b - a);
b1 = a + g * (b - a);
while (fabs(b-a) > E)
{
if (hs(a1)>hs(b1))
{
a = a1;
a1 = b1;
b1= a + g * (b - a);
}
else
{
b = b1;
b1 = a1;
a1= a + (1 - g)*(b - a);
}
}
return (a+b)/2;
}
int main()
{
double a, b, t, fa, fb;
printf("输入估计区间: a="); //左区间
scanf("%lf", &a);
printf("输入估计区间: b="); //有区间
scanf("%lf", &b);
t = gen(a, b);
printf("解得:(%.4lf,%0.4lf) ", t,hs(t));
return 0;
}
结果: