Java实现黄金分割法的示例代码

实现黄金分割法的步骤包括:

  1. 确定初始区间[a,b]和精度epsilon
  2. 求出[x1,x2],x1和x2分别为a与b的黄金分割点。
  3. 如果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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java动态追踪技术探究之从JSP到Arthas

    Java动态追踪技术探究之从JSP到Arthas 背景介绍 在Java应用服务器中,如果出现了性能问题,我们需要通过一些工具来进行监控和追踪。常用的工具包括JProfiler,JVisualVM等,但是这些工具大多需要进行配置或者在启动时进行设置,并且需要连接到服务器上才能进行远程监控。基于这些问题,我们探究了一种新的Java动态追踪技术,该技术可以在不需要…

    Java 2023年6月15日
    00
  • Java实现计网循环冗余检验算法的方法示例

    让我详细介绍一下“Java实现计网循环冗余检验算法的方法示例”的攻略。这里我将分为以下几个方面进行讲解: 简介及算法原理 Java代码实现步骤 示例说明1 示例说明2 总结 1. 简介及算法原理 CRC(Cyclic redundancy check)即循环冗余校验码,是一种基于校验码的数据传输完整性检查方法。它能够检测出所有单个比特以及更多数量的比特出错。…

    Java 2023年5月19日
    00
  • java垃圾回收机制(面试)

    1.1堆空间结构   Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆。Eden 区、两个 Survivor 区 S0 和 S1 都属于新生代,中间一层属于老年代,最下面一层属于永久代。        1.2…

    Java 2023年4月27日
    00
  • Spring Boot 中starter的原理详析

    Spring Boot 中 Starter 的原理详析 在 Spring Boot 中,Starter 是一种特殊的依赖,它可以帮助开发人员快速地集成和配置一组相关的依赖。在本文中,我们将深入探讨 Spring Boot 中 Starter 的原理。 Starter 的基本概念 在 Spring Boot 中,Starter 是一种特殊的依赖,它可以帮助开发…

    Java 2023年5月15日
    00
  • Java中的抽象类是什么?

    抽象类是在Java中用于定义接口的半实现的类。它必须被继承才能被使用,并要求子类实现其抽象方法。在Java中,我们使用 abstract 关键字来声明抽象类。 抽象类本身不能被实例化,需要通过子类来实现。抽象类中可以包含非抽象的方法,这些方法跟普通的类方法一样,同样需要实现。 接下来我们通过两个例子来详细讲解Java中的抽象类。 示例一:定义抽象类 publ…

    Java 2023年4月27日
    00
  • Java中指定时区的3种方法

    当我们在Java程序中处理时间的时候,常常会遇到需要指定时区的情况。正确地指定时区可以保证时间的正确性和跨时区的可靠性。以下是Java中指定时区的3种方法。 方法一:使用TimeZone类 Java中的TimeZone类提供了各种不同的时区,我们可以使用它来指定时区。常用的有如下几个方法: getTimeZone(String ID):根据时区ID获取一个T…

    Java 2023年5月20日
    00
  • Java多线程案例之阻塞队列详解

    Java多线程案例之阻塞队列详解 什么是阻塞队列? 阻塞队列(Blocking Queue)是一个支持在队列的两端进行插入与删除的队列。常用的阻塞队列有ArrayBlockingQueue、LinkedBlockingQueue等。阻塞队列在多线程的场景下常被使用,因为当队列为空或达到容量上限时,线程往往会被阻塞。在队列空的情况下,从队列中获取元素的操作将会…

    Java 2023年5月18日
    00
  • Spring中的spring.factories文件用法(Spring如何加载第三方Bean)

    在Spring中,有一个特殊的配置文件spring.factories,它可以用于指定Spring加载的应用程序上下文中的第三方Bean,而无需创建XML配置文件。下面详细介绍它的用法和加载过程: spring.factories的用法 spring.factories文件位于Spring项目的META-INF目录中,并且遵循标准Java属性文件格式。该文件…

    Java 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部