黄金分割法调试程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 黄金分割法求解的最小值,区间[-10,10],精度:0.001
c程序:
#include"stdio.h"
#include"math.h"
double eq(double x)
{double y;
y =8.0*x * x * x - 2.0 * x * x -7.0 * x + 3.0;
return y;
}
void main()
{
double a1,a2,a3,a4,f2,f3,x;
a1 =-10.0; // 左边界
a4 = 10.0; // 右边界
Lab1:
a3 = a1 + 0.618 * (a4 - a1);
f3 = eq(a3);
Lab2:
a2 = a1 + 0.382 * (a4 - a1);
f2 = eq(a2);
Lab3:
if (fabs(a4-a1) < 0.001)
{ x = (a1 + a4) / 2.0;
printf("x=%g fmin=%e \n",x,eq(x));
}
else
{
if (f2 < f3) {a4=a3; a3 = a2; f3 = f2; goto Lab2;};
if (f2 == f3) {a1=a2; a4=a3; goto Lab1;};
if (f2 > f3) {a1=a2; a2=a3; f2=f3;
a3 = a1 + 0.618*(a4-a1); f3=eq(a3); goto Lab3;};
};
}
运行结果:
2 黄金分割法求解的最小值,区间[-10,10],精度:0.001
Matlab程序:
●建立M文件:func.m
function f=func(x)
f = 8.0*x * x * x - 2.0 * x * x -7.0 * x + 3.0
●命令窗口:
a1 = -10 ; %左边界
a4 = 10 ; %右边界
e = 0.001 ; %精度
r = ( sqrt (5) -1 ) / 2 ; %即0.618
a2 = a1 + (1-r) * (a4 - a1) ;
a3 = a1 + r* (a4 - a1) ;
f2 = func (a2) ;
f3 = func (a3) ;
k = 1 ;
while ( abs (a4 - a1 ) >= e )
if f2 < f3 ;
a4 = a3 ;
a3 = a2 ;
f3 = f2 ;
a2 = a1 + (1-r) * (a4 - a1) ;
else
a1 = a2 ;
a2 = a3 ;
f2 = f3 ;
a3 = a1 + r* (a4-a1) ;
f3 = func (a3) ;
end
k+1 ;
end
x = ( a1 + a4 ) / 2
f = func ( x )
运行结果:
f = -96.8658
f = 80.5746
f =-1.1925e+003
f = -2.8893e+003
f = -4.4795e+003
f = -5.7048e+003
f = -6.5633e+003
f = -7.1345e+003
f = -7.5035e+003
f =-7.7377e+003
f =-7.8849e+003
f = -7.9768e+003
f = -8.0340e+003
f = -8.0694e+003 黄金分割算法框图f = -8.0914e+003
f = -8.1050e+003
f =-8.1134e+003
f = -8.1186e+003
f = -8.1218e+003
f = -8.1238e+003
f =-8.1250e+003
f =-8.1258e+003
f =-8.1262e+003
x = -9.9996
f = -8.1260e+003