MATLAB无约束多维极值之坐标轮换法

2024-02-05 08:08

本文主要是介绍MATLAB无约束多维极值之坐标轮换法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、算法原理

坐标轮换法亦称变量轮换法时一种求无约束最优化问题的降维方法.其迭代过程是沿不同的坐标方向轮换地进行搜索.

例 二维极值

设初始点为x0=[1,1],先只改变一个变量,其他变量视为常数,进行一维搜索,得到最优点x01:

x01=x0+e1*a,式中e1=[0,1]为方向,a为待求步长。通过min f(x0+e1*a)求得最优步长。

(通过进退法求得极值区间,黄金分割法求得最优步长);

;再换一个变量,同样进行一维搜索,得到最优点x02

x02=x0+e2*a,式中e1=[1,0]为方向,a为待求步长。通过min f(x0+e2*a)求得最优步长。

(通过进退法求得极值区间,黄金分割法求得最优步长);

;如此继续下去,直到完成一个循环,即对n个变量都轮换完毕,得到最优点x。

三维极值

设初始点为x0=[1,1,1],先只改变一个变量,其他变量视为常数,进行一维搜索,得到最优点x01:

x01=x0+e1*a,式中e1=[1,0,0]为方向,a为待求步长。通过min f(x0+e1*a)求得最优步长。

(通过进退法求得极值区间,黄金分割法求得最优步长);

;再换一个变量,同样进行一维搜索,得到最优点x02

x02=x0+e2*a,式中e1=[0,1,0]为方向,a为待求步长。通过min f(x0+e2*a)求得最优步长。

(通过进退法求得极值区间,黄金分割法求得最优步长);

;再换一个变量,同样进行一维搜索,得到最优点x03

x03=x0+e2*a,式中e1=[0,0,1]为方向,a为待求步长。通过min f(x0+e2*a)求得最优步长。

;如此继续下去,直到完成一个循环,即对n个变量都轮换完毕,得到最优点x。

二、算法流程

三、matlab程序

%% 坐标轮换 
% syms x1 x2
f=@(x1,x2) x1.^2+x2.^2-x1*x2-10*x1-4*x2+60;
X=ZBLH(f,[0 0],1e-6,100)
function x=ZBLH(f,x0,eps,k)x0 = x0';
m = length(x0);
n = 1;
syms alfa
while n < ktemp = x0; %作为一个中间变量for i = 1:me=zeros(m,1);e(i)=1;x1 = temp + alfa*e;f_alfa=matlabFunction(eval('f(x1(1),x1(2))'));
%          d_alfa=solve(f_alfa);[~,d_alfa]=huangjin(f_alfa,0,0.1,1000);temp = temp + d_alfa*e;endx1 = temp;if norm(x0 - x1) < epsx = x1;return;endx0 = x1;
end
end
function [result,x]=huangjin(f,x0,h0,n)
tol=1e-6;
[a,b]=Min_jintui(f,x0,h0);%进退法寻找搜索区间
x1=min(a,b);
x2=max(a,b);
i=1;
while i < n%取中间值a=x1+0.382*(x2-x1);b=x1+0.618*(x2-x1);fa=f(a);fb=f(b);% 判断fa  fb大小,缩小区间if fa < fbx2=b;elsex1=a;endif  abs(x1-x2) < tolresult=f((x1+x2)/2);x=(x1+x2)/2;break;endi=i+1;
end
end
%进退法寻找搜索区间
function [a,b]=Min_jintui(f,x1,h0)
%f为函数句柄
%x1为初始点
%h0为步长
x2=x1+h0;
i=1;
if f(x2) < f(x1)x3=x2+h0;h=h0;while f(x3) < f(x2)x3=x2+h;h=i*h;i=i+1;enda=x1;b=x3;
elseTemp=x1;x1=x2;x2=Temp;h=-h0;x3=x2+h;while f(x3) < f(x2)x3=x2+h;h=i*h;i=i+1;enda=x3;b=x1;
end
end

 

这篇关于MATLAB无约束多维极值之坐标轮换法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680262

相关文章

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

MATLAB的fix(),floor()和ceil()函数的区别与联系

fix(x),floor(x)和ceil(x)函数都是对x取整,只不过取整方向不同而已。 这里的方向是以x轴作为横坐标来看的,向右就是朝着正轴方向,向左就是朝着负轴方向。 fix(x):向0取整(也可以理解为向中间取整) floor(x):向左取整 ceil(x):向右取整 举例: 4个数:a=3.3、b=3.7、c=-3.3、d=-3.7 fix(a)=3 fl

MATLAB中的eig函数

在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有5种: E=eig(A):求矩阵A的全部特征值,构成向量E。 [V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。 [V,D]=eig(A,'nobalance'):与第2种格式类似,但第2种格式中先对A作相似变换后求矩阵A的特征值和特征向量,而格式3直接求矩阵A的特