当前位置: 首页 > news >正文

【Matlab算法】粒子群算法求解一维非线性函数问题(附MATLAB代码)

MATLAB求解一维非线性函数问题

  • 前言
  • 正文
  • 函数实现(可视化处理)
    • 可视化结果

前言

一维非线性函数是指函数的自变量和因变量都是一维实数,而且函数的形式是非线性的,也就是不符合线性函数的形式。在一维非线性函数中,自变量和因变量之间的关系通常是曲线状的,而不是直线状的。这种函数形式很常见,可以描述很多实际问题,如物理学、工程学、生物学等领域的各种现象和过程。常见的一维非线性函数包括二次函数、指数函数、对数函数、三角函数等。这些函数形式都不是线性的,其函数值与自变量之间的关系并不满足线性关系,因此需要使用不同的数学方法来求解最优解。
下面几个常见的一维非线性函数的例子:

幂函数:y=x2y=x^2y=x2y=x3y=x^3y=x3y=x4y=x^4y=x4等;
指数函数:y=exy=e^xy=exy=2xy=2^xy=2xy=10xy=10^xy=10x等;
对数函数:y=ln⁡(x)y=\ln(x)y=ln(x)y=log⁡2(x)y=\log_2(x)y=log2(x)y=log⁡10(x)y=\log_{10}(x)y=log10(x)等;
三角函数:y=sin⁡(x)y=\sin(x)y=sin(x)y=cos⁡(x)y=\cos(x)y=cos(x)y=tan⁡(x)y=\tan(x)y=tan(x)等;
双曲函数:y=sin⁡(x)y=\sin(x)y=sin(x)y=cos⁡(x)y=\cos(x)y=cos(x)y=tan⁡(x)y=\tan(x)y=tan(x)等;
逻辑斯蒂函数:y=11+e−xy = \frac{1}{1+e^{-x}}y=1+ex1,常用于分类问题中的概率计算。

这些非线性函数的特点是函数图像不是一条直线,而是具有弯曲或曲线变化的形状,其导数也不是常数而是变化的。在优化问题中,非线性函数的优化往往比线性函数更加复杂和困难。

粒子群算法(Particle Swarm Optimization,PSO) 是一种启发式优化算法,它源于对鸟群捕食行为的研究。在粒子群算法中,被优化的问题被视为一个多维空间中的目标函数,算法通过模拟群体中每个粒子在空间中的搜索行为来寻找目标函数的全局最优解。

每个粒子在搜索空间中的位置表示一个潜在解,其速度表示了搜索方向和步长。每个粒子具有一个适应度值,该适应度值根据目标函数的表现来计算。粒子群算法通过协同粒子的行为来优化目标函数。粒子的速度和位置在每个迭代中被更新,使其朝着群体中的最佳位置和全局最佳位置移动。

粒子群算法的运行过程如下:

  1. 初始化粒子群,包括每个粒子的初始位置和速度,并设置全局最佳位置和全局最佳适应度值为初始值。
  2. 计算每个粒子的适应度值,更新全局最佳位置和全局最佳适应度值。
  3. 更新每个粒子的速度和位置,根据每个粒子当前位置与全局最佳位置之间的差异来调整速度和位置。
  4. 重复步骤23,直到达到指定的停止准则,如达到最大迭代次数或满足收敛要求。

在实践中,粒子群算法经常与其他优化算法结合使用,例如遗传算法、模拟退火等。这些算法的组合可以提高搜索效率和准确性,从而提高优化问题的解决效率。

正文

优化如下的三角函数:y=sin⁡(x)+cos⁡(2x)y=\sin(x)+\cos(2x)y=sin(x)+cos(2x)
其中,xxx 为变量,范围为 [−π,π][-\pi, \pi][π,π]

具体优化步骤如下:

  1. 初始化粒子群:随机生成一些粒子的位置和速度。
  2. 计算每个粒子的适应度:根据粒子的位置计算目标函数值。
  3. 更新全局最优解和个体最优解:记录历史最优解,并更新全局最优解和个体最优解。
  4. 更新粒子的速度和位置:根据全局最优解和个体最优解来更新粒子的速度和位置。
  5. 检查终止条件:检查是否满足终止条件,如果不满足则返回第3步。

在实际的实现中,我们需要选择合适的参数,如粒子数、迭代次数、惯性权重、加速度系数等,以及相应的初始值。此外,我们还需要考虑如何处理边界问题,如何控制算法的收敛速度等。
最后,通过绘制目标函数的图像来观察算法的优化效果,即目标函数值随着迭代次数的变化情况。

函数实现(可视化处理)

%%
clear
close all
warning off
clc
%% 调用粒子群算法求解
x_min = -pi;
x_max = pi;
n_pop = 50;
n_iter = 100;
w = 0.8;
c1 = 1.5;
c2 = 1.5;
[gbest, gbest_val] = pso(@objfun, x_min, x_max, n_pop, n_iter, w, c1, c2);% 输出结果
fprintf('最优解:x = %f,最优值:%f\n', gbest, gbest_val);% 可视化处理
x = linspace(-pi, pi, 1000);
y = sin(x) + cos(2*x);
plot(x, y);
hold on;
plot(gbest, gbest_val, 'ro', 'MarkerSize', 10);
title('PSO for Nonlinear Function Optimization');
xlabel('x');
ylabel('y');
legend('Objective Function', 'Optimal Solution');
hold off;% 目标函数
function y = objfun(x)y = sin(x) + cos(2*x);
end% 粒子群算法
function [gbest, gbest_val] = pso(objfun, x_min, x_max, n_pop, n_iter, w, c1, c2)% 参数设置x_range = x_max - x_min;v_min = -x_range;v_max = x_range;% 初始化粒子pop = x_min + rand(n_pop, 1) * x_range;v = v_min + rand(n_pop, 1) * (v_max - v_min);pbest = pop;pbest_val = objfun(pop);[gbest_val, gbest_idx] = min(pbest_val);gbest = pbest(gbest_idx);% 迭代for i = 1:n_iter% 更新速度和位置r1 = rand(n_pop, 1);r2 = rand(n_pop, 1);v = w*v + c1*r1.*(pbest-pop) + c2*r2.*(gbest-pop);pop = pop + v;% 边界处理pop(pop < x_min) = x_min;pop(pop > x_max) = x_max;% 更新个体历史最优和全局历史最优pbest_val_new = objfun(pop);pbest_update_idx = pbest_val_new < pbest_val;pbest(pbest_update_idx) = pop(pbest_update_idx);pbest_val(pbest_update_idx) = pbest_val_new(pbest_update_idx);[gbest_val_new, gbest_idx_new] = min(pbest_val);if gbest_val_new < gbest_valgbest = pbest(gbest_idx_new);gbest_val = gbest_val_new;endend
end

可视化结果

请添加图片描述

相关文章:

【Matlab算法】粒子群算法求解一维非线性函数问题(附MATLAB代码)

MATLAB求解一维非线性函数问题前言正文函数实现&#xff08;可视化处理&#xff09;可视化结果前言 一维非线性函数是指函数的自变量和因变量都是一维实数&#xff0c;而且函数的形式是非线性的&#xff0c;也就是不符合线性函数的形式。在一维非线性函数中&#xff0c;自变量…...

2023 最新发布超全的 Java 面试八股文,整整 1000道面试题,太全了

作为一名优秀的程序员&#xff0c;技术面试都是不可避免的一个环节&#xff0c;一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 2023 年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;很多粉丝朋友私信希望我出一篇面试专题或…...

产品经理面经|当面试官问你还有什么问题?

相信很多产品经理在跳槽面试的时候&#xff0c;在面试尾声都会遇到这样的环节&#xff0c;面试官会问你有什么问题要问的&#xff0c;一般来说大家都能随时随地甩出几个问题来化解&#xff0c;但其实在这个环节对于应聘者来说也是一个很好的机会来展现自己的能力&#xff0c;甚…...

单链表的基本操作

目录 一.链表的基本概念和结构 二.链表的分类 三.单链表的基本操作 1.创建一个节点 2.打印 3.尾插 4.头插 5.尾删 6.头删 7.查找 8.指定位置插入 9.指定位置删除 10.销毁 一.链表的基本概念和结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结…...

【微信小程序-原生开发】系列教程目录(已完结)

01-注册登录账号&#xff0c;获取 AppID、下载安装开发工具、创建项目、上传体验 https://sunshinehu.blog.csdn.net/article/details/128663679 02-添加全局页面配置、页面、底部导航 https://sunshinehu.blog.csdn.net/article/details/128705866 03-自定义底部导航&#x…...

JavaEE--Thread 类的基本用法(不看你会后悔的嘿嘿)

Thread类是JVM用来管理线程的一个类,换句话说,每个线程都唯一对应着一个Thread对象. 因此,认识和掌握Thread类弥足重要. 本文将从 线程创建线程中断线程等待线程休眠获取线程实例 等方面来进行具体说明. 1)线程创建 方法1:通过创建Thread类的子类并重写run () 方法 class M…...

MySQL数据库基本使用(二)-------数据库及表的增删改查及字符集修改

1.MySQL数据库的使用演示 1.1创建自己的数据库 命令格式如下&#xff08;创建的数据库名称不能与已经存在的数据库重名&#xff09;&#xff1a; mysql> create database 数据库名;例如&#xff1a; mysql> create database atguigudb; #创建atguigudb数据库&#xf…...

互联网摸鱼日报(2023-03-17)

互联网摸鱼日报&#xff08;2023-03-17&#xff09; InfoQ 热门话题 开源新生代的成长之路&#xff1a;从校园到开源&#xff0c;需要迈过哪些挑战&#xff1f; 从 Clickhouse 到 Apache Doris&#xff0c;慧策电商 SaaS 高并发数据服务的改造实践 刚刚&#xff0c;百度文心…...

【前后端】低代码平台Jeecg-Boot 3.2宝塔云服务器部署流程

1 后端 部署流程 修改配置文件 更改数据库、redis的配置。 在system子模块中的target文件夹下生成 jar 包jeecg-boot-module-system-3.2.0.jar。 复制到云服务器 生成数据库 在这里插入图片描述 使用命令运行后端程序 java -jar ./jeecg-boot-module-system-3.2.0.jar宝…...

leetcode todolist

数组 数组的改变、移动 453. 最小移动次数使数组元素相等 665. 非递减数列 283. 移动零 数组的旋转 189. 旋转数组 396. 旋转函数 统计数组中的元素 645. 错误的集合 697. 数组的度 448. 找到所有数组中消失的数字 442. 数组中重复的数据 41. 缺失的第一个正数 数…...

改进YOLO系列 | CVPR2023最新 PConv | 提供 YOLOv5 / YOLOv7 / YOLOv7-tiny 模型 YAML 文件

DWConv是Conv的一种流行变体,已被广泛用作许多神经网络的关键构建块。对于输入 I ∈ R c h w I \in R^{c \times h \times w} I∈...

像ChatGPT玩转Excel数据

1.引言 最近ChatGPT的出现&#xff0c;把人工智能又带起了一波浪潮。机器人能否替代人类又成了最近热门的话题。 今天我们推荐的一个玩法和ChatGPT有点不一样。我们的课题是“让用户可以使用自然语言从Excel查询到自己想要的数据”。 要让自然语言可以从Excel中查数据&#…...

云原生之docker容器监控详解(cAdvisor、node exporter、prometheus)

docker容器监控一、前言二、cAdvisor2.1、安装cAdvisor2.2、使用Prometheus监控cAdvisor2.3、cAdvisor暴露的Prometheus指标三、Node Exporter3.1、安装Node Exporter3.2、指标四、Prometheus4.1、安装4.2、规则配置4.3、报警管理器五、grafana一、前言 cAdvisor源码 node exp…...

<Linux>进程概念

文章目录一、什么是进程1.进程概念2.进程描述 – PCB3.task_struct内容分类二、进程的基本操作1.查看进程2.结束进程3.通过系统调用获取进程标示符4.通过系统调用创建子进程(fork)三、进程状态1.普遍的操作系统状态2.Linux操作系统状态四、两种特殊的进程1.僵尸进程2.孤儿进程五…...

数据结构——顺序表

文章目录&#x1f428;0. 前言&#x1f388;1. 顺序表的概念及定义&#x1fa81;2. 接口的声明&#x1fa84;3. 接口的实现&#x1f345;3.1 为何使用断言&#xff1f;&#x1f352;3.2 初始化与销毁&#x1f353;3.3 尾插与尾删&#x1f349;3.4 头插与头删&#x1f379;3.5 指…...

闪存系统性能优化方向集锦?AC timing? Cache? 多路并发?

1. 从Flash系统的性能提升说起从消费级产品到数据中心企业级场景&#xff0c;NAND Flash凭借其高性能、大容量、低功耗以及低成本等特性大受欢迎&#xff0c;是目前应用最为广泛的半导体非易失存储介质。为了满足业务场景越来越严苛的性能要求&#xff0c;人们想了许多方法来提…...

【每日一题】——网购

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e2; 读书笔记 &#x1f7e1; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…...

百度终于要出手了?文心一言

文心一言 百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。 前几天炒的风风火火的ChatGPT&#xff0c;虽然 ChatGPT 很强大&a…...

8年Java架构师面试官教你正确的面试姿势,10W字面试题带你成功上岸大厂

从最开始的面试者变成现在的面试官&#xff0c;工作多年以及在面试中&#xff0c;我经常能体会到&#xff0c;有些面试者确实是认真努力工作&#xff0c;但坦白说表现出的能力水平却不足以通过面试&#xff0c;通常是两方面原因&#xff1a; 1、“知其然不知其所以然”。做了多…...

Mybatis-Plus详解

简介MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。特性&#xff08;官网提供&#xff09;无侵入&#xff1a;只做增强…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...