用MATLAB实现最速下降法-牛顿法和共轭梯度法求解实例
最优化方法及其matlab实现

一、引言1.1 阐述最优化方法的重要性 1.2 介绍文章内容二、最优化方法的基本概念与分类2.1 最优化问题的定义2.2 最优化方法的分类2.2.1 无约束最优化2.2.2 约束最优化三、常用最优化方法的原理与特点3.1 梯度下降法3.1.1 原理介绍3.1.2 算法流程3.1.3 特点分析3.2 牛顿法3.2.1 原理介绍3.2.2 算法流程3.2.3 特点分析3.3 共轭梯度法3.3.1 原理介绍3.3.2 算法流程3.3.3 特点分析四、最优化方法在实际问题中的应用4.1 工程优化问题4.1.1 结构优化设计4.1.2 控制优化问题4.2 数据拟合与机器学习4.2.1 深度学习中的优化问题4.2.2 模型参数的优化五、 Matlab实现最优化方法的实例5.1 Matlab在最优化方法中的应用 5.2 梯度下降法的Matlab实现5.2.1 代码示例5.2.2 实例分析5.3 牛顿法的Matlab实现5.3.1 代码示例5.3.2 实例分析5.4 共轭梯度法的Matlab实现5.4.1 代码示例5.4.2 实例分析六、结论及展望6.1 对最优化方法的总结与归纳6.2 未来最优化方法的发展方向七、参考文献以上是一篇关于“最优化方法及其Matlab实现”的文章大纲,您可以根据这个大纲和相关资料进行深入撰写。
文章内容需要涉及最优化方法的基本概念与分类、常用最优化方法的原理与特点、最优化方法在实际问题中的应用、Matlab实现最优化方法的实例等方面,保证文章内容的权威性和实用性。
另外,在撰写文章过程中,建议加入一些案例分析或者数据实验,通过具体的应用场景来展示最优化方法的有效性和优越性,增强文章的说服力和可读性。
对于Matlab实现部分也要注重代码的清晰性和易懂性,方便读者理解和实践。
希望您能够通过深入的研究和精心的撰写,呈现一篇高质量、流畅易读、结构合理的中文文章,为读者提供有益的知识和参考价值。
Matlab中的最优化问题求解方法

Matlab中的最优化问题求解方法近年来,最优化问题在各个领域中都扮演着重要的角色。
无论是在工程、经济学还是科学研究中,我们都需要找到最优解来满足特定的需求。
而Matlab作为一种强大的数值计算软件,在解决最优化问题方面有着广泛的应用。
本文将介绍一些Matlab中常用的最优化问题求解方法,并探讨其优缺点以及适用范围。
一. 无约束问题求解方法1. 最速下降法最速下降法是最简单且直观的无约束问题求解方法之一。
其基本思想是沿着梯度的反方向迭代求解,直到达到所需的精度要求。
然而,最速下降法的收敛速度通常很慢,特别是在局部极小值点附近。
2. 共轭梯度法共轭梯度法是一种改进的最速下降法。
它利用了无约束问题的二次函数特性,通过选择一组相互共轭的搜索方向来提高收敛速度。
相比于最速下降法,共轭梯度法的收敛速度更快,尤其适用于大规模优化问题。
3. 牛顿法牛顿法是一种基于二阶导数信息的优化方法。
它通过构建并求解特定的二次逼近模型来求解无约束问题。
然而,牛顿法在高维问题中的计算复杂度较高,并且需要矩阵求逆运算,可能导致数值不稳定。
二. 线性规划问题求解方法1. 单纯形法单纯形法是一种经典的线性规划问题求解方法。
它通过在可行域内进行边界移动来寻找最优解。
然而,当问题规模较大时,单纯形法的计算复杂度会大幅增加,导致求解效率低下。
2. 内点法内点法是一种改进的线性规划问题求解方法。
与单纯形法不同,内点法通过将问题转化为一系列等价的非线性问题来求解。
内点法的优势在于其计算复杂度相对较低,尤其适用于大规模线性规划问题。
三. 非线性规划问题求解方法1. 信赖域算法信赖域算法是一种常用的非线性规划问题求解方法。
它通过构建局部模型,并通过逐步调整信赖域半径来寻找最优解。
信赖域算法既考虑了收敛速度,又保持了数值稳定性。
2. 遗传算法遗传算法是一种基于自然进化过程的优化算法。
它模拟遗传操作,并通过选择、交叉和变异等操作来搜索最优解。
遗传算法的优势在于其适用于复杂的非线性规划问题,但可能需要较长的计算时间。
用MATLAB实现最速下降法_牛顿法和共轭梯度法求解实例——张小强

机电产品优化设计课程设计报告姓名:张小强学号:201222080633学院:机械电子工程学院实验的题目和要求一.课程名称:最优化设计方法二.实验日期:2013年6月27日三.实验目的:掌握最速下降法,牛顿法和共轭梯度法的算法思想,并能上机编程实现相应的算法。
四.实验要求:用MATLAB 实现最速下降法,牛顿法和共轭梯度法求解实例。
五.实验原理:最速下降法是以负梯度方向最为下降方向的极小化算法,相邻两次的搜索方向是互相直交的。
牛顿法是利用目标函数)(x f 在迭代点k x 处的Taylor 展开式作为模型函数,并利用这个二次模型函数的极小点序列去逼近目标函数的极小点。
共轭梯度法它的每一个搜索方向是互相共轭的,而这些搜索方向k d 仅仅是负梯度方向k g -与上一次搜索方向1-k d 的组合。
五.运行结果如下: 题目:f=(x-2)^2+(y-4)^2①.最速下降法:M 文件:function [R,n]=steel(x0,y0,eps)syms x ;syms y ;f=(x-2)^2+(y-4)^2;v=[x,y];j=jacobian(f,v);T=[subs(j(1),x,x0),subs(j(2),y,y0)];temp=sqrt((T(1))^2+(T(2))^2);x1=x0;y1=y0;n=0;syms kk ;while (temp>eps)d=-T;f1=x1+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文件:function Mini=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;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.99999120501463n = 1②.牛顿法: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=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③.共轭梯度法:M文件: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;if count<=0s=-fi;elses=s1;endx=x+a*s;f=subs(f,{xi,yi},x);f1=diff(f);f1=solve(f1);if f1~=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中,我们可以通过编写程序来实现最速下降法求取函数在给定范围内的极小值。
本文将围绕最速下降法在Matlab中的实现展开讨论,包括算法原理、程序编写、实例演示等内容。
一、最速下降法的原理及步骤最速下降法是一种基于梯度下降的优化算法,其原理是通过沿着函数梯度的负方向不断迭代,来逼近函数的极小值点。
其基本步骤如下:1. 初始化:选择初始点x0,设定迭代终止条件。
2. 梯度计算:计算当前点的梯度值∇f(xk)。
3. 方向选择:选择负梯度方向p_k=-∇f(xk)。
4. 步长确定:求解使得f(xk+α_pk)最小化的步长αk。
5. 迭代更新:更新迭代点xk+1=xk+αkp_k,并检查迭代终止条件。
二、最速下降法在Matlab中的实现在Matlab中,我们可以通过编写程序来实现最速下降法。
以下是一个简单的最速下降法求解函数极小值的Matlab程序示例:```matlabfunction [x, fval, exitflag, output] = steepestdescent(fun, x0, options)fun为目标函数句柄,x0为初始点,options为优化选项[x, fval, exitflag, output] = fminunc(fun, x0, options);end```以上代码中,我们使用了Matlab内置的优化函数fminunc来实现最速下降法。
其中fun为目标函数句柄,x0为初始点,options为优化选项,x为最优解,fval为最优值,exitflag为退出标志,output为优化输出。
三、实例演示下面我们以一个简单的二元函数为例,演示最速下降法在Matlab中的实现过程。
假设我们要求解的目标函数为f(x, y) = x^2 + y^2,且x, y∈[0, 2]。
我们可以通过编写如下Matlab程序来实现最速下降法的求解:```matlabfun = (x) x^2 + y^2; 定义目标函数x0 = [1, 1]; 设置初始点options = optimoptions('fminunc', 'Algorithm', 'quasi-newton'); 设置优化选项[x, fval, exitflag, output] = steepestdescent(fun, x0, options); 调用最速下降法disp(['最优解为:', num2str(x)]);disp(['最优值为:', num2str(fval)]);```通过以上程序,我们可以得到最优解为x=[0, 0],最优值为fval=0,这即为目标函数在给定范围内的极小值点及极小值。
matlab牛顿法代码举例

matlab牛顿法代码举例使用 MATLAB 实现牛顿法的示例代码。
牛顿法(也称为牛顿-拉弗森方法)是一种在实数和复数域上求解方程的数值方法。
该方法使用函数和其导数的值来寻找函数零点的近似值。
function [root, iter] = newtonMethod(func, dfunc, x0, tol, maxIter) "%"newtonMethod 使用牛顿法求解方程"%"输入:"%"func - 目标函数"%"dfunc - 目标函数的导数"%"x0 - 初始猜测值"%"tol - 容差,求解精度"%"maxIter - 最大迭代次数"%"输出:"%"root - 方程的根"%"iter - 迭代次数x = x0;for iter = 1:maxIterfx = func(x);dfx = dfunc(x);if abs(dfx) < epserror('导数太小,无法继续迭代');endxnew = x - fx/dfx;if abs(xnew - x) < tolroot = xnew;return;endx = xnew;enderror('超过最大迭代次数');end"%"示例: 求解 x^3 - x - 2 = 0func = @(x) x^3 - x - 2;dfunc = @(x) 3*x^2 - 1;x0 = 1; "%"初始猜测值tol = 1e-6; "%"容差maxIter = 1000; "%"最大迭代次数[root, iter] = newtonMethod(func, dfunc, x0, tol, maxIter);fprintf('根是: "%"f, 在 "%"d 次迭代后找到\n', root, iter);在这个代码中,newtonMethod 函数接收一个函数 func 及其导数 dfunc,一个初始猜测值,容差和最大迭代次数 maxIter。
matlab 最速下降法

matlab 最速下降法MATLAB 最速下降法最速下降法是一种求解无约束优化问题的基本方法,也是一种迭代算法。
该方法的基本思想是:在当前点处,沿着当前点到最优解的方向,走一步能够使目标函数值下降最快的方向,即负梯度方向。
因此,最速下降法也被称为梯度下降法。
MATLAB 是一种强大的数学计算软件,可以用于求解各种数学问题,包括最速下降法。
在 MATLAB 中,可以使用 fminunc 函数来实现最速下降法。
该函数的基本语法如下:[x,fval,exitflag,output] = fminunc(fun,x0,options)其中,fun 是目标函数,x0 是初始点,options 是选项参数。
该函数的返回值包括最优解 x、目标函数值 fval、退出标志 exitflag 和输出信息 output。
下面是一个使用 fminunc 函数求解 Rosenbrock 函数的例子:fun = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;x0 = [-1.2,1];options =optimoptions('fminunc','Display','iter','Algorithm','quasi-newton');[x,fval,exitflag,output] = fminunc(fun,x0,options);在上面的例子中,Rosenbrock 函数是一个经典的无约束优化问题,其目标函数为:f(x) = 100*(x2-x12)2 + (1-x1)2该函数的最优解为 (1,1),最小值为 0。
使用 fminunc 函数求解该问题,可以得到最优解 x = (1,1),最小值 fval = 2.9387e-11。
需要注意的是,最速下降法是一种基本的优化方法,但其收敛速度较慢,容易陷入局部最优解。
最优化牛顿法最速下降法共轭梯度法matlab代码
牛顿法迭代公式:(1)2()1()[()]()k k k k x x f x f x +-=-∇∇Matlab 代码:function [x1,k] =newton(x1,eps)hs=inline('(x-1)^4+y^2'); 写入函数ezcontour(hs,[-10 10 -10 10]); 建立坐标系hold on; 显示图像syms x y 定义变量f=(x-1)^4+y^2; 定义函数grad1=jacobian(f,[x,y]); 求f 的一阶梯度grad2=jacobian(grad1,[x,y]); 求f 的二阶梯度k=0; 迭代初始值while 1 循环grad1z=subs(subs(grad1,x,x1(1)),y,x1(2)); 给f 一阶梯度赋初值 grad2z=subs(subs(grad2,x,x1(1)),y,x1(2)); 给f 二阶梯度赋初值 x2=x1-inv(grad2z)*(grad1z)'; 核心迭代公式if norm(x1-x2)<eps 判断收敛条件break;elseplot([x1(1),x2(1)],[x1(2),x2(2)],'-r*'); 画图k=k+1; 迭代继续x1=x2; 赋值endendend优点:在极小点附近收敛快缺点:但是要计算目标函数的hesse 矩阵最速下降法1. :选取初始点xo ,给定误差2. 计算一阶梯度。
若一阶梯度小于误差,停止迭代,输出3. 取()()()k k p f x =∇4. 10t ()(), 1.min k k k k k k k k k k t f x t p f x tp x x t p k k +≥+=+=+=+进行一维搜索,求,使得令转第二步例题:求min (x-2)^4+(x-2*y)^2.初始值(0,3)误差为0.1(1)编写一个目标函数,存为f.mfunction z = f( x,y )z=(x-2.0)^4+(x-2.0*y)^2;end(2)分别关于x 和y 求出一阶梯度,分别存为fx.m 和fy.mfunction z = fx( x,y )z=2.0*x-4.0*y+4.0*(x-2.0)^3;end和function z = fy( x,y )z=8.0*y-4.0*x;end(3)下面是脚本文件,一维搜索用的是黄金分割法Tic 计算时间eps=10^(-4);误差err=10;dt=0.01;x0=1.0;初始值y0=1.0;mm=0;while err>eps 黄金分割法dfx=-fx(x0,y0);dfy=-fy(x0,y0);tl=0;tr=1;确定一维搜索的区间h=3;nn=0;gerr=10;geps=10^(-4);while gerr>gepstll=tl+0.382*abs(tr-tl);trr=tl+0.618*abs(tr-tl);iff(x0+tll*h*dfx,y0+tll*h*dfy)>f(x0+trr*h*dfx,y0+trr*h*dfy) tl=tll;elsetr=trr;endgerr=abs(tl-tr); 区间的长度之差tt=0.5*(tl+tr);nn=nn+1;步数增加if nn>200 迭代终止条件breakendendx0=x0+tt*h*dfx; 重新迭代y0=y0+tt*h*dfy;err=sqrt(fx(x0,y0)^2+fy(x0,y0)^2);mm=mm+1;步数增加if mm>700 迭代步数超过700,终止breakendendres=[x0,y0];输出最后的x,y。
最速下降法+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程序及例题
牛顿法matlab程序及例题牛顿法是一种求解非线性方程和优化问题的常用方法。
它利用函数的一阶和二阶导数信息来不断逼近函数的零点或极值点。
在MATLAB 中,可以用fzero函数实现非线性方程的求解,用fminunc函数实现优化问题的求解。
以下是一个简单的牛顿法的MATLAB程序示例:function [x, fx, n] = newton(f, df, x0, tol, max_iter) % f: 目标函数% df: 目标函数的一阶导数% x0: 初值% tol: 精度要求% max_iter: 最大迭代次数n = 0;while n < max_iterfx = f(x0);dfx = df(x0);if abs(dfx) < 1e-9error('牛顿法失败:一阶导数过小');endx = x0 - fx / dfx;if abs(x - x0) < tolreturn;endx0 = x;n = n + 1;enderror('牛顿法失败:达到最大迭代次数');下面是一个例题,通过牛顿法求解方程sin(x) = x / 2:f = @(x) sin(x) - x / 2;df = @(x) cos(x) - 1 / 2;[x, fx, n] = newton(f, df, 1, 1e-9, 100);fprintf('解:%.16f,函数值:%.16f,迭代次数:%d', x, fx, n);运行结果为:解:0.0000000000000000,函数值:0.0000000000000000,迭代次数:4可以看到,牛顿法很快就找到了方程的一个根。
需要注意的是,牛顿法可能会失败,特别是在一阶导数过小或初值离根太远的情况下。
因此,使用时需要谨慎,并进行必要的检查和处理。
牛顿法matlab程序及例题
牛顿法matlab程序及例题牛顿法是一种求解非线性方程的优秀方法,其基本思想是利用切线逼近非线性方程的根,逐步逼近准确解。
下面我们介绍牛顿法的matlab程序及例题。
【程序】function [x_iter,k]=newton(f,df,x0,tol,maxit)%牛顿法%输入:f-目标函数,df-目标函数的导函数,x0-初始值,tol-误差限,maxit-最大迭代次数%输出:x_iter-迭代结果,k-迭代次数k=0;x_iter=x0;err=tol+1;while(err>tol && k<maxit)x=x_iter;x_iter=x-f(x)/df(x);err=abs(x_iter-x);k=k+1;endif(k==maxit)fprintf('未收敛');elsefprintf('迭代次数:%d',k);end【例题】example:求解非线性方程f(x)=x^3-5x^2+3x+7=0,初始值为x0=2,精度为1e-6。
解法:首先求导得df(x)=3x^2-10x+3,然后代入程序:>> f=@(x)x^3-5*x^2+3*x+7;>> df=@(x)3*x^2-10*x+3;>> [x_iter,k]=newton(f,df,2,1e-6,100);>> x_iterans =4.3793>> kk =5故该非线性方程的根为x=4.3793,迭代次数为5次。
【总结】通过以上例题,我们可以发现牛顿法是一种十分有效的求解非线性方程的方法,其程序简洁高效,对于复杂的非线性方程求解也能得到较好的结果。
因此在实际应用中,我们可以采用牛顿法来求解非线性方程,提高计算效率和精度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目和要求
最速下降法是以负梯度方向最为下降方向的极小化算法,相邻
两次的搜索方向是互相直交的。
牛顿法是利用目标函数)(x f 在迭代点k x 处的Taylor 展开式作为模型函数,并利用这个二次模型函数的极小
点序列去逼近目标函数的极小点。
共轭梯度法它的每一个搜索方向是互相共轭的,而这些搜索方向k d 仅仅是负梯度方向k g -与上一次接待
的搜索方向1-k d 的组合。
运行及结果如下:
最速下降法:
题目:f=(x-2)^2+(y-4)^2
M 文件:
function [R,n]=steel(x0,y0,eps)
syms x ;
syms y ;
f=(x-2)^2+(y-4)^2;
v=[x,y];
j=jacobian(f,v);
T=[subs(j(1),x,x0),subs(j(2),y,y0)];
temp=sqrt((T(1))^2+(T(2))^2);
x1=x0;y1=y0;
n=0;
syms kk ;
while (temp>eps)
d=-T;
f1=x1+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;
end
R=[x0,y0]
调用黄金分割法:
M文件:
function Mini=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文件:
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;
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文件:
function f=conjugate_grad_2d(x0,t)
x=x0;
syms xi 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);
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);
if f1~=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
结论如下:
最速下降法越接近极小值,步长越小,前进越慢。
牛顿法要求二阶导数,计算量很大。
共轭梯度法是介于最速下降和牛顿法之间的算法,克服了最速下降法的收敛速度慢的缺点,又避免了牛顿法的大计算量。