实现黄金分割法的步骤包括:
- 确定初始区间[a,b]和精度epsilon
- 求出[x1,x2],x1和x2分别为a与b的黄金分割点。
- 如果f(x1)<f(x2),则b=x2,否则a=x1 (f(x)为要求的函数)
黄金分割法的示例代码如下所示:
public static double goldenSection(Function<Double, Double> f,double a,double b, double eps){
double x1=a+(3-Math.sqrt(5))*(b-a)/2;
double x2=a+b-x1;
double fx1=f.apply(x1);
double fx2=f.apply(x2);
while((b-a)>eps) {
if(fx1<fx2) {
b=x2;
//重新计算x1,x2并求函数值
x2=x1;
x1=a+b-x2;
fx2=fx1;
fx1=f.apply(x1);
}else {
a=x1;
//重新计算x1,x2并求函数值
x1=x2;
x2=a+b-x1;
fx1=fx2;
fx2=f.apply(x2);
}
}
return (a+b)/2;
}
下面是两条用goldenSection函数求两个函数f1(x)和f2(x)全局最小值的示例代码:
//第一条示例代码
Function<Double, Double> f1=x->Math.pow(x, 2)+5*Math.sin(x);
double a1=0;
double b1=10;
double eps1=0.01;
double result1=goldenSection(f1,a1,b1,eps1);
System.out.println("f1(x)的全局最小值为:"+result1);
//第二条示例代码
Function<Double, Double> f2=x->Math.pow(x-2, 2)*Math.pow(Math.E, -Math.pow(x, 2));
double a2=-3;
double b2=3;
double eps2=0.0001;
double result2=goldenSection(f2,a2,b2,eps2);
System.out.println("f2(x)的全局最小值为:"+result2);
第一条示例代码中,要求f1(x)=x^2+5sin(x)的全局最小值,初始区间为[0,10],精度为0.01;第二条示例代码中,要求f2(x)=(x-2)^2 * e^(-x^2)的全局最小值,初始区间为[-3,3],精度为0.0001。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现黄金分割法的示例代码 - Python技术站