抛物线法(二次插值法)

抛物线法简介

抛物线法(Quadratic Interpolation Method)是一种用于一维单峰函数极值搜索的经典优化方法。该方法通过在区间内选取三个不同的点,拟合一条二次抛物线,并求取这条抛物线的极值点作为新的迭代点,从而逐步逼近函数的极值。它相比于0.618法或黄金分割法,具有更快的收敛速度,特别是在极值点附近表现出超线性收敛特性。

数学推导

f ( x ) f(x) f(x) 在区间 内有单个极值点,选取不同的点 ( x 1 , f ( x 1 ) ) (x_1, f(x_1)) (x1,f(x1)) ( x 2 , f ( x 2 ) ) (x_2, f(x_2)) (x2,f(x2)) ( x 3 , f ( x 3 ) ) (x_3, f(x_3)) (x3,f(x3)), 用它们你和出一条二次抛物曲线

f ( x ) = A x 2 + B x + C f(x) = Ax^2 + Bx + C f(x)=Ax2+Bx+C
根据三点插值法,可以推导出抛物线极值点的公式

x m i n = f ( x 1 ) ( x 2 2 − x 3 2 ) + f ( x 2 ) ( x 3 2 − x 1 2 ) + f ( x 3 ) ( x 1 2 − x 2 2 ) 2 [ f ( x 1 ) ( x 2 − x 3 ) + f ( x 2 ) ( x 3 − x 1 ) + f ( x 3 ) ( x 1 − x 2 ) ] x_{min} = \frac{f(x_1) (x_2^2 -x_3^2) + f(x_2) (x_3^2 - x_1^2) + f(x_3)(x_1^2 -x_2^2)}{ 2[f(x_1)(x_2 - x_3) + f(x_2)(x_3 - x_1) + f(x_3)(x_1 - x_2)]} xmin=2[f(x1)(x2x3)+f(x2)(x3x1)+f(x3)(x1x2)]f(x1)(x22x32)+f(x2)(x32x12)+f(x3)(x12x22)
这个公式直接给出了二次曲线顶点的位置,作为当前迭代中的极小值近似。

算法流程

  • 选取初始区间 [ a , b ] [a, b] [a,b] 内的三个点 x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3
    这三个点一般选取为 x 1 = a x_1 = a x1=a x 3 = b x_3 = b x3=b x 2 = a + b 2 x_2 = \frac{a+b}{2} x2=2a+b, 设定容许误差 η \eta η

  • 计算函数值 f ( x 1 ) f(x_1) f(x1) f ( x 2 ) f(x_2) f(x2) f ( x 3 ) f(x_3) f(x3)

  • 拟合抛物线,计算顶点 根据三点插值公式,拟合出二次函数,并计算顶点坐标:
    x m i n = f ( x 1 ) ( x 2 2 − x 3 2 ) + f ( x 2 ) ( x 3 2 − x 1 2 ) + f ( x 3 ) ( x 1 2 − x 2 2 ) 2 [ f ( x 1 ) ( x 2 − x 3 ) + f ( x 2 ) ( x 3 − x 1 ) + f ( x 3 ) ( x 1 − x 2 ) ] x_{min} = \frac{f(x_1) (x_2^2 -x_3^2) + f(x_2) (x_3^2 - x_1^2) + f(x_3)(x_1^2 -x_2^2)}{ 2[f(x_1)(x_2 - x_3) + f(x_2)(x_3 - x_1) + f(x_3)(x_1 - x_2)]} xmin=2[f(x1)(x2x3)+f(x2)(x3x1)+f(x3)(x1x2)]f(x1)(x22x32)+f(x2)(x32x12)+f(x3)(x12x22)

  • 判断是否满足精度要求 η \eta η
    如果
    ∣ x m i n − x 2 ∣ < η |x_{min} - x_2| < \eta xminx2<η
    说明收敛,极小值点为 x min x_{\text{min}} xmin,停止迭代。

  • 根据极值点位置和函数值更新三个点
    计算 f min = f ( x min ) f_{\text{min}} = f(x_{\text{min}}) fmin=f(xmin)
    比较 x min x_{\text{min}} xmin x 2 x_2 x2,分情况更新

情况条件更新方式
A x min < x 2 x_{\text{min}} < x_2 xmin<x2 f min < f 2 f_{\text{min}} < f_2 fmin<f2 x 3 ← x 2 x_3 \leftarrow x_2 x3x2, f 3 ← f 2 f_3 \leftarrow f_2 f3f2
x 2 ← x min x_2 \leftarrow x_{\text{min}} x2xmin, f 2 ← f min f_2 \leftarrow f_{\text{min}} f2fmin
B x min < x 2 x_{\text{min}} < x_2 xmin<x2 f min ≥ f 2 f_{\text{min}} \geq f_2 fminf2 x 1 ← x min x_1 \leftarrow x_{\text{min}} x1xmin, f 1 ← f min f_1 \leftarrow f_{\text{min}} f1fmin
C x min > x 2 x_{\text{min}} > x_2 xmin>x2 f min < f 2 f_{\text{min}} < f_2 fmin<f2 x 1 ← x 2 x_1 \leftarrow x_2 x1x2, f 1 ← f 2 f_1 \leftarrow f_2 f1f2
x 2 ← x min x_2 \leftarrow x_{\text{min}} x2xmin, f 2 ← f min f_2 \leftarrow f_{\text{min}} f2fmin
D x min > x 2 x_{\text{min}} > x_2 xmin>x2 f min ≥ f 2 f_{\text{min}} \geq f_2 fminf2 x 3 ← x min x_3 \leftarrow x_{\text{min}} x3xmin, f 3 ← f min f_3 \leftarrow f_{\text{min}} f3fmin
  1. 重复第 2 步到第 5 步, 直到收敛
    ∣ x min − x 2 ∣ < η |x_{\text{min}} - x_2| < \eta xminx2<η,返回 x min x_{\text{min}} xmin 作为极小值点

算法实现

#include <iostream>
#include <cmath>
#include <functional>
#include <algorithm>class QuadraticInterpolation {
private:double x1, x2, x3;                      // 三个采样点double eps;                             // 精度要求std::function<double(double)> func;     // 待优化目标函数public:// 构造函数QuadraticInterpolation(double a, double b, double e, std::function<double(double)> f): x1(a), x2((a + b) / 2), x3(b), eps(e), func(f) {}// 执行搜索double search() {double f1 = func(x1);double f2 = func(x2);double f3 = func(x3);double xmin;while (true) {// 抛物线拟合顶点公式double numerator = f1 * (std::pow(x2, 2) - std::pow(x3, 2)) +f2 * (std::pow(x3, 2) - std::pow(x1, 2)) +f3 * (std::pow(x1, 2) - std::pow(x2, 2));double denominator = 2 * (f1 * (x2 - x3) +f2 * (x3 - x1) +f3 * (x1 - x2));if (std::abs(denominator) < 1e-12) break; // 防止除0异常xmin = numerator / denominator;double fmin = func(xmin);// 判断是否达到精度if (std::fabs(xmin - x2) < eps) break;// 更新三点,保留较优的三个点if (xmin < x2) {if (fmin < f2) {x3 = x2;f3 = f2;x2 = xmin;f2 = fmin;}else {x1 = xmin;f1 = fmin;}}else {if (fmin < f2) {x1 = x2;f1 = f2;x2 = xmin;f2 = fmin;}else {x3 = xmin;f3 = fmin;}}}return xmin;}
};// 示例函数
double testFunc(double x) {return x * x - sin(x);
}int main() {// 构造优化器,区间[0,5],精度1e-6QuadraticInterpolation optimizer(0, 1, 1e-6, testFunc);double result = optimizer.search();std::cout << "极小值点 x ≈ " << result << std::endl;std::cout << "对应的 f(x) ≈ " << testFunc(result) << std::endl;return 0;
}

请添加图片描述

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter# 定义目标函数
def f(x):return x**2 - np.sin(x)# 抛物线插值法计算顶点
def quadratic_interpolation(x1, x2, x3, f1, f2, f3):numerator = f1*(x2**2 - x3**2) + f2*(x3**2 - x1**2) + f3*(x1**2 - x2**2)denominator = 2*(f1*(x2 - x3) + f2*(x3 - x1) + f3*(x1 - x2))if np.abs(denominator) < 1e-12:return x2  # 防止除0return numerator / denominator# 初始参数
x1, x2, x3 = 0.0, 1.0, 2.0
eps = 1e-6# 函数取值范围
x_vals = np.linspace(0, 2.5, 400)
y_vals = f(x_vals)# 创建图形
fig, ax = plt.subplots(figsize=(8, 5))iteration = [0]  # 用 list 包一层,方便闭包修改def update(_):global x1, x2, x3iteration[0] += 1ax.clear()ax.plot(x_vals, y_vals, label="f(x) = $x^2 - \sin(x)$")f1, f2, f3 = f(x1), f(x2), f(x3)# 防止三点重合if abs(x1 - x2) < 1e-10 or abs(x1 - x3) < 1e-10 or abs(x2 - x3) < 1e-10:ani.event_source.stop()return# 拟合抛物线 y = A x^2 + B x + CX = np.array([[x1**2, x1, 1],[x2**2, x2, 1],[x3**2, x3, 1]])Y = np.array([f1, f2, f3])try:coeffs = np.linalg.solve(X, Y)except np.linalg.LinAlgError:ani.event_source.stop()returnA, B, C = coeffs# 拟合抛物线曲线x_fit = np.linspace(min(x1, x2, x3)-0.2, max(x1, x2, x3)+0.2, 200)y_fit = A * x_fit**2 + B * x_fit + Cax.plot(x_fit, y_fit, 'r--', label="Quadratic fit")# 计算拟合顶点xmin = quadratic_interpolation(x1, x2, x3, f1, f2, f3)fmin = f(xmin)# 绘制采样点和拟合点ax.plot([x1, x2, x3], [f1, f2, f3], 'go', label="Sample points")ax.plot(xmin, fmin, 'bo', label="New point")# 显示当前迭代信息ax.set_title(f"Iteration {iteration[0]}, x_min ≈ {xmin:.6f}")# 判断收敛,满足条件则停止动画if np.abs(xmin - x2) < eps:ani.event_source.stop()# 更新三点if xmin < x2:if fmin < f2:x3, f3 = x2, f2x2, f2 = xmin, fminelse:x1, f1 = xmin, fminelse:if fmin < f2:x1, f1 = x2, f2x2, f2 = xmin, fminelse:x3, f3 = xmin, fminax.legend()ax.set_xlim(0, 2.5)ax.set_ylim(-0.5, 5)ax.grid(True)# 动画:frames 不设定固定值,interval 控控制刷新速度
ani = FuncAnimation(fig, update, interval=500, repeat=False)# 保存 GIF
ani.save("quadratic_interpolation_auto_stop.gif", writer=PillowWriter(fps=2))plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48963.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一次华为魔改 fusionlnsight和ai问答的狗血故事

需求 需要通过客户端连接 fusionlnsight 平台&#xff0c;平台开启了高可用和 kerberos 认证 。现在需要连接时不使用高可用连接&#xff0c;也就是不使用 zookeeper&#xff0c;适用ip:port 直连。 踩坑记录 尝试使用 平台上面的主节点的ip10000默认端口连接&#xff0c;连…

【杂谈】Godot 2D游戏窗口设置

如切如磋&#xff0c;如琢如磨。 目录 一、引言二、设置&#xff08;一&#xff09;基本尺寸&#xff08;二&#xff09;拉伸&#xff08;三&#xff09;手持设备朝向&#xff08;四&#xff09;​​窗口模式​​ 一、引言 在开发2D游戏时&#xff0c;​​窗口尺寸的设定是游戏…

mac 使用 Docker 安装向量数据库Milvus独立版的保姆级别教程

Milvus 特点&#xff1a;开源的云原生向量数据库&#xff0c;支持多种索引类型和GPU加速&#xff0c;能够在亿级向量规模下实现低延迟高吞吐。具有灵活的部署选项和强大的社区支持。 适用场景&#xff1a;适合处理超大规模数据和高性能需求的应用&#xff0c;如图像搜索、推荐…

(14)Element Plus项目综合案例

本系列教程目录&#xff1a;Vue3Element Plus全套学习笔记-目录大纲 文章目录 第3章 综合案例3.1 搭建项目3.1.1 创建Vite工程3.1.2 配置路由 3.2 登录模块页面3.2.1 注册页面3.2.2 登录页面3.2.3 忘记密码页面 3.3 导航设置3.3.1 头部3.3.2 侧边栏与底部1&#xff09;头像部分…

基于腾讯云MCP广场的AI自动化实践:爬取小红书热门话题

基于腾讯云MCP广场的AI自动化实践&#xff1a;爬取小红书热门话题 我正在参加Trae「超级体验官」创意实践征文&#xff0c;本文所使用的 Trae 免费下载链接&#xff1a;www.trae.com.cn/?utm_source… &#x1f50e; 背景 在人工智能快速发展的时代&#xff0c;AI技术不仅重…

C++从入门到实战(十四)初识STL与STL简介

C从入门到实战&#xff08;十四&#xff09;初识STL与STL简介 前言一、什么是 STL&#xff1f;二、STL 的版本三、STL六大组件&#xff08;目前了解即可&#xff0c;后面会逐步讲解&#xff09;1. 容器&#xff08;Containers&#xff09;—— 装数据的“盒子”2. 算法&#xf…

【LeetCode 42】接雨水(单调栈、DP、双指针)

题面&#xff1a; 思路&#xff1a; 能接雨水的点&#xff0c;必然是比两边都低&#xff08;小&#xff09;的点。有两种思路&#xff0c;一种是直接计算每个点的最大贡献&#xff08;也就是每个点在纵向上最多能接多少水&#xff09;&#xff0c;另一种就是计算每个点在横向上…

ruoyi-flowable-plus 前端框架启动报错修复

版本 1. ruoyi-flowable-plus 前端框架启动报错修复 启动时设置环境变量 "scripts": {"dev": "SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-service serve","build:prod": "vue-cli-service build",&qu…

Python全流程开发实战:基于IMAP协议安全下载个人Gmail邮箱内所有PDF附件

文章目录 一、需求分析与安全前置&#xff1a;为什么需要专用工具&#xff1f;1.1 痛点场景1.2 技术方案选择 二、准备工作&#xff1a;Gmail账号安全配置与环境搭建2.1 开启两步验证&#xff08;必做&#xff01;&#xff09;2.2 创建应用专用密码&#xff08;替代普通密码&am…

Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于WebRTC的摄像头实时目标检测

Gradio全解20——Streaming&#xff1a;流式传输的多媒体应用&#xff08;5&#xff09;——基于WebRTC的摄像头实时目标检测 本篇摘要20. Streaming&#xff1a;流式传输的多媒体应用20.5 基于WebRTC的摄像头实时目标检测20.5.1 环境配置及说明1. WebRTC2. TURN服务器 20.5.2 …

统计匹配的二元组个数 - 华为OD机试真题(A卷、JavaScript题解)

华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 针对刷题难&#xff0c;效率慢&#xff0c;我们提供一对一算法辅导&#xff0c; 针对个人情况定制化的提高计划&#xff08;全称1V1效率更高&#xff09;。 看…

【Redis篇】linux 7.6安装单机Redis7.0(参数优化详解)

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…

Admyral - 可扩展的GRC工程自动化平台

文章目录 一、关于 Admyral相关链接资源关键特性 二、安装系统要求 三、快速开始1、启动服务 四、核心功能1、自动化即代码2、AI增强工作流3、双向同步编辑器4、工作流监控5、企业级基础设施 五、示例应用六、其他信息许可证遥测说明 一、关于 Admyral Admyral 是一个基于 Pyt…

深入解析Http11AprProtocol:Tomcat高性能通信的底层原理

HTTP/1.1 协议作为 Web 通信的基础标准&#xff0c;其实现效率直接影响服务器性能。Apache Tomcat 作为 Java 生态中最流行的 Servlet 容器&#xff0c;提供了多种 HTTP 协议实现方案&#xff0c;其中基于 Apache Portable Runtime&#xff08;APR&#xff09;的 Http11AprProt…

Linux第四节:进程控制

一、进程创建 1.1 fork函数 1. fork函数有两个返回值问题 返回的本质就是写入&#xff01;所以&#xff0c;谁先返回&#xff0c;谁就先写入id&#xff0c;因为进程具有独立性&#xff0c;会发生写时拷贝&#xff0c;父进程和子进程各自指向return语句。 2. fork返回后&#x…

基于mediapipe深度学习的眨眼检测和计数系统python源码

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 人工智能算法python程序运行环境安装步骤整理_本地ai 运行 python-CSDN博客 3.部分核心程序 &…

(二)毛子整洁架构(CQRS/Dapper/DomianEvent Handler)

文章目录 项目地址一、Application 层1.1 定义CQRS的接口以及其他服务1. Command2. IQuery查询3. 当前时间服务接口4. 邮件发送服务接口 1.2 ReserveBooking Command1. 处理传入的参数2. ReserveBookingCommandHandler3. BookingReservedDomainEvent 1.3 GetBooking Query1. 创…

数据结构与算法:图论——最短路径

最短路径 先给出一些leetcode算法题&#xff0c;以后遇见了相关题目再往上增加 最短路径的4个常用算法是Floyd、Bellman-Ford、SPFA、Dijkstra。不同应用场景下&#xff0c;应有选择地使用它们&#xff1a; 图的规模小&#xff0c;用Floyd。若边的权值有负数&#xff0c;需要…

uniapp-商城-43-shop 后台管理 页面

后台管理较为简单&#xff0c;主要用于后台数据的管理&#xff0c;包含商品类别和商品信息&#xff0c;其实还可以扩展到管理用户等等 1、后台首页 包含 分类管理 商品管理 关于商家等几个栏目 主要代码&#xff1a; <template><view class"manage">…

LeetCode 1. 两数之和(Java)

LeetCode 1. 两数之和&#xff08;暴力 vs 哈希表&#xff09; 题目描述 给定一个整数数组 nums 和一个整数 target&#xff0c;要求找出数组中和为目标值的两个数&#xff0c;并返回它们的下标。假设每个输入只有一种答案&#xff0c;且同一元素不能重复使用。 示例&#xf…