基本思想:
对f (x)任选一个初始点a1及初始步长h, 通过比较这两点函数值的大小,确定
第三点位置,比较这三点的函数值大小,确定是否为 “高—低—高” 形态。
(1)选定初始点a, 初始步长h=h0,计算 y1=f(a1),
y2=f(a1+h)。
(2)比较y1和y2。
(a)如y1>y2, 向右前进;加大步长 h=2h ,转 (3)向前;
(b)如y1
值互换。转 (3)向后探测;
(c)如y1=y2,极小点在a1和a1+h之间。
(3)产生新的探测点a3=a1+h,y3=f(a3);
(4) 比较函数值 y2 与y3:
(b)如y2>y3, 加大步长 h=2 h ,a1 a2,
a2 a3,转 (3)继续探测。
(a)如y2
a min[a1,a3], b max[a3,a1],函数最小值所在的区间为[a, b] 。
我编的修改
#include
#include
#definef(x) 3*x*x*x-4*x+2
main()
{double f1,f2,f3,temp,x1,x2,x3,h,a,b,Y1,Y2,A,A1,A2,e 0.2;
intn;
printf("x1 ");
scanf("%lf",&x1);
printf("h ");
scanf("%lf",&h);
f1 f(x1);
x2 x1+h;
f2 f(x2);
if(f1 f2)
a x1
b x1>(x1+h)?x1:x1+h;
if(f2>f1)
{h -h;
temp x1;x1 x2;x2 temp;
temp f1;f1 f2;f2 temp;
x3 x2+h;
f3 f(x3);
}
else if(f2
{ h 2*h;
x3 x2+h;
f3 f(x3);
}
while(f2>f3)
{ x1 x2;
x2 x3;
f2 f(x3);
x3 x2+h;
f3 f(x3);
}
a x1
b x1>x3?x1:x3;
printf("[%f,%f]\n",a,b);
A1 b+0.328*(b-a);Y1 f(A1);
A2 a+0.618*(b-a);Y2 f(A2);
do {
n++;
if(!(Y1
{
a A1;
A1 A2;
Y1 Y2;
A2 a+0.618*(b-a);
Y2 f(A2);
}
else
{
b A2;
A2 A1;
Y2 Y1;
A1 b+0.382*(b-a);
Y1 f(A1);
}
} while ((a-b)> e||(a-b)< -e);
A (a+b)*0.5;
printf("A %lf\n",A);