用MATLAB实现共轭梯度法求解实例

合集下载

prp共轭梯度法matlab

prp共轭梯度法matlab

prp共轭梯度法matlab

PRP共轭梯度法是一种用于求解无约束优化问题的数值方法。它是共轭梯度法的一种改进算法,通过引入一种预处理技术来加速收敛速度。

共轭梯度法是一种迭代方法,用于求解线性方程组或者最小化二次型函数。它的基本思想是利用共轭方向的性质,通过一系列迭代步骤来逼近最优解。这种方法在大规模问题的求解中非常有效,因为它不需要存储整个系统矩阵,而只需要存储向量和一些中间变量即可。

然而,传统的共轭梯度法在实际应用中存在一些问题。首先,它对于一些病态问题的收敛速度较慢,需要较多的迭代步骤才能得到满意的结果。其次,它对于非二次型函数的最小化问题效果不佳,容易陷入局部最优解。为了克服这些问题,PRP共轭梯度法应运而生。

PRP共轭梯度法采用了一种预处理技术,通过对梯度向量进行修正来提高算法的收敛速度。具体来说,PRP共轭梯度法在每一步迭代中计算一个修正系数,将修正系数和梯度向量的线性组合用于更新搜索方向。这种修正技术可以加速算法的收敛速度,特别是在处理病态问题和非二次型函数时效果显著。

PRP共轭梯度法的算法流程如下:

1. 初始化变量,包括初始解向量、梯度向量、搜索方向和修正系数。

2. 计算修正系数,根据修正系数和梯度向量的线性组合更新搜索方向。

3. 求解步长,通过线搜索方法确定下一步的迭代点。

4. 更新解向量和梯度向量。

5. 判断收敛条件,如果满足条件则停止迭代,否则返回第2步继续迭代。

PRP共轭梯度法在实际应用中具有广泛的应用价值。它可以用于求解大规模线性方程组、最小化二次型函数以及其他无约束优化问题。与传统的共轭梯度法相比,PRP共轭梯度法具有更快的收敛速度和更好的全局搜索能力。此外,PRP共轭梯度法还可以与其他优化算法结合,形成更加强大的求解器,提高问题求解的效率和精度。

共轭梯度法 MATLAB函数代码

共轭梯度法 MATLAB函数代码

function x = My_CGM(x0,A,b)% 共轭梯度法(Conjugate Gradient Method)求解求解线性方程 Ax = b%SYNTAX:% x = My_CGM(x0,A,b,epsilon)%DESCRIPTION:%% INPUT:% x0 -- 初始解% A -- 系数矩阵% b -- 线性方程右端列向量% OUTPUT:% x -- 解列向量%REFERENCES:% 《有限单元法》 by 王勖成 P246%REVISION: 1.0b = b(:);x0 = x0(:);x_old = x0;gamma_old = b - A*x_old;p_old = gamma_old;N = length(b);for ii = 1:Nalpha = (p_old.'*gamma_old)/(p_old.'*A*p_old);% Eq.6.5.13x_new = x_old + alpha*p_old;gamma_new = b - A*x_new;beta = -(p_old.'*A*p_old)/(p_old.'*A*gamma_new);% Eq.6.5.13p_new = p_old + beta*gamma_new;% updatex_old = x_new;p_old = p_new;endx = x_new;end

用MATLAB实现最速下降法_牛顿法和共轭梯度法求解实例——张小强

用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)];

matlab优化算法100例

matlab优化算法100例

matlab优化算法100例

1. 线性规划问题的优化算法:线性规划问题是一类目标函数和约束

条件都是线性的优化问题。Matlab中有很多优化算法可以解决线性规划

问题,如单纯形法、内点法等。下面以单纯形法为例介绍线性规划问题的

优化算法。

单纯形法是一种迭代算法,通过不断改变基础解来寻找问题的最优解。它的基本思想是从一个可行解出发,通过改变基本变量和非基本变量的取

值来逐步逼近最优解。

2. 非线性规划问题的优化算法:非线性规划问题是一类目标函数和

约束条件至少有一个是非线性的优化问题。Matlab中有很多优化算法可

以解决非线性规划问题,如拟牛顿法、共轭梯度法等。下面以拟牛顿法为

例介绍非线性规划问题的优化算法。

拟牛顿法是一种逐步逼近最优解的算法,通过近似目标函数的二阶导

数信息来构造一个二次模型,然后通过求解该二次模型的最优解来更新当

前解。

3. 全局优化问题的优化算法:全局优化问题是一类目标函数存在多

个局部最优解的优化问题。Matlab中有很多优化算法可以解决全局优化

问题,如遗传算法、模拟退火算法等。下面以遗传算法为例介绍全局优化

问题的优化算法。

遗传算法是一种模拟生物进化过程的优化算法,通过基因编码、选择、交叉和变异等操作来不断迭代演化一组个体,最终找到全局最优解。

4. 多目标优化问题的优化算法:多目标优化问题是一类存在多个目

标函数并且目标函数之间存在冲突的优化问题。Matlab中有很多优化算

法可以解决多目标优化问题,如多目标粒子群优化算法、多目标遗传算法等。下面以多目标粒子群优化算法为例介绍多目标优化问题的优化算法。

matlab梯度算法

matlab梯度算法

matlab梯度算法

Matlab梯度算法

在数学和计算机科学中,梯度是指一个多元函数在某一点上的变化率或斜率。梯度算法是一种优化算法,用于找到函数的最小值或最大值。在Matlab中,有多种方法可以使用梯度算法来优化函数,包括梯度下降和共轭梯度法。本文将详细介绍Matlab中的梯度算法,并逐步讲解其原理和应用。

I. 梯度下降法

梯度下降法是一种基于迭代的优化算法,通过计算函数的梯度来更新参数的值,以逐步接近函数的最小值。在Matlab中,可以使用"gradientDescent"函数来实现梯度下降法。

1. 实现梯度下降法

首先,我们需要定义一个优化目标函数,例如:f(x) = x^2 + 2x + 1。然后,定义其梯度函数为g(x) = 2x + 2。接下来,我们可以使用以下代码来计算梯度下降:

matlab

定义优化目标函数

f = (x) x^2 + 2*x + 1;

定义梯度函数

g = (x) 2*x + 2;

初始化参数

x0 = 0;

设置学习率和迭代次数

alpha = 0.01;

iterations = 100;

梯度下降法

for i = 1:iterations

x0 = x0 - alpha * g(x0);

end

打印最优解

disp(['Optimal solution: ', num2str(x0)]);

在这个例子中,我们使用了学习率(alpha)为0.01,迭代次数(iterations)

为100。通过不断更新参数x0的值,最终得到了最优解。

2. 梯度下降法的原理

梯度下降法的核心思想是利用函数在当前点的梯度信息来更新参数的值,以便能够向着函数的最小值前进。具体来说,算法的步骤如下:

最优化—基于matlab的共轭梯度法

最优化—基于matlab的共轭梯度法

共轭梯度算法程序:

function f=conjugate_gradient(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);

fi=[fx,fy];

n=0;

while double(sqrt(fx^2+fy^2))>t s=-fi;

if n<=0

s=-fi;

else

s=s1;

end

x=x+a*s;

f=subs(f,{xi,yi},x);

f1=diff(f);

f1=solve(f1);

if fi~=0

ai=double(f1);

else

break

x,f=subs(f,{xi,yi},x),n

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;

n=n+1;

fx=fxi;

fy=fyi;

end

x,f=subs(f,{xi,yi},x),n

运行结果为:

>> conjugate_gradient([0 0],0.0001) x =

0.2500 -0.2500

f =

0.1250 n =

10 ans =

0.1250

Matlab共轭梯度法

Matlab共轭梯度法

1.共轭梯度法求解。

121222122

123f (x)min x x x x x --+=

T x )4,2(0-= 化成c x b Gx x x f T T ++=21)(的形式为: ()⎪⎪⎭

⎫ ⎝⎛-+⎪⎪⎭⎫ ⎝⎛⎥⎦⎤⎢⎣⎡--=2121210,21113),(21)(x x x x x x x f Matlab 程序如下:

%t 是精度要求,x(:,1)是初始点,f 是目标函数,A 是对称正定矩阵

t=0.001;g=zeros(2,10);p=g;la=zeros(1,10);x=g;bt=la;xb=[0 0]'; x(:,1)=[-2 4]';i=1;

%目标函数f

syms x1x2;

f=3/2*x1^2+1/2*x2^2-x1*x2-2*x1;

A=[3 -1;-1 1];

%计算梯度df

fx1=diff(f,x1);

fx2=diff(f,x2);

f1=subs(fx1,{x1,x2},{x(1,1),x(2,1)});

f2=subs(fx2,{x1,x2},{x(1,1),x(2,1)});

df=[f1,f2]';

while double(sqrt(f1^2+f2^2))>t

g(:,i)=df;

%计算bt

if i>1

bt(i)=(g(1,i)^2+g(2,i)^2)/(g(1,i-1)^2+g(2,i-1)^2); else

bt(i)=0;

end

%计算p 搜索方向向量

p(:,i+1)=-g(:,i)+bt(i)*p(:,i);

%计算la 值

la(i)=-(g(:,i)'*p(:,i+1))/(p(:,i+1)'*A*p(:,i+1)); %计算x 值

用MATLAB实现共轭梯度法求解实例

用MATLAB实现共轭梯度法求解实例

用MATLAB 实现共轭梯度法求解实例

康福 201103710031

一.无约束优化方法

1.1 无约束优化方法的必要性

一般机械优化设计问题,都是在一定的限制条件下追求某一指标为最小,它们都属于约束优化问题。但是为什么要研究无约束优化问题?

(1)有些实际问题,其数学模型本身就是一个无约束优化问题。

(2)通过熟悉它的解法可以为研究约束优化问题打下良好的基础。

(3)约束优化问题的求解可以通过一系列无约束优化方法来达到。所以无约束优

化问题的解法是优化设计方法的基本组成部分,也是优化方法的基础。

(4)对于多维无约束问题来说,古典极值理论中令一阶导数为零,但要求二阶可微,且要判断海赛矩阵为正定才能求得极小点,这种方法有理论意义,但无实用价值。和一维问题一样,若多元函数F(X)不可微,亦无法求解。但古典极值理论是无约束优化方法发展的基础。

1.2共轭梯度法

目前已研究出很多种无约束优化方法,它们的主要不同点在于构造搜索方向上的差别。

(1)间接法——要使用导数,如梯度法、(阻尼)牛顿法、变尺度法、共轭梯度法等。

(2)直接法——不使用导数信息,如坐标轮换法、鲍威尔法单纯形法等。 用直接法寻找极小点时,不必求函数的导数,只要计算目标函数值。这类方法较适用于解决变量个数较少的(n ≤20)问题,一般情况下比间接法效率低。间接法除要计算目标函数值外,还要计算目标函数的梯度,有的还要计算其海赛矩阵。 搜索方向的构成问题乃是无约束优化方法的关键。

共轭梯度法是沿着共轭方向进行搜索,属于共轭方向法中的一种,该方法中每一个共轭向量都是依赖于迭代点处的负梯度而构造出来。共轭梯度法作为一种实用的迭代法,它主要有下面的优点:

计算方法——共轭梯度法求解线性方程组的matlab程序

计算方法——共轭梯度法求解线性方程组的matlab程序

计算方法上机报告

附录1 共轭梯度法求解线性方程组的matlab程序

21

附录2 生成系数矩阵、右端项以及阶数的matlab程序

22 附录2 生成系数矩阵、右端项以及阶数的matlab程序

梯度法matlab程序

梯度法matlab程序

梯度法matlab程序

下面是一个使用 MATLAB 实现梯度法的简单示例程序:

```

function [x, iter] = gradientDescent(func, x0, alpha, tolerance, maxIterations) % 初始化变量

x = x0;

iter = 0;

% 迭代计算

while iter < maxIterations && norm(func(x)) > tolerance

% 计算梯度

g = gradient(func, x);

% 更新变量

x = x - alpha * g;

% 迭代计数器加 1

iter = iter + 1;

end

% 返回最终解和迭代次数

x = x;

iter = iter;

```

在上述代码中,`func` 是一个接受一个参数并返回该参数的梯度的函数。`x0` 是初始猜测值,`alpha` 是学习率,`tolerance` 是停止迭代的容差,`maxIterations` 是最大迭代次数。

在每次迭代中,我们首先计算函数在当前猜测值处的梯度 `g`,然后使用学习率`alpha` 更新猜测值 `x`。如果在迭代结束时,函数的范数仍大于容差,则继续进行下一次迭代。否则,我们停止迭代并返回最终解 `x` 和迭代次数 `iter`。

请注意,这只是一个简单的示例程序,用于说明梯度法的基本思想。在实际应用中,你可能需要根据具体问题进行更多的处理和优化。

共轭梯度法matlab最优化问题

共轭梯度法matlab最优化问题

共轭梯度法是一种在求解最优化问题时常用的算法。下面是一个

在MATLAB 中实现共轭梯度法的简单示例。请注意,这个示例是为

了教学目的而编写的,可能不适用于所有最优化问题。

首先,假设我们有一个目标函数f(x),我们需要找到使得f(x) 最小化的x。假设f(x) 是一个二次函数,形式为f(x) = x^T Ax + b^T x + c,其中A 是对称正定矩阵,b 和c 是常数向量和标量。

以下是一个使用MATLAB 实现共轭梯度法的示例代码:

```matlab

function [x, iter] = conjugate_gradient(A, b, x0, tol, max_iter)

% A -目标函数的系数矩阵

% b -目标函数的常数向量

% x0 -初始解

% tol -容忍的误差

% max_iter -最大迭代次数

x = x0;

r = b - A*x;

p = r;

iter = 0;

while (norm(r) > tol) && (iter < max_iter)

Ap = A*p;

alpha = (p'*r) / (p'*Ap);

x = x + alpha*p;

r = r - alpha*Ap;

beta = (r'*r) / (p'*r);

p = r + beta*p;

iter = iter + 1;

end

end

```

这个函数接受一个对称正定矩阵A,一个常数向量b,一个初始解x0,一个容忍的误差tol,和一个最大迭代次数max_iter 作为输入,并返回最优解x 和迭代次数iter。注意,这个函数没有包括一些可能的特殊情况处理,例如如果A 是奇异的或者接近奇异的,那么这个函数可能无法正确地收敛。在使用这个函数之前,你可能需要根据你的具体问题对其进行一些修改和增强。

MATLAB实现共轭梯度法

MATLAB实现共轭梯度法

%共轭梯度法

clear all;

close all;

clc;

tic;

format longe

disp('请输入参数');

K=input('维数K=');

tic

A=100*rand(K);% A元素是0-100

for i=1:K

A(i,i)=sum(abs(A(i,:)))+25*rand(1); %对角占优的量为0~25 end

b=zeros(K,1);

for i=1:K;

x=0;

for r=1:K;

x=x+A(i,r);

end

b(i,1)=x;

end%产生b矩阵,b中的元素为A中对应行的和,目的是使方程解全为 1 jd=input('控制精度jd=');

x0=zeros(K,1); %初始迭代矩阵

r=b-A*x0;%剩余向量

p=r;

ak=dot(r,r)/dot(p,A*p);

y=x0+ak*p; %迭代公式

r1=r-ak*A*p;

bk=dot(r1,r1)/dot(r,r);

p1=r1+bk*p;

s=1; %迭代次数

while norm(y-x0)>=jd&&s<3000; %迭代条件

x0=y;

p=p1;

r=r1;

ak=dot(r,r)/dot(p,A*p);

y=x0+ak*p; %迭代公式

r1=r-ak*A*p;

bk=dot(r1,r1)/dot(r,r);

p1=r1+bk*p;

s=s+1;

end

y

s

toc;

t=1:K;

yy=abs(y'-1)/1; plot(t,yy);

title('绝对误差图')

双共轭梯度法matlab_概述及解释说明

双共轭梯度法matlab_概述及解释说明

双共轭梯度法matlab 概述及解释说明

1. 引言

1.1 概述

引言部分将介绍“双共轭梯度法(Matlab)”,该方法是一种用于解决优化问题的迭代算法,常用于求解大规模线性方程组、最小二乘问题和非线性最优化等。本文将全面讲解双共轭梯度法的基础知识、算法流程及其在MATLAB中的应用与实现。

1.2 文章结构

本文按照以下方式组织:

- 第二节将介绍双共轭梯度法的基础知识,包括梯度下降法、共轭梯度法和双共轭梯度法的简介。

- 第三节将详细阐述双共轭梯度法的算法流程及具体步骤解释,包括初始化步骤、迭代更新步骤以及收敛准则和结束条件设定。

- 第四节将以MATLAB为工具,展示双共轭梯度法在实践中的应用与实现举例。这一部分将给出MATLAB代码编写指导原则,描述一个示例问题,并说明求解过程和结果分析。

- 最后一节是结论与展望,总结了双共轭梯度法的优点和局限性,并提供对未来可能的研究方向的展望和建议。

1.3 目的

本文旨在介绍双共轭梯度法的原理、算法流程及其在MATLAB中的实际应用。读者将通过本文了解如何使用该方法解决优化问题,并深入理解算法背后的理论基础。同时,本文还将探讨双共轭梯度法存在的局限性,并展望未来可能的研究方向,为相关领域的研究提供参考。

2. 双共轭梯度法基础知识

2.1 梯度下降法简介

梯度下降法是一种优化算法,用于求解无约束问题的最小值。其基本思想是通过沿着目标函数的负梯度方向进行迭代更新,以逐步减小目标函数值。具体而言,对于一个可微分的目标函数f(x),初始值$x_0$被选为起点,然后通过以下公式进行迭代更新:

计算方法——共轭梯度法求解线性方程组

计算方法——共轭梯度法求解线性方程组
18 9 27 9 1 18 45 0 45 2 ,b A 9 16 0 126 9 27 45 9 135 8
由于该方程组的系数矩阵以及右端项都比较简单,因此采用从 matlab 命令窗口手 动输入的方式来输入数据,取计算精度为 10-6,运行过程及结果如图 2 和图 3(由于迭 代的初始值为随机产生,因此每次得到的残量图会有所不同,但最终都趋于 0) :
图 4 命令窗口显示的运行结果
1.6 1.4 1.2 1
残量
0.8 0.6 0.4 0.2 0 0 20 40 60 80 100
迭代步数
图 5 残量随迭代步数的变化
图 6 程序运行后 D 盘根目录下生成的文件
5
k T
n-1 do
k
r r ; k T k d Ad
x
k 1
x k d ;
k k
1
1 共轭梯度法求解线性方程组

r
k 1
b Ax
k 1
k 1

④ 若 || r k 1 || 或 k 1 n ,则输出近似解 x(k+1),停止;否则,转⑤; ⑤ ⑥
计算方法上机报告
计算方法上机报告
1 共轭梯度法求解线性方程组
1.1 算法原理及程序框图 当线性方程组 Ax = b 的系数矩阵 A 是对称正定矩阵是,可以采用共轭梯度法对该 方程组进行求解,可以证明,式(1)所示的 n 元二次函数 1 f ( x ) x T Ax bT x (1) 2 取得极小值点 x*是方程 Ax = b 的解。共轭梯度法是把求解线性方程组的问题转化为求 解一个与之等价的二次函数极小化的问题。从任意给定的初始点出发,沿一组关于矩 阵 A 的共轭方向进行线性搜索,在无舍入误差的假定下,最多迭代 n 次(其中 n 为矩 阵 A 的阶数) ,就可求得二次函数的极小点,也就求得线性方程组 Ax = b 的解。其迭 代格式为公式(2)。

matlab共轭梯度法

matlab共轭梯度法

function x=CG(A,b)

% 共轭梯度法解对称正定方程组Ax=b eps=1e-6; % 迭代停机准则

n=length(b);

x0=b;

r0=b-A*x0;

k=0;

while norm(r0)>eps

k=k+1;

if 1==k

p0=r0;

else

beta=(r0'*r0)/(r'*r);

p0=r0+beta*p0;

end

alpha=(r0'*r0)/(p0'*A*p0);

x0=x0+alpha*p0;

r1=r0-alpha*A*p0;

r=r0; r0=r1;

end

x=x0;

matlab共轭梯度法求解方程组

matlab共轭梯度法求解方程组

主题:matlab共轭梯度法求解方程组

近年来,随着科学技术的不断发展,数学建模和计算机仿真成为科学

研究和工程技术领域的重要手段。在实际应用中,我们常常需要解决

线性方程组的求解问题,而共轭梯度法作为一种高效的迭代求解方法,广泛应用于信号处理、图像处理、地球物理勘探和优化问题等领域。

本文将介绍如何利用matlab中的共轭梯度法求解线性方程组的基本原理和实际操作方法。

1. 共轭梯度法的基本原理

共轭梯度法是一种迭代法,用于求解对称正定线性方程组Ax=b。该方法的核心思想是通过一系列的迭代操作,逐步逼近方程组的解,直到

满足一定的精度要求。在每一步迭代中,共轭梯度法利用残差和方向

向量的共轭性质,不断寻找最优的步长,从而实现方程组的求解。

2. matlab中共轭梯度法的基本调用方法

在matlab中,调用共轭梯度法求解线性方程组非常简单。需要将方程组的系数矩阵A和右端向量b输入到matlab中,然后利用内置函数conjugateGradient进行求解。具体的调用方法如下:

x = conjugateGradient(A, b, x0, maxIter, tol)

其中,A为系数矩阵,b为右端向量,x0为初始解向量,maxIter为最大迭代次数,tol为精度要求。调用完毕后,matlab将返回方程组的近似解x。

3. 共轭梯度法在实际工程中的应用

共轭梯度法作为一种高效的求解方法,在工程技术领域得到了广泛的应用。以图像处理为例,图像处理中经常需要解决大规模的线性方程组,而共轭梯度法能够高效地求解这类问题,提高了图像处理算法的效率和稳定性。另外,在地球物理勘探中,共轭梯度法也被广泛应用于三维数据的快速处理和解释。可以说,共轭梯度法在实际工程中发挥着重要的作用。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用MATLAB 实现共轭梯度法求解实例

康福 1

一.无约束优化方法

1.1 无约束优化方法的必要性

一般机械优化设计问题,都是在一定的限制条件下追求某一指标为最小,它

们都属于约束优化问题。但是为什么要研究无约束优化问题?

(1)有些实际问题,其数学模型本身就是一个无约束优化问题。

(2)通过熟悉它的解法可以为研究约束优化问题打下良好的基础。

(3)约束优化问题的求解可以通过一系列无约束优化方法来达到。所以无约束优

化问题的解法是优化设计方法的基本组成部分,也是优化方法的基础。

(4)对于多维无约束问题来说,古典极值理论中令一阶导数为零,但要求二阶可

微,且要判断海赛矩阵为正定才能求得极小点,这种方法有理论意义,但无

实用价值。和一维问题一样,若多元函数F(X)不可微,亦无法求解。但古典

极值理论是无约束优化方法发展的基础。

1.2共轭梯度法

目前已研究出很多种无约束优化方法,它们的主要不同点在于构造搜索方向

上的差别。

(1)间接法——要使用导数,如梯度法、(阻尼)牛顿法、变尺度法、共轭梯度

法等。

(2)直接法——不使用导数信息,如坐标轮换法、鲍威尔法单纯形法等。

用直接法寻找极小点时,不必求函数的导数,只要计算目标函数值。这类方

法较适用于解决变量个数较少的(n ≤20)问题,一般情况下比间接法效率低。间接法除要计算目标函数值外,还要计算目标函数的梯度,有的还要计算其海赛矩阵。 搜索方向的构成问题乃是无约束优化方法的关键。

共轭梯度法是沿着共轭方向进行搜索,属于共轭方向法中的一种,该方法中

每一个共轭向量都是依赖于迭代点处的负梯度而构造出来。共轭梯度法作为一种实用的迭代法,它主要有下面的优点:

(1)算法中,系数矩阵A的作用仅仅是用来由已知向量P 产生向量W=AP ,这不仅

可充分利用A的稀疏性,而且对某些提供矩阵A较为困难而由已知向量P 产

生向量W=AP 又十分方便的应用问题是很有益的。

(2)不需要预先估计任何参数就可以计算,这一点不像SOR 等;

(3)每次迭代所需的计算,主要是向量之间的运算,便于并行化。

共轭梯度法原理的知识较多,请详见《机械优化设计》第四章的第四、五节。

图1为共轭梯度法的程度框图 1(0,1,2,)

k k k k s k α+=+=x x

图1为共轭梯度法的程度框图

二.设计题目及要求

2.1设计题目

用共轭梯度法求二次函数

221212

112(,)242f x x x x x x x =+--

的极小点及极小值。 2.2设计要求

(1)使用matlab 编写程序,熟练撑握matlab 编程方法。

(2)学习并撑握共轭梯度法的原理、方法及应用,并了解不同无约束优化方法的

区别、优缺点及特殊要求。

(3)编写程序,计算出二次函数的极小点及极小值,并适当选取不同的初始点及

迭代精度精度,分析比较结果。

三.计算步骤

3.1计算求解

解:已知初始点[1,1]T 迭代精度 0.001ε=

1)第一次沿负梯度方向搜寻

计算初始点处的梯度:

为一维搜索最佳步长,应满足

得:

2)第二次迭代

代入目标函数

由 得

从而有: 因

收敛。

0120212244()422x x f x x ---⎡⎤⎡⎤∇==⎢⎥⎢⎥-⎣⎦

⎣⎦x x 010000014141212αααα+⎡⎤⎡⎤⎡⎤=+=+=⎢⎥⎢⎥⎢⎥--⎣⎦⎣⎦⎣⎦x x d 1002()min ()min(40203)f f αα

ααα=+=--x x d 00.25α=120.5⎡⎤=⎢⎥⎣⎦x 11()2f -⎡⎤∇=⎢⎥-⎣⎦x 21200()50.2520()

f f β∇===∇x x 11002() 1.5f β⎡⎤=-∇+=⎢⎥⎣⎦d x d 21122220.5 1.50.5 1.5αααα+⎡⎤⎡⎤⎡⎤=+=+=⎢⎥⎢⎥⎢⎥+⎣⎦⎣⎦⎣⎦x x d 22()(22)2(0.5 1.5)2(22)(0.5 1.5)4(22)()f x αααααφα=+++-++-+=()0φα'=1α=22240,()8,()20f f ⎡⎤⎡⎤==-∇=⎢⎥⎢⎥⎣⎦⎣⎦

x x x 2()0f ε∇=

3.2运行与程序

运行:打开matlab,确定conjugate_grad_2d.m文件夹为当前目录。

在命令窗中输入:f=conjugate_grad_2d([1,1],0.001)

选择不同的初始点坐标[0,0],[0,1],[1,0],和迭代精度0.01,0.0001,

进行运行时,需要多次调用conjugate_grad_2d函数。

程序及说明:

function f=conjugate_grad_2d(x0,t)

%用共轭梯度法求已知函数f(x1,x2)=x1^2+2*x2^2-4*x1-2*x1*x2的极值点

%已知初始点坐标:x0

%已知收敛精度:t

%求得已知函数的极值:f

x=x0;

syms xi yi a; %定义自变量,步长为符号变量

f=xi^2+2*yi^2-4*xi-2*xi*yi; %创建符号表达式f

fx=diff(f,xi); %求表达式f对xi的一阶求导

fy=diff(f,yi); %求表达式f对yi的一阶求导

fx=subs(fx,{xi,yi},x0); %代入初始点坐标计算对xi的一阶求导实值

fy=subs(fy,{xi,yi},x0); %代入初始点坐标计算对yi的一阶求导实值

fi=[fx,fy]; %初始点梯度向量

count=0; %搜索次数初始为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); %构造一元搜索的一元函数φ(a)

f1=diff(f); %对函数φ(a)进行求导

f1=solve(f1); %得到最佳步长a

if f1~=0

ai=double(f1); %强制转换数据类型为双精度数值

else

break %若a=0,则直接跳出循环,此点即为极值点

end

x=subs(x,a,ai); %得到一次搜索后的点坐标值

f=xi^2+2*yi^2-4*xi-2*xi*yi;

fxi=diff(f,xi);

fyi=diff(f,yi);

fxi=subs(fxi,{xi,yi},x);

fyi=subs(fyi,{xi,yi},x);

fii=[fxi,fyi]; %下一点梯度向量

相关文档
最新文档