基于MATLAB的可行方向法求极值问题讲解

基于MATLAB的可行方向法求极值问题讲解
基于MATLAB的可行方向法求极值问题讲解

基于MATLAB 可行方向法求极值的实现

姓名:xxx

学号:xxx

(北京理工大学机械与车辆学院车辆工程,北京 100081)

摘要:在工程实际的优化设计中,随着设计变量数和约束条件数的增加,随机方向搜索法和复合形法等直接优化解法的求解效率会偏低。可行方向法,顾名思义,一种始终在可行域内寻找下降方向的搜索法,以其收敛速度快、效果好的优点已成为求解约束非线性问题的一种有代表性的直接解法,同时也是求解大型约束优化问题的主要方法之一。本文将简单介绍可行方向法的数学思想,采用线性规划法和约束最优步长法编写MATLAB 程序,最后通过算例完成对优化问题的求解。 关键字:可行方向法;MATLAB ;优化方法。

1. 可行方向法的基本数学思想

1.1可行方向法的搜索策略

可行方向法迭代的第一步都是从可行域的某一初始点(0)X 出发,沿负梯度

(0)()f X -?方向移至某一个或J 个起作用约束面的交集()k X 上。以后的搜索路线和迭代计算可根据约束函数和目标函数的不同性状,分别采用以下三种不同策略继续搜索。

1)

由点()k X 出发,沿可行方向作一维最优化搜索,若所得新点(1)k X +在可行域内,则再沿(1)()k f X +-?方向作一维最优化搜索;若所得的新点不在可行域内,则将它移至约束面上再反复重复上述步骤,若

(1)()k f X ε+?≤,则停止迭代,如图1.1所示。

2)

由点()k X 出发,沿可行方向作一维最优化搜索,若所得新点(1)k X +在可行域外,则沿可行方向以最大步长到达另一个约束面上一点,将该点作为迭代点(1)k X +进行反复搜索,直至满足给出的K-T 条件,如图1.2所示。

3) 沿着约束面进行搜索。对于只具有线性约束的非线性规划问题,如图1.3所示,从点()k X 出发,沿约束面移动,在有限的几步内即可搜索到约束最优点;对于非线性约束函数,如图1.4所示情况,就是沿着约束面的切线移动,但这样将会进入非可行域,使问题变得复杂。此时,应将进入非可行域的新点X 设法调整回约束边界。调整方法为:先规定约束面容差0δ>,建立新的约束边界,然后将已经离开约束面的X 点沿起作用约束的负梯度方向()g X -?返回约束面上,计算公式为

(1)()k t X X g X α+=-?

式中,t α为调整步长,可以用试探法确定,也可以用下式估计,使其回到约束边界上。

[]

()

()()

t T

g X g X g X α=

?? (1-1)

图1.1

图1.2

图1.3

图1.4

不管采用哪种搜索方法都要进行两条决策:一是产生一个适用的可行方向()k d ;二是沿()

k d 方向确定一个不会越出可行域的适当的步长因子。

1.2产生可行方向和步长的数学原理

可行方向要保证沿该方向作微小移动后所得的新点是可行点,且目标函数值有所下降。显然可行方向应满足可行和下降两个条件。这里从数学原理的角度分析可行性和下降性。

1.2.1可行性

设()

k X 为可行域D 中的一个点,即()

k X D ∈。对于某一方向()

k d 来说,若存

在数00A >,使其对于任意的A 0(0)A A ≤≤,式1-2均成立,则称方向()

k d 对()

k X 点满足可行性条件。

()

()

k k X

Ad D +∈ (1-2)

若点()k X 在可行域内,即()k X 为内点,则任何方向都满足可行性条件。 当点()k X 在某一约束边界上时,如图1.5所示,该约束面就是起作用约束。当点()k X 位于一个约束面上时,如图1.6所示,作出()k X 初起作用约束的梯度

()g X ?和切线,可见只要()

k d 与起作用约束的梯度成直角或钝角,则可指向可行

域内,满足可行性条件。当()k X 同时处于J 个约束面时,就要求()

k d 与这J 个约束面的梯度均垂直或交成钝角,如图1.6所示,写成数学表达式如下:

()()

()0(1,2,,)T k k j g X d j J ???≤=?? 式中,J 为起作用约束的个数。上式称为可行性条件。

图1.5

图1.6

1.2.2下降性

沿一方向搜索时,要求下降愈快愈好。对某一点来说,负梯度方向为最速下降方向。如果负梯度方向是可行方向,那么负梯度方向是最有利的方向;否则为

了保证目标函数值有所下降,至少要使搜索方向()

k d 与目标函数的负梯度方向成锐角或与梯度方向成钝角,写成数学表达式为

()()

()0T k k f X d ???

该式称为下降性条件。

如图1.7所示,可行下降方向显然位于点()k X 约束面的切线与目标函数等值线的切线所围成的扇形区域内,推广到一般的情况就是可行方向在目标函数超等值面的超切面和J 个起作用约束的超切面所围成的超锥体内。该区域称为可行下降方向区。

图1.7

综上所述,当点()k X 位于J 个起作用的约束面上时,满足

()()()()

()0(1,2,,)()0

T k k j T k k g X d j J f X d ????≤=???

??

???

(1-3) 式中,()

k d 即为可行方向。

1.3可行方向的产生

本文采用线性规划法来产生可行方向,用约束最优步长确定最优步长,为后面编制MATLAB 程序做理论基础。本节先阐述线性规划法,下节再对约束最优步长法进行描述。

线性规划法对包含线性和非线性的不等式约束的最优化问题都适用,但不允许有等式约束。其基本原理是将具有一阶连续偏导数的目标函数和约束条件在

()k X 点用Taylor 展开式展成线性近似函数(一次项),并用这些线性近似函数代

替目标函数和它的约束条件,使得问题线性化。这样min ()f X 成为

()()()min{()[()]()}()k k T k n f X f X X X X R +?-∈

约束条件()0u g X ≤变为

()()()()[()]()0(1,2,,)k k T k u u g X g X X X u m +?-≤=

用(1)k X +代替上式中的X ,得到

()()

()

min{()[()]}k k k T

k f X

f X

d α+?

s.t. ()

()()()[()]0(1,2,,)k k k T u k u g X g X d u m α+?≤=

式中,()

()k f X

、()

()k u g X

为常数,只有搜索方向()

k d 和k α是未知量。当迭

代点()k X 位于J 个起作用约束边界的交点上时,问题就变成求解线性规划问题:

()

()min[()]n

k k T X R

f X d ∈? s.t. ()

()

[()]0(1,2,,J)k k T

u g X

d u ?≤=

式中,()k d 只起到方向作用,故规定其向量的模是有界的,也就是规定()

k d 每个分量的绝对值不大于1,即

()

j ||1(1,2,,)k d j n ≤=

由于可行方向还得满足式1-3的可行性和下降性条件,故确定可行方向的线性规划数学模型如下:

()()

()min ()[()]n

k k k T X R

Z d f X d ∈=? s.t. ()

()

[()]0k k T

f X

d ?<

()

()

[()]0(1,2,,J)k k T

u g X

d u ?≤=

()

j 11(1,2,,)k d j n -≤≤= (1-4)

求解后,可得到迭代方向()

k d ,作为下一步的搜索方向。

1.4最优步长的确定

由线性规划法求的可行方向()

k d 后,由()k X 出发,找到该方向上的可行新点

(1)k X +。新点必须满足两个条件,一是新点(1)k X +必须还是可行点,二是目标函

数值具有最大的下降量。约束最优步长即可满足这两点,可用以下一维搜索法求

解:

()()

min ()k k f X

d α

α+

s.t. max 0αα≤≤

式中,()

()

max sup{|()0(1,2,,)}k k u g X

d u m αλα=+≤= 。

2. 可行方向法的迭代过程和算法流程图

2.1迭代过程

1)输入收敛精度ε;

2)形成可行初始点(0)X ,令k=1;

3)确定起作用约束下标集合,()()(){|()0(1)}k k i E X i g X i m ==≤≤; 4)判断E 是否为空集,若是空集则说明()k X 在可行域内,转步骤5);否则说明()k X 在约束边界上,转步骤6);

5)判断是否满足终止条件()()k f X ε?≤,若满足,转步骤10);若不满足,

则取搜索方向为()

()()k k d f X =-? ,转步骤8);

6)采用线性规划法,用式1-4求解后,得到可行方向()

k d ;

7)判断0k Z =是否成立,若成立,则转步骤10)输出,停机结束;若不成立,则继续下一步;

8)采用约束最优步长法进行一维搜索,得到新点(1)k X +; 9)令k=k+1,转步骤3);

10)输出*()k X X =,**()f f X =,停机结束。

2.2算法流程图

算法流程图如图2-1。

图2-1 可行方向法的算法流程图3.可行方向法的MATLAB程序

function kxfxf(x0)

eps=1.0e-6;

%刚开始给的x0为行向量

x0=transpose(x0);

func

sz=length(x0);

G1 = G;

for k=1:1:50

%'f(x)梯度:'

sf=diff_val(x0);

sf=eval('sf');

%'f(x)梯度范数:'

norm_s=norm(diff_val(x0));

GL=length(G);

G1 = G;

G_copy=G;

for i=1:1:GL

g=subs(G1(i,:),x,x0);

G1(i,:)=g;

end

G_zero=eval('G1');

for i=GL:-1:1

if abs(G_zero(i,:))>0.1

G_zero(i,:)=[];

G_copy(i,:)=[];

end

end

I=size(G_zero,1);

add=-ones(I,1);

%根据E是否为空集(I==0)确定不同情况下的搜索方向

if I==0

if norm_s<=3

'最优解:'

'自变量值:'

x0

'目标函数值:'

f=fval(x0)

'迭代次数:'

k

'======================================================' return

else

d0=-diff_val(x0);

%线性搜索

d0=transpose(d0);

vmax = gmin(x0,d0);

h=fmin(x0,d0,vmax);

x0=x0+h*d0;

end

else

%线性规划

grad=jacobian(G_copy,x);

G_zero=subs(grad,x,x0);

Ac=[sf;G_zero];

lb=-1*ones(sz,1);

ub=ones(sz,1);

p=zeros(I+1,1);

dz = size(1,sz);

c=sf*dz';

[dz,mn,m1,m2,m3]=linprog(c,Ac,p,[],[],lb,ub);

z0 = sf*dz;

z0=abs(z0);

if z0<0.01

'最优解:'

'自变量值:'

x0

'目标函数值:'

f=fval(x0)

'迭代次数:'

k

'======================================================'

return

else

d0=dz;

%线性搜索

vmax = gmin(x0,d0);

h=fmin(x0,d0,vmax);

x0=x0+h*d0;

end

end

end

程序中用到一些回调函数,简单列举如下,.m文件详细内容见附录一。func记录函数及其自变量信息

fval(x0)计算函数在x0处得函数值

最小值

gmin(x0,d0) 求函数在满足约束条件下的

k

fmin(x0,d0,vmax)求函数在[0,vmax]上的最小值

diff_val(x0)计算函数在x0处得导数值。

4.利用MATLAB 求解实例

4.1实例

本文以课本例题5.3为例来验证可行方向法在MATLAB 里的实现。

已知目标函数2

12()412f X x x =+-,约束条件为 s.t. 22112()250g X x x =+-≤

22()0g X x =-≤ 31()0g X x =-≤

初始点为(0)32X ??

=????,求()f X 的极小值,计算精度210ε-=。

首先在func.m 文件中输入目标函数和约束条件,如下: f=4*x1+x2^2-12; g1=x1^2+x2^2-25; g2=-x2; g3=-x1; G = [g1;g2;g3];

在MATLAB 命令窗口里输入如下命令: >> x0=[3 2] >> kxfxf(x0) 计算结果为:

最优解: 自变量值: x0 =

1.0e-03 *

0.066121027424648 0.212777459551459 ans = 目标函数值: f =

-11.999735470616054 ans = 迭代次数: k = 3

与书中提供的精确解基本一致,最优解的相对误差为

11.9997(12)

100%

0.0025%

11.9997

---?=-, 说明此方法有效可行。 4.2实例结果分析

此处主要从以下三个方面来分析此算法及计算结果。 1) 可靠性。

通过对其他多元多次函数(教科书例5.1)进行求极值计算,结果都比较精确,说明此算法可靠性、通用性好。通过对教课书例5.1进行求解,可得以下结果:

x0 =

6.000146685451760 6.999853314348210 目标函数值: f =

2.000586785240415 迭代次数: k =

3

与课本上精确解相比,几乎完全吻合。

2)有效性。

对于本例,目标函数不是很复杂,其求解速率在1s内可完成,迭代次数为k=3次。

3)简便性。

此程序逻辑清晰,简明易懂,对计算机的要求也不是很高,其简便性不言而明。

参考文献

[1]李志锋。机械优化设计。高等教育出版社。

[2]孙靖民。机械优化设计。机械工业出版社。1999.5。

[3]蒲俊,吉家锋,伊良忠。MATLAB 6.0数学手册。浦东电子出版社。2002.1。

附录一回调函数内容

1.func 记录函数及其自变量信息

根据所求解的目标函数和相应的约束条件不同而不同,由用户进行手动

输入。示例见4.1。

2.fval(x0) 计算函数在x0处得函数值

function f_val=fval(x0)

x0=transpose(x0);

func;

f_val=subs(f,x,x0);

最小值

3.gmin(x0,d0) 求函数在满足约束条件下的

k

function h=gmin(x0,d0)

syms h;

func

n = length(G);

alpha = zeros(1,n);

a=x0+h*d0;

g_val=subs(G,x,a);

k = 1;

for i=1:1:n

alpha_temp = solve(g_val(i));

if length(alpha_temp)>1

if imag(alpha_temp) == 0

for j=1:1:length(alpha_temp)

if alpha_temp(j,1)>0 || alpha_temp(j,1) == 0

alpha(1,k) = alpha_temp(j,1);

k = k+1;

end

end

else

end

else

if alpha_temp > 0 || alpha_temp == 0

alpha(1,k) = alpha_temp;

k = k+1;

else

alpha(:,k) = [];

end

end

end

h_temp = alpha(1,1);

len = length(alpha);

for i=1:1:len

if h_temp > alpha(1,i)

h_temp = alpha(1,i);

end

end

h=h_temp;

4.fmin(x0,d0,vmax)求函数在[0,vmax]上的最小值

function h=fmin(x0,d0,vmax)

func

syms h;

a=x0+h*d0;

f_val=inline(subs(f,x,a));

if vmax==inf

min_h=fminbnd(f_val,0,10000);

else

min_h=fminbnd(f_val,0,vmax);

end

h=min_h;

5.diff_val(x0)计算函数在x0处得导数值

function s=diff_val(x0)

func

grad=jacobian(f,x);

s=subs(grad,x,x0);

三次样条插值---matlab实现

计算方法实验—三次样条插值 机电学院075094-19 苏建加 20091002764 题目:求压紧三次样条曲线,经过点(-3,2),(-2,0),(1,3),(4,1),而且一阶导 数边界条件S'(-3)=-1;S'(4)=1。 解:首先计算下面的值: 记 1--=j j j x x h ; 1++=j j j j h h h u ;1=+j j u λ ; ?? ????????---+=-++++-j j j j j j j j j j j h y y h y y h h x x x f 1111 111],,[ ;M j =)(''j x s ;],,[611+-=j j j j x x x f d ; h1=-2-(-3)=1;h2=1-(-2)=3;h3=4-1=3; u1=1/4;u2=3/6; d1=6/4*(3/3-(-2)/1)=4.5;d2=6/6*(-2/3-3/3)=-5/3; 由于边界条件S'(-3)=-1;S'(4)=1,得到如下 式子: d0=6/1*(-2/1-(-1))=-6; d3=6/3*(1-(-2)/3)=10/3; 所以得到4个含参数m0~m3 的线性代数方程组为: 2.0000 1.0000 0 0 m0 0.2500 2.0000 0.7500 0 m1 0 0.5000 2.0000 0.5000 m2 0 0 1.0000 2.0000 m3 利用matlab 求解方程得: m = -4.9032 3.8065 -2.5161 2.9247 所以 S1(x)=-0.8172*(-2-x)^3+ 0.6344*(x+3)^3+2.8172*(-2-x)-0.6344*(x+3) x ∈[-3,-2] S2(x)=0.2115*(1-x)^3 -0.1398*(x+2)^3- 1.9032*(1-x)+ 2.2581*(x+2) x ∈[-2,1] S3(x)=-0.1398*(4-x)^3+0.1625(x-1)^3+ 2.2581*(4-x)-1.1290*(x-1) x ∈[1,4] 化简后得:S1(x)=1.4516*x^3 + 10.6128*x^2 + 23.4836*x + 16.1288 x ∈[-3,-2] S2(x)=-0.3513x^3-0.2043x^2+1.8492x+1.7061 x ∈[-2,1] S3(x)=0.3023x^3-2.1651x^2+3.8108x+1.0517 x ∈[1,4] 画图验证:

运用matlab建立三次样条插值函数

(1)编写三条样条插值函数程序如下: x=[1 4 9 16 25 36 49 64 81]; y=[1 2 3 4 5 6 7 8 9]; n=length(x); lamda(1)=1; miu(n)=1; h=diff(x); df=diff(y)./diff(x); d(1)=6*(df(1)-1/2)/h(1); d(n)=6*(0.5*81^-0.5-df(n-1))/h(n-1); for j=2:n-1 lamda(j)=h(j)/(h(j-1)+h(j)); miu(j)=h(j-1)/(h(j-1)+h(j)); d(j)=6*(df(j)-df(j-1))/(h(j-1)+h(j)); end miu=miu(2:end); u=diag(miu,-1);r=diag(lamda,1);a=diag(2*ones(1,n)); A=u+r+a; %求出矩阵形式的线性方程组 M=inv(A)*d'; %求出M值 syms g for j=1:n-1 s(j)=M(j)*(x(j+1)-g)^3/(6*h(j))+M(j+1)*((g-x(j))^3/(6*h(j)))+(y(j)-M( j)*h(j)^2/6)*(x(j+1)-g)/h(j)+(y(j+1)-M(j+1)*h(j)^2/6)*(g-x(j))/h(j); end format rat for j=1:n-1 S(j,:)=sym2poly(s(j)); %三条样条插值函数 end %生成三次样条插值函数图象 for j=1:n-1 x1=x(j):0.01:x(j+1); y1=polyval(S(j,:),x1); plot(x1,y1,x,y,'o'); title('spline 三次样条插值函数图象'); xlabel('x'); ylabel('y'); grid on; hold on; end

MATLAB三次样条插值之三弯矩法

MATLAB三次样条插值之三弯矩法 首先说这个程序并不完善,为了实现通用(1,2,…,n)格式解题,以及为调用追赶法程序,没有针对节点数在三个以下的情况进行分类讨论。希望能有朋友给出更好的方法。 首先,通过函数 sanwanj得到方程的系数矩阵,即追赶法方程的四个向量参数,接下来调用 追赶法(在intersanwj函数中),得到三次样条分段函数系数因子,然后进行多项式合并得 到分段函数的解析式,程序最后部分通过判断输入值的区间自动选择对应的分段函数并计算改 点的值。附:追赶法程序 chase %%%%%%%%%%%%%% function [newv,w,newu,newd]=sanwj(x,y,x0,y0,y1a,y1b) % 三弯矩样条插值 % 将插值点分两次输入,x0 y0 单独输入 % 边值条件a的二阶导数 y1a 和b的二阶导数 y1b,这里建议将y1a和y1b换成y2a和 y2b,以便于和三转角代码相区别 n=length(x);m=length(y); if m~=n error('x or y 输入有误,再来'); end v=ones(n-1,1);u=ones(n-1,1);d=zeros(n-1,1); w=2*ones(n+1); h0=x(1)-x0; h=zeros(n-1,1); for k=1:n-1 h(k)=x(k+1)-x(k); end v(1)=h0/(h0+h(1)); u(1)=1-v(1); d(1)=6*((y(2)-y(1))/h(1)-(y(1)-y0)/h0)/(h0+h(1)); % for k=2:n-1 v(k)=h(k-1)/(h(k-1)+h(k)); u(k)=1-v(k); d(k)=6*((y(k+1)-y(k))/h(k)-(y(k)-y(k-1))/h(k-1))/(h(k-1)+h(k)); end newv=[v;1]; newu=[1;u]; d0=6*((y(1)-y0)/h0-y1a)/h0;

实验五 用matlab求二元函数的极值

实验五 用matlab 求二元函数的极值 1.计算二元函数的极值 对于二元函数的极值问题,根据二元函数极值的必要和充分条件,可分为以下几个步骤: 步骤1.定义二元函数),(y x f z =. 步骤2.求解方程组0),(,0),(==y x f y x f y x ,得到驻点. 步骤3.对于每一个驻点),(00y x ,求出二阶偏导数 22222,,.z z z A B C x x y y ???===???? 步骤4. 对于每一个驻点),(00y x ,计算判别式2B AC -,如果02>-B AC ,则该驻点是 极值点,当0>A 为极小值, 0>clear; syms x y; >>z=x^4-8*x*y+2*y^2-3; >>diff(z,x) >>diff(z,y) 结果为 ans =4*x^3-8*y ans =-8*x+4*y

三次样条插值的MATLAB实现

MATLAB 程序设计期中考查 在许多问题中,通常根据实验、观测或经验得到的函数表或离散点上的信息,去研究分析函数的有关特性。其中插值法是一种最基本的方法,以下给出最基本的插值问题——三次样条插值的基本提法: 对插值区间[]b a ,进行划分:b x x x a n ≤

三次样条插值的Matlab实现(自然边界和第一边界条件)

(第一边界条件)源代码:function y=yt1(x0,y0,f_0,f_n,x)_____________(1) %第一类边界条件下三次样条插值; %xi所求点; %yi所求点函数值; %x已知插值点; %y已知插值点函数值; %f_0左端点一次导数值; %f_n右端点一次导数值; n = length(x0); z = length(y0); h = zeros(n-1,1); k=zeros(n-2,1); l=zeros(n-2,1); S=2*eye(n); fori=1:n-1 h(i)= x0(i+1)-x0(i); end fori=1:n-2 k(i)= h(i+1)/(h(i+1)+h(i)); l(i)= 1-k(i);

end %对于第一种边界条件: k = [1;k];_______________________(2) l = [l;1];_______________________(3) %构建系数矩阵S: fori = 1:n-1 S(i,i+1) = k(i); S(i+1,i) = l(i); end %建立均差表: F=zeros(n-1,2); fori = 1:n-1 F(i,1) = (y0(i+1)-y0(i))/(x0(i+1)-x0(i)); end D = zeros(n-2,1); fori = 1:n-2 F(i,2) = (F(i+1,1)-F(i,1))/(x0(i+2)-x0(i)); D(i,1) = 6 * F(i,2); end %构建函数D: d0 = 6*(F(1,2)-f_0)/h(1);___________(4)

用MATLAB求极值

用MATLAB求极值 灵活的运用MATLAB的计算功能,可以很容易地求得函数的极值。 例3.6.1 求 2 2 344 1 x x y x x ++ = ++ 的极值 解首先建立函数关系: s yms s y=(3*x^2+4*x+4)/( x^2+x+1); ↙然后求函数的驻点: dy=diff(y); ↙ xz=solve(dy) ↙ xz= [0] [-2] 知道函数有两个驻点x 1=0和x 2 =-2,考察函数在驻点处二阶导数的正负情况: d2y=diff(y,2); ↙ z1=limit(d2y,x,0) ↙z1= -2 z2=limit(d2y,x,-2) ↙z2= 2/9 于是知在x 1=0处二阶导数的值为z 1 =-2,小于0,函数有极大值;在x 2 =-2处二阶导数的值 为z 2 =2/9,大于0,函数有极小值。如果需要,可顺便求出极值点处的函数值: y 1 =limit(y,x,0) ↙ y 1 = 4 y 2 =limit(y,x,-2) ↙ y 2 = 8/3 事实上,如果知道了一个函数的图形,则它的极值情况和许多其它特性是一目了然的。而借助MA TLAB的作图功能,我们很容易做到这一点。 例3.6.2画出上例中函数的图形 解syms x ↙ y=(3*x^2+4*x+4)/( x^2+x+1); ↙得到如下图形 ezplot(y) ↙

如何用MATLAB求函数的极值点和最大值 比如说y=x^3+x^2+1,怎样用matlab来算它的极值和最大值? 求极值: syms x y >> y=x^3+x^2+1 >> diff(y) %求导 ans = 3*x^2 + 2*x >> solve(ans)%求导函数为零的点 ans = -2/3 极值有两点。 求最大值,既求-y的最小值: >> f=@(x)(-x^3-x^2-1)

实验3 Matlab 符号运算及求函数极值

实验3 Matlab 符号运算及求函数极值一、实验目的和要求 掌握用Matlab软件进行符号运算以及求函数的极值。 二、实验环境 Windows系列操作系统,Matlab软件。 三、实验内容 1.用MATLAB进行符号运算; 2.编程求函数的极值。 四、实验步骤 3.开启软件平台——Matlab,开启Matlab编辑窗口; 4.根据求解步骤编写M文件; 5.保存文件并运行; 6.观察运行结果(数值或图形); 7.根据观察到的结果和体会写出实验报告。 五、示例 1.计算一元函数的极值 例1求 2 2 344 1 x x y x x ++ = ++ 的极值 解首先建立函数关系: s yms x y=(3*x^2+4*x+4)/( x^2+x+1); 然后求函数的驻点: dy=diff(y); xz=solve(dy) xz= [0] [-2] 知道函数有两个驻点x 1=0和x 2 =-2, 接下来我们通过考察函数的图形,则它的极值情况和许多其它特性是一目了然的。而借助MATLAB的作图功能,我们很容易做到这一点。 例2 画出上例中函数的图形

解 syms x y=(3*x^2+4*x+4)/( x^2+x+1); 得到如下图形 ezplot(y) 2.计算二元函数的极值 MATLAB 中主要用diff 求函数的偏导数,用jacobian 求Jacobian 矩阵。 例1 求函数42823z x xy y =-+-的极值点和极值. 首先用diff 命令求z 关于x,y 的偏导数 >>clear; syms x y; >>z=x^4-8*x*y+2*y^2-3; >>diff(z,x) >>diff(z,y) 结果为 ans =4*x^3-8*y ans =-8*x+4*y 即348,84z z x y x y x y ??=-=-+??再求解方程,求得各驻点的坐标。一般方程组的符号解用solve 命令,当方程组不存在符号解时,solve 将给出数值解。求解方程的MA TLAB 代码为:

MATLAB三次样条插值之三转角法

非常类似前面的三弯矩法,这里的sanzhj函数和intersanzhj作用相当于前面的sanwanj和intersanwj,追赶法程序通用,代码如下。 %%%%%%%%%%%%%%%%%%% function [newu,w,newv,d]=sanzhj(x,y,x0,y0,y1a,y1b) % 三转角样条插值 % 将插值点分两次输入,x0 y0 单独输入 % 边值条件a的一阶导数 y1a 和b的一阶导数 y1b n=length(x);m=length(y); if m~=n error('x or y 输入有误,再来'); end v=ones(n-1,1); u=ones(n-1,1); d=zeros(n-1,1); w=2*ones(n-1,1); h0=x(1)-x0; h=zeros(n-1,1); for k=1:n-1 h(k)=x(k+1)-x(k); end v(1)=h0/(h0+h(1)); u(1)=1-v(1); d(1)=3*(v(1)*(y(2)-y(1))/h(1)+u(1)*((y(1)-y0))/h0); % for k=2:n-1 v(k)=h(k-1)/(h(k-1)+h(k)); u(k)=1-v(k); d(k)=3*(v(k)*(y(k+1)-y(k))/h(k)+u(k)*(y(k)-y(k-1))/h(k-1)); end d(1)=d(1)-u(1)*y1a; d(n-1)=d(n-1)-v(n-1)*y1b; newv=v(1:n-2,:); newu=u(2:n-1,:); %%%%%%%%%%%% function intersanzhj(x,y,x0,y0,y1a,y1b) % 三转角样条插值

matlab自定义函数与极值求法

实验5 matlab 自定义函数与导数应用 实验目的 1.学习matlab 自定义函数. 2.加深理解罗必塔法则、极值、最值、单调性. 实验内容 1.学习matlab 自定义函数及求函数最小值命令. 函数关系是指变量之间的对应法则,这种对应法则需要我们告诉计算机,这样,当我们输入自变量时,计算机才会给出函数值,matlab 软件包含了大量的函数,比如常用的正弦、余弦函数等.matlab 允许用户自定义函数,即允许用户将自己的新函数加到已存在的matlab 函数库中,显然这为matlab 提供了扩展的功能,无庸置疑,这也正是matlab 的精髓所在.因为matlab 的强大功能就源于这种为解决用户特殊问题的需要而创建新函数的能力.matlab 自定义函数是一个指令集合,第一行必须以单词function 作为引导词,存为具有扩展名“.m ”的文件,故称之为函数M -文件. 函数M -文件的定义格式为: function 输出参数=函数名(输入参数) 函数体 …… 函数体 一旦函数被定义,就必须将其存为M -文件,以便今后可随时调用.比如我们希望建立函数12)(2++=x x x f ,在matlab 工作区中输入命令: syms x ;y=x^2+2*x+1; 不能建立函数关系,只建立了一个变量名为y 的符号表达式,当我们调用y 时,将返回这一表达式. y ? y=x^2+2*x+1 当给出x 的值时,matlab 不能给出相应的函数值来. x=3;y ? y=x^2+2*x+1 如果我们先给x 赋值. x=3;y=x^2+2*x+1 得结果:y=16 若希望得出2|=x y 的值,输入: x=2;y ? 得结果:y=16,不是2=x 时的值.读者从这里已经领悟到在matlab 工作区中输入命令:y=x^2+2*x+1不能建立函数关系,如何建立函数关系呢?我们可以点选菜单Fill\New\M-fill 打开matlab 文本编辑器,输入: function y=f1(x) y=x^2+2*x+1; 存为f1.m .调用该函数时,输入: syms x ;y=f1(x)?

三次样条插值的Matlab实现(自然边界和第一边界条件)(精)

(第一边界条件源代码: function y=yt1(x0,y0,f_0,f_n,x _____________(1 %第一类边界条件下三次样条插值; %xi 所求点; %yi所求点函数值; %x 已知插值点; %y 已知插值点函数值; %f_0左端点一次导数值; %f_n右端点一次导数值; n = length(x0; z = length(y0; h = zeros(n-1,1; k=zeros(n-2,1; l=zeros(n-2,1; S=2*eye(n; fori=1:n-1 h(i= x0(i+1-x0(i; end fori=1:n-2

k(i= h(i+1/(h(i+1+h(i; l(i= 1-k(i; end %对于第一种边界条件: k = [1;k]; _______________________(2 l = [l;1]; _______________________(3 %构建系数矩阵 S : fori = 1:n-1 S(i,i+1 = k(i; S(i+1,i = l(i; end %建立均差表: F=zeros(n-1,2; fori = 1:n-1 F(i,1 = (y0(i+1-y0(i/(x0(i+1-x0(i; end D = zeros(n-2,1; fori = 1:n-2 F(i,2 = (F(i+1,1-F(i,1/(x0(i+2-x0(i; D(i,1 = 6 * F(i,2;

end %构建函数 D : d0 = 6*(F(1,2-f_0/h(1; ___________(4 dn = 6*(f_n-F(n-1,2/h(n-1; ___________(5 D = [d0;D;dn]; ______________(6 m= S\D; %寻找 x 所在位置,并求出对应插值: fori = 1:length(x for j = 1:n-1 if (x(i<=x0(j+1&(x(i>=x0(j y(i =( m(j*(x0(j+1-x(i^3/(6*h(j+... (m(j+1*(x(i-x0(j^3/(6*h(j+... (y0(j-(m(j*h(j^2/6*(x0(j+1-x(i/h(j+... (y0(j+1-(m(j+1*h(j^2/6*(x(i-x0(j/h(j ; break; else continue; end end end (2 (自然边界条件源代码: 仅仅需要对上面部分标注的位置做如下修改 :

matlab_牛顿插值法_三次样条插值法

(){} 2 1 ()(11),5,10,20: 1252 1()1,(0,1,2,,)()2,(0,1,2,,)() ()2 35,20:1100 (i i i i n n k k k Newton f x x n x f x x i i n f x n x y i n Newton N x S x n x k y f x = -≤≤=+=-+====-+ = 题目:插值多项式和三次样条插值多项式。已知对作、计算函数在点处的值;、求插值数据点 的插值多项式和三次样条插值多项式;、对计算和相应的函数值),()() (1,2,,99)4:()max ()()max ()n k n k n k n k n k n k k k N x S x k E N y N x E S y S x ==-=- 和; 、计算,; 解释你所得到的结果。 算法组织: 本题在算法上需要解决的问题主要是:求出第二问中的Newton 插值多项式 )(x N n 和三次样条插值多项式()n S x 。如此,则第三、四问则迎刃而解。计算两 种插值多项式的算法如下: 一、求Newton 插值多项式)(x N n ,算法组织如下: Newton 插值多项式的表达式如下: )())(()()(110010--???--+???+-+=n n n x x x x x x c x x c c x N 其中每一项的系数c i 的表达式如下: 1102110) ,,,(),,,(),,,(x x x x x f x x x f x x x f c i i i i i -???-???= ???=- 根据i c 以上公式,计算的步骤如下: ?? ??? ?? ?????+??????? ???????????----) ,,,,(1) ,,,(),,,,(),(,),,(2)(,),(),(11101111011010n n n n n n n n x x x x f n x x x f x x x f n x x f x x f x f x f x f 、计算、计算、计算、计算 二、求三次样条插值多项式)(x S n ,算法组织如下:

matlab实验六 多元函数的极值

实验六多元函数的极值 【实验目的】 1.了解多元函数偏导数的求法。 2.了解多元函数极值的求法。 3.了解多元函数条件极值的求法。 4.学习、掌握MATLAB软件有关的命令。 【实验内容】 求函数42 =-+-的极值点和极值。 823 z x xy y 【实验准备】 1.计算多元函数的极值 2.计算二元函数在区域D内的最大值和最小值 3.求函数偏导数的MATLAB命令 MATLAB中主要用diff求函数的偏导数,用jacobian求Jacobian 矩阵。 diff(f,x,n)求函数f关于自变量x的n阶导数。 jacobian(f,x)求向量函数f关于自变量x(x也为向量)的jacobian 矩阵。 【实验重点】 1、多元函数的偏导数计算 2、多元函数极值的计算 【实验难点】 1、多元函数极值的计算

【实验方法与步骤】 练习1 求函数42823z x xy y =-+-的极值点和极值。首先用diff 命令求z 关于x,y 的偏导数 >>clear;syms x y; >>z=x^4-8*x*y+2*y^2-3; >>diff(z,x) >>diff(z,y) 结果为 ans=4*x^3-8*y ans=-8*x+4*y 即348,84z z x y x y x y ??=-=-+??再求解正规方程,得各驻点的坐标。一般方程组的符号解用solve 命令,当方程组不存在符号解时,solve 将给出数值解。求解正规方程的MATLAB 代码为 >>clear; >>[x,y]=solve('4*x^3-8*y=0','-8*x+4*y=0','x','y') 结果有三个驻点,分别是P(-2,-4),Q(0,0),R(2,4)。下面再求判别式中的二阶偏导数: >>clear;syms x y; >>z=x^4-8*x*y+2*y^2-3; >>A=diff(z,x,2) >>B=diff(diff((z,x),y)) >>C=diff(z,y,2)

MATLAB三次样条插值之三弯矩法

MATLAB三次样条插值之三弯矩法 首先说这个程序并不完善,为了实现通用(1,2,…,n)格式解题,以及为调用追赶法程序,没有针对节点数在三个以下的情况进行分类讨论。希望能有朋友给出更好的方法。 首先,通过函数sanwanj得到方程的系数矩阵,即追赶法方程的四个向量参数,接下来调 用追赶法(在intersanwj函数中),得到三次样条分段函数系数因子,然后进行多项式合并 得到分段函数的解析式,程序最后部分通过判断输入值的区间自动选择对应的分段函数并计算 改点的值。附:追赶法程序chase %%%%%%%%%%%%%% function [newv,w,newu,newd]=sanwj(x,y,x0,y0,y1a,y1b)?%三弯矩样 条插值?%将插值点分两次输入,x0y0单独输入?% 边值条件a的二阶导数 y1a 和b 的二阶导数y1b,这里建议将y1a和y1b换成y2a和y2b,以便于和三转角代码相区别 ?n=length(x);m=length(y); if m~=n?error('x or y 输入有误,再来'); end?v=ones(n-1,1);u=ones(n-1,1);d=zeros(n-1,1);?w=2*o nes(n+1);?h0=x(1)-x0;?h=zeros(n-1,1); for k=1:n-1?h(k)=x(k+1)-x(k);?end v(1)=h0/(h0+h(1)); u(1)=1-v(1); d(1)=6*((y(2)-y(1))/h(1)-(y(1)-y0)/h0)/(h0+h(1));?% for k=2:n-1?v(k)=h(k-1)/(h(k-1)+h(k));?u(k)=1-v(k);?d(k)= 6*((y(k+1)-y(k))/h(k)-(y(k)-y(k-1))/h(k-1))/(h(k-1)+h(k)); end newv=[v;1];?newu=[1;u]; d0=6*((y(1)-y0)/h0-y1a)/h0; d(n)=6*(y1b-(y(n)-y(n-1))/h(n-1))/h(n-1); newd=[d0;d]; %%%%%%%%%%%% function intersanwj(x,y,x0,y0,y1a,y1b) %三弯矩样条插值?%第一部分?n=length(x);m=length(y); if m~=n?error('xory 输入有误,再来'); end?%重新定义h?h=zeros(n,1); h(1)=x(1)-x0; for k=2:n h(k)=x(k)-x(k-1);?end %sptep1调用三弯矩函数?[a,b,c,d]=sanwj(x,y,x0,y0,y1a,y1b);

Matlab优化(求极值)

第七讲 Matlab 优化(求极值) 理论介绍:算法介绍、软件求解. 一.线性规划问题 1.线性规划问题是在一组线性约束条件的限制下,求一线性目标函数最大或最小值的问题,Matlab 中规定线性规划的标准形式为 min s.t.T x c x Ax b Aeq x beq lb x ub ≤?? ?=??≤≤? 其中c 和x 为n 维列向量,A 、Aeq 为适当维数的矩阵,b 、beq 为适当维数的列向量。注意:线性规划问题化为Matlab 规定中的标准形式。 求解线性规划问题的Matlab 函数形式为linprog(c,A,b),它返回向量x 的值,它的具体调用形式为: [x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,x0,OPTIONS) 这里fval 返回目标函数的值,LB 、UB 分别是变量x 的下界和上界,x0是x 的初始值,OPTIONS 是控制参数。 例1 求解线性规划问题 1231231 23123123max 23572510s.t.312,,0 z x x x x x x x x x x x x x x x =+-++=??-+≥??++≤??≥? 程序:c=[2;3;5]; >> A=[-2,5,-1;1,3,1];b=[-10;12]; >> Aeq=[1,1,1];beq=[7]; >> LB=[0;0;0];(zeros(3,1)) >> [x,fval]=linprog(c,A,b,Aeq,beq,LB,[]) 练习与思考:求解线性规划问题

12312312123 min 23+428 s.t.3+26,,0z x x x x x x x x x x x =+++≥?? ≥??≥? 注意:若没有不等式:b AX ≤存在,则令A=[ ],b=[ ]. 若没有等式约束, 则令Aeq=[ ], beq=[ ]. 2.可以转化为线性规划的问题 规划问题12min||+||++||s.t.,n x x x Ax b ≤L 其中1=[],T n x x x L ,A b 为相应维数的矩阵和向量。注意到对任意的i x 存在,>0i i u v 满足=-,||=+i i i i i i x u v x u v ,事实上只要取 +||||-= ,=22 i i i i i i x x x x u v 就可以满足上面的条件。 这样,记11=[],=[],T T n n u u u v v v L L 从而可以把问题变成 =1min (+) (-)s.t.,0 n i i i u v A u v b u v ≤?? ≥?∑ 例2 求解规划问题min{max||}i i i x y ε,其中=-.i i i x y ε 对于这个问题,如果取0=lim||i i y x ε,这样,上面的问题就变换成 01100min s.t.-,,-n n x x y x x y x ≤≤L 这是我们通常的线性规划问题。 练习与思考:规划问题 1234123412341234min ||2||+3||+4||--+=0s.t.-+-3=11--2+3=-2 z x x x x x x x x x x x x x x x x =+? ?? ???? 二.非线性一元函数的最小值 对于求一元函数的最小值问题,Matlab 提供了一个命令函数fminbnd ,

Matlab求函数最值

MATLAB 求函數極小(大)值

函數的極值 n函數的極值(極大值或極小值)可從兩個角度來談,一為絕對的極值(absolute or global extreme value),另一為相對的極值(relative or local extreme value) n絕對的極值:在所有定義域內中的極大值或極小值 n相對的極值:在定義域內某一區間中的極大值或極小值

n 單一變數函數 n 多變數函數 n y = f (x 1, x 2, …, x n )為一函數。若f 在x*上有極值,則 函數極值的發生處 0x y = f (x ) 0x y = f (x )極小值 極大值***12()0,()0,,()0n f f f x x x x x x ???===???L

求單變數函數之極小值n 在特定區間尋找單一變數之函數f(x) 之極小值 n 方法一:在區間內取點,計算這些點的函數值,然後利用min 指令找出其極小值 Ex. 求之極小值,其中>> x=linspace(0,8,100);>> y=cos(x).*exp(-2*x);>> [ymin index]=min(y)>> xmin=x(index) ()* min (),=££l u x f x f x x x x 08 ££x 2()cos()-=x f x x e ymin =-0.0076index =26xmin =2.0202f(x) 稱為目標函數(objective function)

求單變數函數之極小值n 方法二:利用MATLAB 內建函數fminbnd Ex.求之極小值,其中*step 1. edit fun.m function F=fun(x) F=cos(x)*exp(-2*x); *step 2. 求解(回到Matlab Command Window )>> [x, fval]=fminbnd(@fun, 0, 8)[x, fval] = fminbnd(@fun, x1, x2) x: 使函數值最小之x 值fval: 函數之極小值fun: 定義目標函數的function m-file 檔名x1: 區間下限, x2: 區間上限 2()cos()-=x f x x e 08 ££x x =2.0344fval =-0.0076

matlab 牛顿插值法 三次样条插值法

(){} 21 ()(11),5,10,20: 1252 1()1,(0,1,2,,)()2,(0,1,2,,)() ()2 35,20:1100 (i i i i n n k k k Newton f x x n x f x x i i n f x n x y i n Newton N x S x n x k y f x =-≤≤=+=-+====-+ = 题目:插值多项式和三次样条插值多项式。 已知对作、计算函数在点处的值;、求插值数据点 的插值多项式和三次样条插值多项式;、对计算和相应的函数值),()() (1,2,,99)4:()max ()()max ()n k n k n k n k n k n k k k N x S x k E N y N x E S y S x ==-=- 和; 、计算,; 解释你所得到的结果。 算法组织: 本题在算法上需要解决的问题主要是:求出第二问中的Newton 插值多项式 )(x N n 和三次样条插值多项式()n S x 。如此,则第三、四问则迎刃而解。计算两种插值多项式的算法如下: 一、求Newton 插值多项式)(x N n ,算法组织如下: Newton 插值多项式的表达式如下: )())(()()(110010--???--+???+-+=n n n x x x x x x c x x c c x N 其中每一项的系数c i 的表达式如下: 1102110) ,,,(),,,(),,,(x x x x x f x x x f x x x f c i i i i i -???-???= ???=- 根据i c 以上公式,计算的步骤如下: ?? ??? ?? ?????+??????? ???????????----) ,,,,(1) ,,,(),,,,(),(,),,(2)(,),(),(11101111011010n n n n n n n n x x x x f n x x x f x x x f n x x f x x f x f x f x f 、计算、计算、计算、计算 二、求三次样条插值多项式)(x S n ,算法组织如下:

Matlab中插值函数汇总和使用说明

告: Matlab中插值函数汇总和使用说明收藏 命令1 interp1 功能一维数据插值(表格查找)。该命令对数据点之间计算内插值。它找出一元函数f(x)在中间点的数值。其中函数f(x)由所给数据决定。x:原始数据点 Y:原始数据点 xi:插值点 Yi:插值点 格式 (1)yi = interp1(x,Y,xi) 返回插值向量yi,每一元素对应于参量xi,同时由向量x 与Y 的内插值决定。参量x 指定数据Y 的点。 若Y 为一矩阵,则按Y 的每列计算。yi 是阶数为length(xi)*size(Y,2)的输出矩阵。 (2)yi = interp1(Y,xi) 假定x=1:N,其中N 为向量Y 的长度,或者为矩阵Y 的行数。 (3)yi = interp1(x,Y,xi,method) 用指定的算法计算插值: ’nearest’:最近邻点插值,直接完成计算; ’linear’:线性插值(缺省方式),直接完成计算; ’spline’:三次样条函数插值。对于该方法,命令interp1 调用函数spline、ppval、mkpp、umkpp。这些命令生成一系列用于分段多项式操作的函

数。命令spline 用它们执行三次样条函数插值; ’pchip’:分段三次Hermite 插值。对于该方法,命令interp1 调用函数p chip,用于对向量x 与y 执行分段三次内插值。该方法保留单调性与数据的外形; ’cubic’:与’pchip’操作相同; ’v5cubic’:在MATLAB 5.0 中的三次插值。 对于超出x 范围的xi 的分量,使用方法’nearest’、’linear’、’v5cubic’的插值算法,相应地将返回NaN。对其他的方法,interp1 将对超出的分量执行外插值算法。 (4)yi = interp1(x,Y,xi,method,'extrap') 对于超出x 范围的xi 中的分量将执行特殊的外插值法extrap。 (5)yi = interp1(x,Y,xi,method,extrapval) 确定超出x 范围的xi 中的分量的外插值extrapval,其值通常取NaN 或0。 例1 1.>>x = 0:10; y = x.*sin(x); 2.>>xx = 0:.25:10; yy = interp1(x,y,xx); 3.>>plot(x,y,'kd',xx,yy) 复制代码 例2 1.>> year = 1900:10:2010; 2.>> product = [75.995 91.972 105.711 12 3.203 131.669 150.697 179.323 203.212 226.505

MATLAB实现拉格朗日插值精编版

数值分析上机报告 题目:插值法 学号:201014924 姓名:靳会有

一、调用MATLAB内带函数插值 1、MATLAB内带插值函数列举如下: 2、取其中的一维数据内插函数()为例,程序如下:其调用格式为: yi=interp1(x, y, xi) yi=interp1(x, y, xi, method) 举例如下: x=0:10:100 y=[40 44 46 52 65 76 80 82 88 92 110]; xi=0:1:100 yi=interp1(x,y,xi,'spline') 3、其他内带函数调用格式为: Interpft函数: y=interpft(x,n) y=interpft(x,n,dim) interp2函数: ZI=interp2(X, Y, Z, XI, YI),ZI=imerp2(Z, ntimes)

ZI=interp2(Z, XI, YI) ,ZI=interp2(X, Y, Z, XI, YI, method) interp3函数: VI=interp3(X,Y,Z,V,XI,YI,ZI) VI=interp3(V, ntimes) VI=interp3(V,XI,YI,ZI) VI=interp3(…, method) Interpn函数: VI=interpn(X1, X2, X3, …, V, Y1, Y2, Y3, …) VI=interpn(V, ntimes) VI=interpn(V, Yl, Y2, Y3, …) VI=interpn(…, method) Spline函数: yi=spline(x,y,xi) pp=spline(x,y) meshgrid函数: [X,Y]=meshgrid(x,y) [X,Y]=meshgrid(x) [X,Y,Z]=meshgrid(x,y,z) Ndgrid函数: [X1, X2, X3, …]=ndgrid(x1, x2, x3, …) [X1, X2, X3, …]=ndgrid(x) Griddata函数: ZI=griddata(x, y, z, XI, YI) [XI, YI, ZI]=griddata(x, y, z, xi, yi) […]=griddata(… method) 二、自编函数插值 1、拉格朗日插值法: 建立M 文件: function f = Language(x,y,x0) syms t l; if(length(x) == length(y)) n = length(x); else disp('x和y的维数不相等!'); return; %检错

相关文档
最新文档