用MATLAB实现最速下降法
matlab最速下降法求解二次凸函数的最小值

matlab最速下降法求解二次凸函数的最小值1.引言1.1 概述概述:在数学和优化领域中,最速下降法是一种常用的优化算法,用于求解二次凸函数的最小值。
该算法通过迭代更新变量的值,以逐步靠近函数的最小值。
在本文中,我们将介绍最速下降法的原理和步骤,并探讨它在求解二次凸函数最小值中的应用。
最速下降法的核心思想是沿着目标函数梯度的反方向移动,以找到函数的最小值。
具体而言,算法从一个初始点开始,计算该点的梯度,并将其与一个步长因子相乘,得到一个移动的方向。
然后,根据这个方向更新变量的值,并重复此过程直到满足停止准则。
对于二次凸函数的最小值求解,最速下降法是一种有效且收敛性良好的方法。
二次凸函数是一种具有凸性和二次项的函数,它在数学和工程问题的建模中经常出现。
通过最速下降法,我们可以通过迭代计算逐步逼近二次凸函数的最小值。
本文主要目的是介绍最速下降法在求解二次凸函数最小值中的应用。
我们将详细讨论最速下降法的原理和步骤,并通过数学推导和示例说明其有效性和收敛性。
我们还将比较最速下降法与其他优化算法的优缺点,并总结结论。
通过本文的阅读,读者将能够了解最速下降法在求解二次凸函数最小值中的原理和应用。
这将有助于读者更好地理解最速下降法的优势和局限性,并为进一步研究和应用提供基础。
1.2文章结构2. 正文2.1 最速下降法的原理和步骤最速下降法是一种常用的优化算法,用于求解函数的最小值。
它基于函数的负梯度方向进行迭代,通过迭代更新自变量的值来逐步逼近最优解。
最速下降法的步骤如下:步骤1:选择初始点。
从问题的可行域内选择一个初始点作为最速下降法的起点。
步骤2:计算负梯度。
在当前点处,计算目标函数的负梯度,即函数在该点处的梯度乘以-1。
步骤3:确定步长。
寻找沿着负梯度方向移动的合适步长,使得目标函数的值能够得到较大的下降。
步骤4:更新自变量。
根据确定的步长,更新自变量的值。
步骤5:重复步骤2-步骤4。
不断迭代执行步骤2到步骤4,直到满足停止准则。
最速下降法

最速下降法姓名:沈东东 班级:研1404 学号:1415033005一、最速下降法的原理目标函数:(1)n f R R n →>在决策变量的当前点()k n x R ∈处的一阶Taylor 展开式为()()()()()()()k k k T f x f x g x δδοδ+=++式中,()()k n g x R ∈为f 在点()k x 处的梯度向量。
当扰动量n R δ∈充分小时,有()()()()()()k k k T f x f x g x δδ+≈+设新的迭代点为(1)()k k x x δ+=+,于是得到(1)()()()()()k k k T f x f x g x δ+-≈为了使(1)k x +处的目标函数值比()k x 处有所下降,需要满足()()0k T g x δ<此外,梯度向量()()k g x 和扰动量δ的内积可以表示为()()()()cos k T k g x g x δδθ=式中,θ为两向量之间的夹角。
若要使目标函数值的下降量尽可能大,可知δ的方向应该为梯度方向的负方向,即cos 1θ=-。
函数f 在点()k x 处的负梯度方向称为该点的最速下降方向。
在每次迭代时都取最速下降方向作为搜索方向的方法就称为最速下降法。
二、最速下降法的特点1.若()k x 不是极小点,则f 在点()k x 处的最速下降方向总是下降方向。
2.如果每次迭代时都用精确搜索方法得到最佳步长作为搜索步长,则寻优过程中相邻的最速下降方向是正交的。
3最速下降法产生的迭代点序列在一定条件下是线性收敛的,其收敛性质与极小点*x 处的Hesse 矩阵有关。
三、最速下降法的计算步骤最速下降法的计算步骤如下:步骤1:已知待求问题的目标函数()f x ,选择初始点(0)x ,并设定精度要求tol ,令:0k =。
步骤2:计算()f x 在点()k x 处的梯度向量()()k g x ,得到最速下降方向()()()k k d g x =-。
matlab数学实验

《管理数学实验》实验报告班级姓名实验1:MATLAB的数值运算【实验目的】(1)掌握MATLAB变量的使用(2)掌握MATLAB数组的创建,(3)掌握MA TLAB数组和矩阵的运算。
(4)熟悉MATLAB多项式的运用【实验原理】矩阵运算和数组运算在MA TLAB中属于两种不同类型的运算,数组的运算是从数组元素出发,针对每个元素进行运算,矩阵的运算是从矩阵的整体出发,依照线性代数的运算规则进行。
【实验步骤】(1)使用冒号生成法和定数线性采样法生成一维数组。
(2)使用MA TLAB提供的库函数reshape,将一维数组转换为二维和三维数组。
(3)使用逐个元素输入法生成给定变量,并对变量进行指定的算术运算、关系运算、逻辑运算。
(4)使用MA TLAB绘制指定函数的曲线图,将所有输入的指令保存为M文件。
【实验内容】(1)在[0,2*pi]上产生50个等距采样数据的一维数组,用两种不同的指令实现。
0:(2*pi-0)/(50-1):2*pi 或linspace(0,2*pi,50)(2)将一维数组A=1:18,转换为2×9数组和2×3×3数组。
reshape(A,2,9)ans =Columns 1 through 71 3 5 7 9 11 132 4 6 8 10 12 14Columns 8 through 915 1716 18reshape(A,2,3,3)ans(:,:,1) =1 3 52 4 6ans(:,:,2) =7 9 118 10 12 ans(:,:,3) =13 15 17 14 16 18(3)A=[0 2 3 4 ;1 3 5 0],B=[1 0 5 3;1 5 0 5],计算数组A 、B 乘积,计算A&B,A|B,~A,A= =B,A>B 。
A.*Bans=0 0 15 121 15 0 0 A&Bans =0 0 1 11 1 0 0 A|Bans =1 1 1 11 1 1 1~Aans =1 0 0 00 0 0 1A==Bans =0 0 0 01 0 0 0A>=Bans =0 1 0 11 0 1 0(4)绘制y= 0.53t e -t*t*sin(t),t=[0,pi]并标注峰值和峰值时间,添加标题y= 0.53t e -t*t*sint ,将所有输入的指令保存为M 文件。
最优化方法实验报告(2)

最优化方法实验报告Numerical Linear Algebra And ItsApplications学生所在学院:理学院学生所在班级:计算数学10-1学生姓名:甘纯指导教师:单锐教务处2013年5月实验三实验名称:无约束最优化方法的MATLAB实现实验时间: 2013年05月10日星期三实验成绩:一、实验目的:通过本次实验的学习,进一步熟悉掌握使用MATLAB软件,并能利用该软件进行无约束最优化方法的计算。
二、实验背景:(一)最速下降法1、算法原理最速下降法的搜索方向是目标函数的负梯度方向,最速下降法从目标函数的负梯度方向一直前进,直到到达目标函数的最低点。
2、算法步骤用最速下降法求无约束问题n R()min的算法步骤如下:xxf,a )给定初始点)0(x ,精度0>ε,并令k=0;b )计算搜索方向)()()(k k x f v -∇=,其中)()(k x f ∇表示函数)(x f 在点)(k x 处的梯度;c )若ε≤)(k v ,则停止计算;否则,从)(k x 出发,沿)(k v 进行一维搜索,即求k λ,使得)(min )()()(0)()(k k k k v x f v x f λλλ+=+≥; d )令1,)()()1(+=+=+k k v x x k k k k λ,转b )。
(二)牛顿法1、算法原理牛顿法是基于多元函数的泰勒展开而来的,它将)()]([-)(1)(2k k x f x f ∇∇-作为搜索方向,因此它的迭代公式可直接写出来:)()]([)(1)(2)()(k k k k x f x f x x ∇∇-=-2、算法步骤用牛顿法求无约束问题n R x x f ∈),(min 的算法步骤如下:a )给定初始点)0(x ,精度0>ε,并令k=0;b )若ε≤∇)()(k x f ,停止,极小点为)(k x ,否则转c );c )计算)()]([,)]([)(1)(2)(1)(2k k k k x f x f p x f ∇∇-=∇--令;d )令1,)()()1(+=+=+k k p x x k k k ,转b )。
基于matlab平台的三种迭代法求解矩阵方程

数值分析第二次作业学院:电子工程学院基于matlab平台的三种迭代法求解矩阵方程组求解系数矩阵由16阶Hilbert方程组构成的线性方程组的解,其中右端项为[2877/851,3491/1431,816/409,2035/1187,2155/1423,538/395,1587/1279,573/502,947 /895,1669/1691,1589/1717,414/475,337/409,905/1158,1272/1711,173/244].要求:1)Gauss_Sedel迭代法;2)最速下降法;3)共轭梯度法;4)将结果进行分析对比。
解:根据题目要求,编写了对应算法的matlab程序,求解结果如下:(求解精度为10e-4,最大迭代次数1000)1、方程的解:如下图1所示图1 三种方法求解的结果对比图2 Gause_Sedel算法收敛特性图3 最速下降法收敛特性图3 共轭梯度法收敛特性从图中可以看到,在相同的最大迭代次数和预设求解精度条件下,共轭梯度算法仅需要4次迭代便可求出方程组的解,耗时0.000454秒,而且求出解的精度最高;Gauss_Sedel方法需要465次迭代,耗时0.006779秒,求解精度最差;最速下降法需要398次迭代,耗时0.007595秒,求解精度与共轭梯度算法差不多,因此两者求出的解也几乎相同。
从中可以得出结论,共轭梯度算法无论从求解精度还是求解速度上都优于其他两种,最速下降法在求解精度上几乎与共轭梯度算法持平,但求解速度更慢。
Gauss_Sedel方法在求解精度和速度两方面都最差。
具体的解为:Gauss_Sedel迭代法:(共需465次迭代,求解精度达到9.97e-5) X=[0.995328360833192 1.01431732497804 1.052861239300110.934006974137998 0.931493373808838 0.9665081384030661.00661848511341 1.03799789809258 1.051806903036541.06215849948572 1.04857676431223 1.028561990411131.01999170162638 0.971831831519515 0.9525261666348130.916996019179182].最速下降法:(共需398次迭代,求解精度达到9.94e-5)X=[0.998835379744322 1.01507463472900 0.9825890937201850.980191460759243 0.991245169713628 1.003780222253291.01350884374478 1.01928337905816 1.020859096651941.01930314197028 1.01444777381651 1.007040589892970.998384452250809 0.987399404644377 0.9757678149709120.963209150871750].共轭梯度法:(共需4次迭代,求解精度达到3.98e-5)X=[0.996472751179456 1.02707840189049 0.9776233734098530.973206695321590 0.986133032967607 1.001289025642341.01322158496914 1.02047386502293 1.023009050605651.02163015083975 1.01678089454399 1.009203108638740.999772406055155 0.988443827498859 0.9760941924969490.962844741655005].Matlab程序主程序:clc;clear;%% 本程序用于计算第二次数值分析作业,关于希尔伯特矩阵方程的解,用三种方法,分析并比较,也可推广至任意n维的矩阵方程%%A=hilb(16); %生成希尔伯特系数矩阵b=[2877/851;3491/1431;816/409;2035/1187;2155/1423;538/395;1587/1279;573/502;947/895;166 9/1691;1589/1717;414/475;337/409;905/1158;1272/1711;173/244]; %右端向量M=1000; %最大迭代次数err=1.0e-4; %求解精度[x,n,xx,cc,jingdu]=yakebi_diedai(A,b,err,M); % 雅克比算法求解tic;[x1,n1,xx1,cc1,jingdu1]=gauss_seidel(A,b,err,M); % gauss_seidel算法求解toc;tic;[x2,n2,xx2,jingdu2]=zuisuxiajiangfa(A,b,err,M); % 最速下降法求解toc;tic;[x3,flag,jingdu3,n3]=bicg(A,b,err); % matlab内置双共轭梯度算法求解toc;tic;[x4,xx4,n4,jingdu4]=con_grad(A,b,err,M); % 教材共轭梯度算法求解toc;%% 计算相应结果,用于作图%%num=[1:16]';jie=[num,x1,x2,x4]; % 三者的解对比% 三者的收敛情况对比num1=[1:n1]';fit1=[num1,jingdu1'];num2=[1:n2]';fit2=[num2,jingdu2'];num4=[1:n4]';fit4=[num4,jingdu4'];子函数1(Gause_Sedel算法):function [x,n,xx,cc,jingdu] = gauss_seidel(A,b,err,M)% 利用迭代方法求解矩阵方程这里是高斯赛尔得迭代方法% A 为系数矩阵b 为右端向量err为精度大小返回求解所得向量x及迭代次数% M 为最大迭代次数cc 迭代矩阵普半径jingdu 求解过程的精度n 所需迭代次数xx 存储求解过程中每次迭代产生的解for ii=1:length(b)if A(ii,ii)==0x='error';break;endendD=diag(diag(A));L=-tril(A,-1);U=-triu(A,1);B=(D-L)\U;cc=vrho(B); %迭代矩阵普半径FG=(D-L)\b;x0=zeros(length(b),1);x=B*x0+FG;k=0;xx(:,1)=x;while norm(A*x-b)>errx0=x;x=B*x0+FG;k=k+1;xx(:,k+1)=x;if k>=Mdisp('迭代次数太多可能不收敛!');break;endjingdu(k)=norm(A*x-b);endend子函数2(最速下降算法):function [x,n,xx,jingdu]=zuisuxiajiangfa(A,b,eps,M)% 利用迭代方法求解矩阵方程这里是最速下降迭代方法% A 为系数矩阵b 为右端向量err为精度大小返回求解所得向量x及迭代次数% % M 为最大迭代次数jingdu 求解过程的精度n 所需迭代次数xx 存储求解过程中每次迭代产生的解x0=zeros(length(b),1);r0=b-A*x0;t0=r0'*r0/(r0'*A*r0);x=x0+t0*r0;r=b-A*x;xx(:,1)=x;k=0;while norm(r)>epsr=r;x=x;t=r'*r/(r'*A*r);x=x+t*r;r=b-A*x;k=k+1;xx(:,k+1)=x;if k>=Mdisp('迭代次数太多可能不收敛!');break;endn=k;jingdu(k)=norm(r);endend子函31(共轭梯度法):function [x,xx,n,jingdu]=con_grad(A,b,eps,M)% 利用迭代方法求解矩阵方程这里是共轭梯度迭代方法% A 为系数矩阵b 为右端向量err为精度大小返回求解所得向量x及迭代次数% M 为最大迭代次数jingdu 求解过程的精度n 所需迭代次数xx 存储求解过程中每次迭代产生的解x0=zeros(length(b),1);r0=b-A*x0;p0=r0;% t0=r0'*r0/(r0'*A*r0);% x=x0+t0*r0;% xx(:,1)=x;k=0;x=x0;r=r0;p=p0;while norm(r)>epsx=x;r=r;p=p;afa=r'*r/(p'*A*p);x1=x+afa*p;r1=r-afa*A*p;beta=r1'*r1/(r'*r);p1=r1+beta*p;x=x1;r=r1;p=p1;k=k+1;xx(:,k)=x;if k>=Mdisp('迭代次数太多可能不收敛!');break;endn=k;jingdu(k)=norm(r);endend。
最速下降法matlab

最速下降法matlabmatlab步0:选取初始点x0,容许误差是e=[0~1],令k=1步1:计算目标函数的梯度若||gk||<=e,即达到误差要求,立即停止计算,并输出xk作为近似最优解。
步2:取搜索方向为dk=-gk(即负梯度方向)。
步3:利用线搜索技术确定步长k(这里采用Armijo准则来求步长)步长为k=^mk是给定的,所以要求出mkAmrijo准则就是(1)给定(0~1),(0,0.5),令m=0(2)若不等式f(xk+^m*dk)<=f(xk)+*^m*gk'*dk成立,则令mk=m,Xk+1=xk+m*dk.停止运算,输出mk得到步长(3)若不满足上述不等式,则令m=m+1,然后回到第二步。
步4:确定步长后,令Xk+1=Xk+k*dk,k=k+1,转步骤1.matlab具体代码如下:1.主函数1clear all2clc%利用grad函数求解minif(x)=100*(x1^2-x2)^2+(x1-1)^2 4%此时还要建立两个函数,一个目标函数fun,一个梯度gfun 5x0=[-1.2 1]';6[x,val,k]=grad('fun','gfun',x0);7disp(['最优解:x='])8disp(x)9disp(['此时:f(x)=',num2str(val)])102.最速下降法1function[x,val,k]=grad(fun,gfun,x0)2%功能:用最速下降法求解无约束问题minif(x)3%输入:fun,gfun分别是目标函数和梯度,x0是初始点%输出:x,val分别是近似最优值和最优值,k是迭代次数5maxk=5000;%最大迭代次数6rho=0.5;7sigma=0.4;8k=0;9e=1e-5;%精度10while(k<maxk)11g=feval(gfun,x0);%计算梯度15m=0;mk=0;3.目标函数3f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;44.目标函数的梯度1function g=gfun(x)2%目标函数的梯度3g=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1),-200*(x(1)^2-x(2))]';4end5.运行结果。
matlab 最速下降迭代路径

一、Matlab最速下降迭代路径介绍Matlab是一款强大的数学软件工具,其中包含了各种数学工具箱,用于解决不同领域的数学问题。
最速下降迭代路径是其中的一个重要工具,用于求解非线性方程组或最优化问题。
二、最速下降迭代路径原理1.首先介绍最速下降法的思想:即在迭代过程中,每次选取下降方向时选择负梯度方向,使得目标函数值下降最快。
2.最速下降法的迭代公式:x^(k+1) = x^k - α * ∇f(x^k),其中x^k 为迭代的当前点,α为步长,∇f(x^k)为目标函数在x^k点的梯度。
三、Matlab中最速下降迭代路径的函数及使用方法1.在Matlab中,可以使用fminunc函数来实现最速下降迭代路径。
其用法为[fval, x] = fminunc(fun, x0, options),其中fun为目标函数的句柄,x0为迭代的初始点,options为优化选项。
2.在使用fminunc函数时,需注意定义目标函数的句柄,并设定合适的初始点和优化选项,以确保得到准确的最速下降迭代路径。
四、最速下降迭代路径的应用实例以一个简单的非线性方程组为例:f(x) = x^2 + 2y^2,其中目标是求解该方程组的最小值。
通过Matlab最速下降迭代路径,可以求解该方程组的最小值点。
五、总结与展望最速下降迭代路径是一种常用的非线性方程组求解方法,Matlab中的fminunc函数提供了便捷的实现途径。
今后,我们可以进一步深入研究不同类型问题下的最速下降迭代路径,并探索更多有效的数值计算方法。
以上是关于Matlab最速下降迭代路径的简要介绍,希望能为您提供一些帮助。
感谢阅读!最速下降迭代路径是一种常用的优化方法,广泛应用于解决非线性方程组和优化问题。
在Matlab中,最速下降迭代路径的实现通过fminunc函数来完成。
在本文中,我们将进一步探讨最速下降迭代路径的原理、Matlab中的具体使用方法以及其应用实例。
让我们更深入地了解最速下降迭代路径的原理。
最速下降法matlab代码

最速下降法matlab代码最速下降法(Steepest Descent Method)是一种用于数值优化问题的迭代算法。
下面是一个简单的最速下降法的MATLAB 代码示例:1.定义目标函数function f = objective(x)f = x(1)^2 + 4*x(2)^2 - 4*x(1) - 8*x(2); % 示例目标函数,可根据实际问题进行修改end2.定义目标函数的梯度function g = gradient(x)g = [2*x(1) - 4; 8*x(2) - 8]; % 示例目标函数的梯度,可根据实际问题进行修改end3.最速下降法function steepestDescent()x = [0; 0]; % 初始点epsilon = 1e-6; % 收敛准则,可根据实际问题调整maxIterations = 1000; % 最大迭代次数,可根据实际问题调整for k = 1:maxIterationsg = gradient(x); % 计算梯度if norm(g) < epsilon % 判断梯度范数是否小于收敛准则break;endalpha = 0.01; % 步长,可根据实际问题调整x = x - alpha * g; % 更新参数enddisp('Optimization Results:');disp('---------------------');disp(['Iterations: ', num2str(k)]);disp(['Minimum point: (', num2str(x(1)), ', ', num2str(x(2)), ')']);disp(['Objective function value: ', num2str(objective(x))]);end4.调用最速下降法函数steepestDescent();上述代码包含了以下几个关键部分:objective 函数:定义了目标函数,根据实际问题进行修改。
完整word版最速下降法求解线性代数方程组

最速下降法求解线性代数方程组要求:对于给定的系数矩阵、右端项和初值,可以求解线性代数方程组一、最速下降法数学理论PP?tX?Xf(X)的负梯中,在基本迭代公式每次迭代搜索方向取为目标函数kk1kkk?t)X??f(P?取为最优步长,由此确定的算法称为最速度方向,即,而每次迭代的步长kkk下降法。
X)Xminf(kk。
现在次,获得了第,假定我们已经迭代了为了求解问题个迭代点k X出发,可选择的下降方法很多,一个非常自然的想法是沿最速下降方向(即负梯度方从k X邻近的范围内是这样。
因此,去搜索方向为 )进行搜索应该是有利的,至少在向k P???f(X).kk P k?1进行一维搜索,由此得到第为了使目标函数在搜索方向上获得最多的下降,沿k个跌带点,即X?X?t?f(X),kk1k?k t按下式确定其中步长因子k f(X?t?f(X))?minf(X?t?f(X)),kkkkkk X?ls(X,??f(X)). ( 1)k1k?k X X,XX,, ,,?k0,12是初始点,由计算就可以得到一个点列,显然,令其中0210{X}f)X(X)(f 的满足一定的条件时,由式()所产生的点列必收敛于者任意选定。
当1k极小点。
二、最速下降法的基本思想和迭代步骤???,)(Xf(X)g. ,终止限已知目标函数及其梯度和321Xf?f(X),g?g(X)k?0.,计算;置(1)选定初始点00000X?ls(X,?g)f?f(X),g?g(X). (2)作直线搜索:;计算k?1kk1?k1k?kk?1?1(X,f(X))k?k?1,置,结束;用终止准则检验是否满足:若满足,则打印最优解否则,1k?1?k转(2)(3)最速下降法算法流程图如图所示.X结束三、最速下降法的matlab实现function [x,n]=twostep(A,b,x0,eps,varargin) %两步迭代法求线性方程组Ax=b的解if nargin==3eps= 1.0e-6;M = 200;elseif nargin<3errorreturnelseif nargin ==5M = varargin{1};endD=diag(diag(A)); %求A的对角矩阵L=-tril(A,-1); %求A的下三角阵U=-triu(A,1); %求A的上三角阵B1=(D-L)\U;B2=(D-U)\L;f1=(D-L)\b;f2=(D-U)\b;x12=B1*x0+f1;x =B2*x12+f2;n=1; %迭代次数while norm(x-x0)>=epsx0 =x;x12=B1*x0+f1;x =B2*x12+f2;n=n+1;if(n>=M)'); 迭代次数太多,可能不收敛! disp('Warning: return;endend的解最速下降法求线性方程组Ax=bfunction [x,n]= fastdown(A,b,x0,eps) %if(nargin == 3)eps = 1.0e-6;endx=x0;n=0;tol=1;以下过程 % while(tol>eps)可参考算法流程 r = b-A*x0;d = dot(r,r)/dot(A*r,r);x = x0+d*r;tol = norm(x-x0);x0 = x;n = n + 1;end四、最速下降法的算例实现A=[5 2 0;6 4 1;1 2 5];b=[10 18 -14]';eps=1.0e-6;x =-0.87507.1875-5.5000 k =60。
最速下降法+Matlab代码

最速下降法+Matlab代码算法原理to-doMatlab代码clc; clear;f = @(x) x(1).^2+2*x(1)*x(2)+3*x(2).^2; %待求函数,x1,x2,x3...% f = @(x) x(1).^2+2*x(2).^2;paraNum = 2; %函数参数的个数,x1,x2,x3...的个数x0 = [3,3]; %初始值tol = 1e-5; %迭代容忍度flag = inf; %结束条件error = []; %函数变化while flag > tolp = g(f,x0,paraNum); %列向量f2 = @(a) f(x0-a*p');buChang = argmin(f2); %求步长,line search:argmin functionx1 = x0-buChang*p';flag = norm(x1-x0);error = [error,flag];x0 = x1;endplot(0:length(error)-1,error)function [f_grad] = g(f,x0,paraNum)temp = sym('x',[1,paraNum]);f1=f(temp);Z = gradient(f1);f_grad = double(subs(Z,temp,x0));endfunction [x] = argmin(f)%求步长t = 0;options = optimset('Display','off');[x,~] = fminunc(f,t,options);end代码问题1. Matlab符号运算,耗时2. 最速下降法的步长使⽤line-search,耗时代码改进clc; clear;f = @(x) x(1).^2+2*x(1)*x(2)+3*x(2).^2; %待求函数,x1,x2,x3...% f = @(x) x(1).^2+2*x(2).^2;paraNum = 2; %函数参数的个数,x1,x2,x3...的个数x0 = [3,3]; %初始值tol = 1e-3; %迭代容忍度flag = inf; %结束条件error = []; %函数变化while flag > tol% for i =1:1p = g(f,x0,paraNum); %列向量if norm(p) < tolbuChang = 0;elsebuChang = argmin(f,x0,p,paraNum); %求步长,line search:argmin functionendx1 = x0-buChang.*p';flag = norm(x1-x0);error = [error,flag];x0 = x1;endplot(0:length(error)-1,error)function [f_grad] = g(f,x0,paraNum)temp = sym('x',[1,paraNum]);f1=f(temp);Z = gradient(f1);f_grad = double(subs(Z,temp,x0)); end% function [x] = argmin(f,paraNum) % %求步长% t = zeros(1,paraNum);% options = optimset('Display','off'); % [x,~] = fminunc(f,t,options);% endfunction [x] = argmin(f,x0,p,num) % 求步长% for i=1:paraNum% syms(['x',num2str(i)]);% endtemp = sym('x',[1,num]);f1=f(x0 - temp.*p');for i = 1:numtemp(i) = diff(f1,temp(i));endjieGuo = solve(temp);jieGuo = struct2cell(jieGuo);x = zeros(1,num);for i = 1:numx(i) = double(jieGuo{i});endend。
最速下降法求最优解西安电子科技大学matlab结课大作业

西安电子科技大学课程论文数学软件与实验最速下降法求最优解姓名:方正阳学号:07117020班级:07117107112016、最速下降法求最优解1 2 n,然后MATLAB 结课大作业摘要:最速下降法,又称为梯度法,是一种重要的无约束最优化方法。
它是 1847年由著名数学家 Cauchy 给出的,其他解析方法或是它的变形,或是受它 启发而得到,因此它是最优化方法的基础。
该法将 n 维问题转化为一系列 不断迭代过程中沿负梯度方向用一维搜索方法寻优的问题,本次程序设计 利用最速下降法算法,反复迭代,最终收敛于局部最优点,即为解出的二 元函数的无约束非线性规划问题 minf(x,y)。
引言:最优化理论作为运筹学中的一个重要理论方法,在工业生产,金融经济活 动,工商管理,国防建设,计算机应用中,都有着重要的应用。
最优化理论 通过给出生产活动中的各类实际问题的数学模型,通过最优化方法,寻求 该问题的最优解或满意解。
最速下降算法是最优化理论中常见的一个重要 算法,理论证明:最速下降算法在一定条件下是收敛的,它能够有效地求 解一部分无约束最优化问题。
一、 实验目的熟悉最速下降法算法思想和步骤,用 MATLAB 语言编程最速下降法 求最优值。
二、 实验要求在最优化计算方法中,要求解 y = f (x 1, x 2 , , x n ) 的局部最小值,可以采用如下的方法进行迭代计算:先给出初始点 x 0 = (x 0 , x 0 , , x 0)根据其梯度方向 ∇f (x 0),计算一元函数 y (λ1 ) = min f (x λ≥0 0-λ⋅∇f (x 0 )) ,并1 0 0得到x = x -λ1 ⋅∇f (x ) 。
如此反复迭代,最终收敛于局部最优点。
实现 该算法,求 的最优值,a,b,c,d 自定(非 0)三、 实验假设考虑到参数的随机性、代表性,验证程序的正确性、典型性,在此 我们从两个角度出发,一是在 abcd 值确定的情况下改变初始搜索位置 x0,看函数最优解是否相同;二是初始搜索位置 x0 相同,abcd 值不同的 情况下,看函数最优解是否相同。
最速下降法

1. 算法原理最速下降法的搜索法向是目标函数的负梯度方向,最速下降法从目标函数的负梯度方向一直前进,直到到达目标函数的最低点。
已知目标函数在()k X 点的梯度为:()()()()()()()()12...Tk k k k nf X f X f X f X x x x ⎡⎤∂∂∂⎢⎥∇=∂∂∂⎢⎥⎣⎦当求目标函数的最小点时,由于函数沿负梯度方向下降最快,故在()k X 点的探索方向应取该点的负梯度方向,即()()()()()k k k f X S f X∇=-∇显然,()k S 为单位向量。
这样第1k +次迭代计算所得的新点为()()()()(1)()()()()()k k k k k k k k f X X X S X f Xαα+∇=+=-∇负梯度仅给出了最优化方向,而没有给出步长的大小,所以可能有各种各样的最速下降的过程,它们依赖于()()()k k f Xα∇的大小。
步长()k α有两种取法:一种方法是任意给定一个初始步长,使满足条件:()()()()()()k k k k f X S f X α+<另外一种方法是沿负梯度方向做一维探索,以求解一维最优化问题的最优步长α,即对目标函数极小,以得到最优步长:()()()()()0min ()()k k k k k f X S f X S ααα>+=+以此最优步长作为由()k X点出发沿该点的负梯度方向探索的步长()k α。
这种方法的迭代计算的收敛性,可用以下三式中的任一式或二式作为准则来进行判断:()()()()()1()(1)2()()(1)3k k k k k k f X f X f X f X X Xεεε--⎧∇≤⎪⎪-⎪≤⎨⎪⎪-≤⎪⎩2. 算法步骤用最速下降法求无约束多维极值问题min (),nf x x R ∈的算法步骤如下:(1) 取初始点(0)x ,精度0ε>,令0k = (2) 计算搜索方向()()()k k vf x =-∇,其中()()k f x ∇表示函数()f x 在点()k x 处的梯度;(3) 若()k v ε≤,则停止计算;否则,从()k x 出发,沿()k v 进行一维搜索,即求k λ,使得()()()()0()min ()k k k k k f xv f x v λλλ≥+=+。
优化方法MATLAB编程——大连理工大学

优化方法上机大作业学院:姓名:学号:指导老师:肖现涛第一题源程序如下:function zy_x = di1ti(x)%di1ti是用来求解优化作业第一题的函数。
x0=x; yimuxulong=0.000001;g0=g(x0);s0=-g0;A=2*ones(100,100);k=0;while k<100lanmed=-(g0)'*s0/(s0'*A*s0);x=x0+lanmed*s0;g=g(x);k=k+1;if norm(g)<yimuxulongzy_x=x;fprintf('After %d iterations,obtain the optimal solution.\n \n The optimal solution is \n %f.\n\nThe optimal "x" is "ans".',k,f(x) )break;endmiu=norm(g)^2/norm(g0)^2;s=-g+miu*s0;g0=g; s0=s;x0=x;endfunction f=f(x)f=(x'*ones(100,1))^2-x'*ones(100,1);function g=g(x)g=(2*x'*ones(100,1))*ones(100,1)-ones(100,1);代入x0,运行结果如下:>> x=zeros(100,1);>> di1ti(x)After 1 iterations,obtain the optimal solution.The optimal solution is-0.250000.The optimal "x" is "ans".ans =0.005*ones(100,1).第二题1.最速下降法。
matlab线性方程组求解

0.9739 -0.0047 1.0010
n= 5 Jacobi 迭代法: function [x,n]=jacobi(A,b,x0,eps,varargin) if nargin==3 eps= 1.0e-6; M = 200; elseif nargin<3 error return elseif nargin ==5 M = varargin{1}; end D=diag(diag(A)); L=-tril(A,-1); U=-triu(A,1); B=D/(L+U); f=D/b; x=B*x0+f; n=1; % 迭代次数 % 求 A 的对角矩阵 % 求 A 的上三角阵
n= 5 Gauss-Seidel 迭代法: function [x,n]=gauseidel(A,b,x0,eps,M) if nargin==3 eps= 1.0e-6; M = 200; elseif nargin == 4 M = 200; elseif nargin<3 error return; end D=diag(diag(A)); L=-tril(A,-1); U=-triu(A,1); G=(D-L)/U; f=(D-L)/b; % 求 A 的对角矩阵 % 求 A 的上三角阵 % 求 A 的下三角阵
批注本地保存成功开通会员云端永久保存去开通
线性方程组求解 1. 直接法 Gauss 消元法: function x=DelGauss(a,b) % Gauss 消去法 [n,m]=size(a); nb=length(b); det=1;% 存储行列式值 x=zeros(n,1); for k=1:n-1 for i=k+1:n if a(k,k)==0 return end m=a(i,k)/a(k,k); for j=k+1:n a(i,j)=a(i,j)-m*a(k,j); end b(i)=b(i)-m*b(k); end det=det*a(k,k); end det=det*a(n,n);
matlab解决非线性规划问题(凸优化问题)

matlab解决⾮线性规划问题(凸优化问题)当⽬标函数含有⾮线性函数或者含有⾮线性约束的时候该规划问题变为⾮线性规划问题,⾮线性规划问题的最优解不⼀定在定义域的边界,可能在定义域内部,这点与线性规划不同;例如:编写⽬标函数,定义放在⼀个m⽂件中;编写⾮线性约束条件函数矩阵,放在另⼀个m⽂件中;function f = optf(x);f = sum(x.^2)+8;function [g, h] = limf(x);g = [-x(1)^2+x(2)-x(3)^2x(1)+x(2)^2+x(3)^3-20]; %⾮线性不等式约束h = [-x(1)-x(2)^2+2x(2)+2*x(3)^2-3]; %⾮线性等式约束options = optimset('largescale','off');[x y] = fmincon('optf',rand(3,1),[],[],[],[],zeros(3,1),[],...'limf',options)输出为:最速下降法(求最⼩值):代码如下:function [f df] = detaf(x);f = x(1)^2+25*x(2)^2;df = [2*x(1)50*x(2)];clc,clear;x = [2;2];[f0 g] = detaf(x);while norm(g)>1e-6 %收敛条件为⼀阶导数趋近于0p = -g/norm(g);t = 1.0; %设置初始步长为1个单位f = detaf(x+t*p);while f>f0t = t/2;f = detaf(x+t*p);end %这⼀步很重要,为了保证最后收敛,保持f序列为⼀个单调递减的序列,否则很有可能在极值点两端来回震荡,最后⽆法收敛到最优值。
x = x+t*p;[f0,g] = detaf(x);endx,f0所得到的最优值为近似解。
用MATLAB实现最速下降法

实验的题目和要求一、所属课程名称:最优化方法二、实验日期:2010年5月10日~2010年5月15日三、实验目的掌握最速下降法,牛顿法和共轭梯度法的算法思想,并能上机编程实现相应的算法。
二、实验要求用MATLAB 实现最速下降法,牛顿法和共轭梯度法求解实例。
四、实验原理最速下降法是以负梯度方向最为下降方向的极小化算法,相邻两次的搜索方向是互相直交的。
牛顿法是利用目标函数)(x f 在迭代点k x 处的Tayl or 展开式作为模型函数,并利用这个二次模型函数的极小点序列去逼近目标函数的极小点。
共轭梯度法它的每一个搜索方向是互相共轭的,而这些搜索方向k d 仅仅是负梯度方向k g -与上一次接待的搜索方向1-k d 的组合。
五.运行及结果如下:最速下降法:题目:f =(x-2)^2+(y -4)^2M 文件:functi on [R,n]=s teel(x0,y0,eps)syms x ;syms y ;f=(x -2)^2+(y-4)^2;v=[x ,y];j=jacobia n(f,v );T =[su bs (j(1),x,x 0),sub s(j(2),y,y 0)];t emp=s qrt((T (1))^2+(T(2))^2);x1=x0;y1=y0;n=0;syms kk ;wh ile (t emp>ep s)d=-T;f1=x 1+kk*d(1);f2=y1+kk*d(2);fT=[subs(j(1),x,f1),subs(j(2),y,f2)];fun=sqrt((fT(1))^2+(fT(2))^2);Mini=Gold(fun,0,1,0.00001);x0=x1+Mini*d(1);y0=y1+Mini*d(2);T=[subs(j(1),x,x0),subs(j(2),y,y0)];temp=sqrt((T(1))^2+(T(2))^2);x1=x0;y1=y0;n=n+1;endR=[x0,y0]调用黄金分割法:M文件:functionMini=Gold(f,a0,b0,eps)symsx;format long;syms kk;u=a0+0.382*(b0-a0);v=a0+0.618*(b0-a0);k=0;a=a0;b=b0;array(k+1,1)=a;array(k+1,2)=b;while((b-a)/(b0-a0)>=eps)Fu=subs(f,kk,u);Fv=subs(f,kk,v);if(Fu<=Fv)b=v;v=u;u=a+0.382*(b-a);k=k+1;elseif(Fu>Fv)a=u;u=v;v=a+0.618*(b-a);k=k+1;endarray(k+1,1)=a;array(k+1,2)=b;endMini=(a+b)/2;输入:[R,n]=steel(0,1,0.0001)R= 1.99999413667642 3.99999120501463 R= 1.99999413667642 3.99999120501463n = 1牛顿法:题目:f=(x-2)^2+(y-4)^2M文件:syms x1x2;f=(x1-2)^2+(x2-4)^2;v=[x1,x2];df=jacobian(f,v);df=df.';G=jacobian(df,v);epson=1e-12;x0=[0,0]';g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)});G1=subs(G,{x1,x2},{x0(1,1),x0(2,1)});k=0;mul_count=0;sum_count=0;mul_count=mul_count+12;sum_count=sum_count+6;while(norm(g1)>epson)p=-G1\g1;x0=x0+p;g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)});G1=subs(G,{x1,x2},{x0(1,1),x0(2,1)});k=k+1;mul_count=mul_count+16;sum_count=sum_count+11;end;kx0mul_countsum_count结果::k = 1x0=24mul_count =28sum_count = 17共轭梯度法:题目:f=(x-2)^2+(y-4)^2M文件:function f=conjugate_grad_2d(x0,t)x=x0;syms xi yi af=(xi-2)^2+(yi-4)^2;fx=diff(f,xi);fy=diff(f,yi);fx=subs(fx,{xi,yi},x0);fy=subs(fy,{xi,yi},x0);fi=[fx,fy];count=0;while double(sqrt(fx^2+fy^2))>ts=-fi;ifcount<=0s=-fi;elses=s1;endx=x+a*s;f=subs(f,{xi,yi},x);f1=diff(f);f1=solve(f1);iff1~=0ai=double(f1);elsebreakx,f=subs(f,{xi,yi},x),countendx=subs(x,a,ai);f=xi-xi^2+2*xi*yi+yi^2;fxi=diff(f,xi);fyi=diff(f,yi);fxi=subs(fxi,{xi,yi},x);fyi=subs(fyi,{xi,yi},x);fii=[fxi,fyi];d=(fxi^2+fyi^2)/(fx^2+fy^2);s1=-fii+d*s;count=count+1;fx=fxi;fy=fyi;endx,f=subs(f,{xi,yi},x),count输入:conjugate_grad_2d([0,0],0.0001)结果:x =0.24998825499785 -0.24999998741273f= 0.12499999986176count=10ans= 0.12499999986176六、结论如下:最速下降法越接近极小值,步长越小,前进越慢。
MATLAB实现最速下降法(梯度)程序

matlab最速下降法2010-08-18 17:13function x=fsxsteep(f,e,a,b)% fsxsteep函数最速下降法% x=fsxsteep(f,e,a,b)为输入函数 f为函数 e为允许误差 (a,b)为初始点;% fsx TJPU 2008.6.15x1=a;x2=b;Q=fsxhesse(f,x1,x2);x0=[x1 x2]';fx1=diff(f,'x1'); %对x1求偏导数fx2=diff(f,'x2'); %对x2求偏导数g=[fx1 fx2]'; %梯度g1=subs(g); %把符号变量转为数值d=-g1;while (abs(norm(g1))>=e)t=(-d)'*d/((-d)'*Q*d);t=(-d)'*d/((-d)'*Q*d); %求搜索方向x0=x0-t*g1; %搜索到的点v=x0;a=[1 0]*x0;b=[0 1]*x0;x1=a;x2=b;g1=subs(g);d=-g1;end;x=v;function x=fsxhesse(f,a,b)% fsxhesse函数求函数的hesse矩阵;% 本程序仅是简单的求二次函数的hesse矩阵!;% x=fsxhesse(f)为输入函数 f为二次函数 x1,x2为自变量;% fsx TJPU 2008.6.15x1=a;x2=b;fx=diff(f,'x1'); %求f对x1偏导数fy=diff(f,'x2'); %求f对x2偏导数fxx=diff(fx,'x1'); %求二阶偏导数对x1再对x1fxy=diff(fx,'x2'); %求二阶偏导数对x1再对x2fyx=diff(fy,'x1'); %求二阶偏导数对x2再对x1fyy=diff(fy,'x2'); %求二阶偏导数对x2再对x2fxx=subs(fxx); %将符号变量转化为数值fxy=subs(fxy);fyx=subs(fyx);fyy=subs(fyy);x=[fxx,fxy;fyx,fyy]; %求hesse矩阵syms x1 x2;X=[x1,x2];fx=X(1)^2+2*X(2)^2;z=fsxsteep(fx,0.001,1,1)。
matlab 最速下降法

MATLAB最速下降法引言最速下降法是一种优化算法,以迭代的方式寻找函数的最小值。
在MATLAB中,可以使用最速下降法对函数进行优化。
本文将详细介绍MATLAB中最速下降法的原理、应用和实现方法。
最速下降法原理最速下降法也称为梯度下降法,其核心思想是在每个迭代步骤中,沿着当前位置的负梯度方向下降,以实现函数的局部最小化。
最速下降法的迭代公式如下:x(k+1) = x(k) - λ * ∇f(x(k))其中,x(k+1)为下一次迭代的位置,x(k)为当前位置,λ为步长(学习率),∇f(x(k))为函数f(x)在x(k)点的梯度。
最速下降法的应用最速下降法广泛应用于函数优化、机器学习等领域。
它可以用来解决以下问题: 1. 函数优化:最速下降法可以根据函数的梯度信息找到函数的局部最小值,从而实现函数优化。
2. 机器学习:在机器学习中,最速下降法可以用于参数的求解,以最小化损失函数。
MATLAB中的最速下降法在MATLAB中,可以使用fminunc函数来实现最速下降法。
下面是使用MATLAB实现最速下降法的步骤: 1. 定义目标函数:首先,需要定义一个目标函数,即待优化的函数。
2. 定义初始值:选择一个合适的初始值作为最速下降法的起点。
3. 设置迭代终止条件:可以设置迭代次数上限或设定迭代误差阈值。
4. 调用fminunc函数:使用fminunc函数进行最速下降法的优化。
5. 获取优化结果:获取优化后的最优解和函数值。
下面是一个使用最速下降法优化的例子:% 定义目标函数function f = myfunc(x)f = (x(1)-1)^2 + (x(2)-2)^2;end% 定义初始值x0 = [0, 0];% 调用fminunc函数进行最速下降法的优化[xopt, fopt] = fminunc(@myfunc, x0);最速下降法的优缺点最速下降法的优点包括:简单易实现、收敛速度较快。
然而,最速下降法也存在一些缺点: 1. 收敛速度慢:最速下降法的收敛速度较慢,特别是对于目标函数呈现弯曲形状的情况。
最速下降法matlab代码

最速下降法matlab代码最速下降法(Steepest Descent Method)是一种优化算法,用于求解无约束最优化问题。
下面是一个使用MATLAB实现最速下降法的代码示例:```matlabfunction x = steepest_descent(f, grad_f, x0, tol, max_iter)% f: 目标函数% grad_f: 目标函数的梯度% x0: 初始点% tol: 迭代停止的容差% max_iter: 最大迭代次数x = x0; % 初始点iter = 0; % 迭代次数while norm(grad_f(x)) > tol && iter < max_iterp = -grad_f(x); % 计算搜索方向% 一维搜索,选择合适的步长alphaalpha = backtracking_line_search(f, grad_f, x, p);x = x + alpha * p; % 更新变量xiter = iter + 1;endendfunction alpha = backtracking_line_search(f, grad_f, x, p, alpha0, rho, c)% f: 目标函数% grad_f: 目标函数的梯度% x: 当前点% p: 搜索方向% alpha0: 初始步长% rho: 减小步长的比例因子% c: Armijo-Goldstein条件的常数因子if nargin < 6rho = 0.5; % 默认减小步长的比例因子endif nargin < 7c = 0.1; % 默认Armijo-Goldstein条件的常数因子endalpha = alpha0; % 初始步长while f(x + alpha * p) > f(x) + c * alpha * grad_f(x)' * palpha = rho * alpha; % 减小步长endend```在上述代码中,`steepest_descent`函数实现了最速下降法的主要逻辑。
最速下降法Matlab程序

%最速下降梯度法matlab程序% Steepest Descent Method% By Kshitij Deshpandeclcclear allwarning offprompt = {\'Coeficients if X1=\',\'Coefficients of X2=\',\'Coefficeint of X1X2=\',\'Initial Point=\'}; def = {\'[2 1 0]\',\'[1 -1 0]\',\'2\',\'[0 0]\'};a=inputdlg(prompt,\'Data\',1,def);a=char(a);[m,n]=size(a);x1 = eval(a(1,1:n));x2=eval(a(2,1:n));x1x2=eval(a(3,1:n));X1=eval(a(4,1:n));delf1(1) = polyval(polyder(x1),X1(1));delf1(1) = (delf1(1))+(x1x2*X1(2));delf1(2) = polyval(polyder(x2),X1(1));delf1(2) = (delf1(2))+(x1x2*X1(1));s=-delf1;%%%%%%%%%%%reportsrep(1,1:2)=s;%%%%%%%%%%x1new(1)=s(1)^2;x1new(2)=2*X1(1)*s(1);x1new(3) = X1(1)^2;x1new=x1new*x1(1);x1new_(2)=x1(2)*s(1);x1new_(3)=x1(2)*X1(1);x1new = x1new+x1new_;x2new(1)=s(2)^2;x2new(2)=2*X1(2)*s(2);x2new(3) = X1(2)^2;x2new=x2new*x2(1);x2new_(2)=x2(2)*s(2);x2new_(3)=x2(2)*X1(2);x2new = x2new+x2new_;x1x2new(1)=s(1)*s(2);x1x2new(2)=X1(1)*s(2)+X1(2)*s(1);x1x2new(3)=X1(1)*X1(2);x1x2new=x1x2*x1x2new;df = polyder(x1new+x2new+x1x2new);lambda(1) = roots(df);X1=X1+lambda(1)*s;Xrep(1,1:2)=X1;delf1(1) = polyval(polyder(x1),X1(1));delf1(1) = (delf1(1))+(x1x2*X1(2));delf1(2) = polyval(polyder(x2),X1(2));delf1(2) = (delf1(2))+(x1x2*X1(1));if all(X1)== 0fprintf(\'%d %d is the optimum point\',X1(1),X1(2));endit=2;while all(delf1)==1s=-delf1;x1new(1)=s(1)^2;x1new(2)=2*X1(1)*s(1);x1new(3) = X1(1)^2;x1new=x1new*x1(1);x1new_(2)=x1(2)*s(1);x1new_(3)=x1(2)*X1(1);x1new = x1new+x1new_;x2new(1)=s(2)^2;x2new(2)=2*X1(2)*s(2);x2new(3) = X1(2)^2;x2new=x2new*x2(1);x2new_(2)=x2(2)*s(2);x2new_(3)=x2(2)*X1(2);x2new = x2new+x2new_;x1x2new(1)=s(1)*s(2);x1x2new(2)=X1(1)*s(2)+X1(2)*s(1);x1x2new(3)=X1(1)*X1(2);x1x2new=x1x2*x1x2new;df = polyder(x1new+x2new+x1x2new);lambda(it) = roots(df);X1=X1+lambda(it)*s;delf1(1) = polyval(polyder(x1),X1(1));delf1(1) = (delf1(1))+(x1x2*X1(2));delf1(2) = polyval(polyder(x2),X1(2));delf1(2) = (delf1(2))+(x1x2*X1(1));itrep(it)=it;srep(it,1:2)=s;Xrep(it,1:2)=X1;it=it+1;end[m,n]=size(itrep);matrix=[itrep\' srep(1:n,1) srep(1:n,2) Xrep(1:n,1) Xrep(1:n,2)];answer = char(num2str(X1));answer = [\'The optimal point is [\' answer \']\'];msgbox(answer,\'Solution\');disp(\' Press Any key to View Detailed Report............\');pauseecho offreport steep;clc--------------------------------------------------------------------------------%最速下降法(爬山法)的一个matlab程序function y=steepest(x)%This program uses the steepest descent direction algorithm%to calculate the minimum of the function f(x)=x(1)^2+2*x(2)^2eps=input(\'please input your accuracy:\');%eps is the demmanded accuracy on the norm of%the gradient of the objective functionm=1;%m is the count of the iteration step of the algorithmiterstep(1,:)=x;%iterstep contains the intermediate points of iterationwhile norm(gradobject1(x))>epsgrad=gradobject1(x);alpha=goldsplictobj(x);x=x-alpha*grad;iterstep(m+1,:)=x;m=m+1;endstep=max(size(iterstep))-1plot(iterstep(:,1),iterstep(:,2));%Draw the search trajectorytitle(\'The search trajectory of the Steepest dscent direction algorithm\'); xlabel(\'x1-axis\');ylabel(\'x2-axis\');text(x(1),x(2),\'The minimum point found by the algorithm\');text(iterstep(1,1),iterstep(1,2),\'The initial point (2,1)\');gtext(\'The number of the total iteration steps of the algorithm is:\'); gtext(\'The set accuracy in advance is 1.0*10^{-10}\');%The following subfunction is on the objective functionfunction y=object1(v)y=v(1)^2+2*v(2)^2;%The following subfunction is on the gradient of%the objective functionfunction y=gradobject1(v)y(1)=2*v(1);y(2)=4*v(2);%The following subfunction is on the comming%search function of alphafunction y=substi(alpha,x)y=feval(\'object1\',x-alpha*gradobject1(x));%The following subfunction is on the goldspliction %search of the substi functionfunction y=goldsplictobj(x)a=0;b=10;eps=0.01;y1=a+0.382*(b-a);y2=a+0.618*(b-a);while abs(b-a)>epsif substi(y1,x)>substi(y2,x)a=y1;b=b;y1=a+0.382*(b-a);y2=a+0.618*(b-a);elseif substi(y2,x)>substi(y1,x)a=a;b=y2;y1=a+0.382*(b-a);y2=a+0.618*(b-a);elsea=y1;b=y2;y1=a+0.382*(b-a);y2=a+0.618*(b-a);endendy=(y1+y2)/2;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验的题目和要求
一、所属课程名称:
最优化方法
二、实验日期:
2010年5月10日~2010年5月15日
三、实验目的
掌握最速下降法,牛顿法和共轭梯度法的算法思想,并能上机编程实现相应的算法。
二、实验要求
用MA TLA B实现最速下降法,牛顿法和共轭梯度法求解实例。
四、实验原理
最速下降法是以负梯度方向最为下降方向的极小化算法,相邻两次的搜索方向是互相直交的。
牛顿法是利用目标函数)(x f 在迭代点k x 处的T aylor 展开式作为模型函数,并利用这个二次模型函数的极
小点序列去逼近目标函数的极小点。
共轭梯度法它的每一个搜索方向是互相共轭的,而这些搜索方向k d 仅仅是负梯度方向k g -与上一次接
待的搜索方向1-k d 的组合。
五.运行及结果如下:
最速下降法:
题目:f=(x-2)^2+(y-4)^2
M文件:
fu ncti on [R,n]=stee l(x0,y0,e ps)
syms x;
syms y ;
f=(x-2)^2+(y-4)^2;
v=[x,y];
j=jac obi an(f ,v);
T=[s ubs(j(1),x,x0),subs (j (2),y,y0)];
temp=s qrt((T(1))^2+(T (2))^2);
x 1=x0;y 1=y 0;
n=0;
sym s k k;
w hi le (temp>eps )
d=-T;
f1=x 1+kk*d(1);f2=y1+k k*d(2);
fT=[su bs(j (1),x,f1),sub s(j(2),y,f2)];
fu n=sqrt((fT(1))^2+(fT(2))^2);
Mini=Gold(fun,0,1,0.00001);
x0=x1+Mini*d(1);y0=y1+Mini*d(2);
T=[subs(j(1),x,x0),subs(j(2),y,y0)]; temp=sqrt((T(1))^2+(T(2))^2);
x1=x0;y1=y0;
n=n+1;
end
R=[x0,y0]
调用黄金分割法:
M文件:
functionMini=Gold(f,a0,b0,eps)
syms x;format long;
syms kk;
u=a0+0.382*(b0-a0);
v=a0+0.618*(b0-a0);
k=0;
a=a0;b=b0;
array(k+1,1)=a;array(k+1,2)=b;
while((b-a)/(b0-a0)>=eps)
Fu=subs(f,kk,u);
Fv=subs(f,kk,v);
if(Fu<=Fv)
b=v;
v=u;
u=a+0.382*(b-a);
k=k+1;
elseif(Fu>Fv)
a=u;
u=v;
v=a+0.618*(b-a);
k=k+1;
end
array(k+1,1)=a;array(k+1,2)=b;
end
Mini=(a+b)/2;
输入:
[R,n]=steel(0,1,0.0001)
R= 1.99999413667642 3.99999120501463 R = 1.99999413667642 3.99999120501463
n= 1
牛顿法:
题目:f=(x-2)^2+(y-4)^2
M文件:
syms x1x2;
f=(x1-2)^2+(x2-4)^2;
v=[x1,x2];
df=jacobian(f,v);
df=df.';
G=jacobian(df,v);
epson=1e-12;x0=[0,0]';g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)});G1=su bs(G,{x1,x2},{x0(1,1),x0(2,1)});k=0;mul_count=0;sum_count=0; mul_count=mul_count+12;sum_count=sum_count+6;
while(norm(g1)>epson)
p=-G1\g1;
x0=x0+p;
g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)});
G1=subs(G,{x1,x2},{x0(1,1),x0(2,1)});
k=k+1;
mul_count=mul_count+16;sum_count=sum_count+11;
end;
k
x0
mul_count
sum_count
结果::k= 1
x0=
2
4
mul_count = 28
sum_count = 17
共轭梯度法:
题目:f=(x-2)^2+(y-4)^2
M文件:
functionf=conjugate_grad_2d(x0,t)
x=x0;
symsxi yi a
f=(xi-2)^2+(yi-4)^2;
fx=diff(f,xi);
fy=diff(f,yi);
fx=subs(fx,{xi,yi},x0);
fy=subs(fy,{xi,yi},x0);
fi=[fx,fy];
count=0;
while double(sqrt(fx^2+fy^2))>t
s=-fi;
if count<=0
s=-fi;
else
s=s1;
end
x=x+a*s;
f=subs(f,{xi,yi},x);
f1=diff(f);
f1=solve(f1);
iff1~=0
ai=double(f1);
else
break
x,f=subs(f,{xi,yi},x),count
end
x=subs(x,a,ai);
f=xi-xi^2+2*xi*yi+yi^2;
fxi=diff(f,xi);
fyi=diff(f,yi);
fxi=subs(fxi,{xi,yi},x);
fyi=subs(fyi,{xi,yi},x);
fii=[fxi,fyi];
d=(fxi^2+fyi^2)/(fx^2+fy^2);
s1=-fii+d*s;
count=count+1;
fx=fxi;
fy=fyi;
end
x,f=subs(f,{xi,yi},x),count
输入:conjugate_grad_2d([0,0],0.0001)
结果:
x=0.24998825499785 -0.24999998741273
f=0.12499999986176
count=10
ans = 0.12499999986176
六、结论如下:
最速下降法越接近极小值,步长越小,前进越慢。
牛顿法要求二阶导数,计算量很大。
共轭梯度法是介于最速下降和牛顿法之间的算法,
克服了最速下降法的收敛速度慢的缺点,又避免了牛顿法的大计算量。
--。