21
5 数值计算 5.1 函数的极值 5.1.1 一元函数的极值 函数命令:fminbnd 调用格式:[x,feval,exitflag,output]=fminbnd(fun,x1,x2,options) %求 fun 在区间(x1,x2)上的极值. 返回值: x:函数 fun 在(x1,x2)内的极值点 feval:求得函数的极值 exitflag: exitflag>0,函数收敛于解 x 处 exitflag=0,已达最大迭代次数 exiflag<0,函数在计算区间内不收敛. 例 1:求函数 上的极小值. | ) sin( sin( sin( | ) ( x x x e e e x x x y y y ) , ( 2 2 fun=inline('(x+pi)*exp(abs(sin(x+pi)))') [x,feval,exitflag,output]=fminbnd(fun,-pi/2,pi/2) fun = Inline function: fun(x) = (x+pi)*exp(abs(sin(x+pi))) x= -1.2999e-005 feval = 3.1416 exitflag = 1 output = iterations: 21 funcCount: 22 algorithm: 'golden section search, parabolic interpolation' message: [1x112 char] xx=-pi/2:pi/200:pi/2; yxx=(xx+pi).*exp(abs(sin(xx+pi))); plot(xx,yxx) xlabel('x'),grid on % 可以用命令[xx,yy]=ginput(1) 从局部图上取出极值点及相应函数值

5 章 数值计算 - jpkc.gxjsxy.cnjpkc.gxjsxy.cn/include/htmleditor/uploadfile/2011032505261379.pdf · 第 5 5 章 数值计算 5.1 函数的极值 5.1.1 一元函数的极值 函数命令:

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

第 555

5

章 数值计算

5.1 函数的极值

5.1.1 一元函数的极值

函数命令:fminbnd

调用格式:[x,feval,exitflag,output]=fminbnd(fun,x1,x2,options)

%求 fun 在区间(x1,x2)上的极值.

返回值:

x:函数 fun 在(x1,x2)内的极值点

feval:求得函数的极值

exitflag:

exitflag>0,函数收敛于解x处

exitflag=0,已达最大迭代次数

exiflag<0,函数在计算区间内不收敛.

例 1:求函数 在 上的极小值.|||

|

)))

)

sin(sin(sin(

sin(

|||

|

)))

)

(((

(

xxx

x

eee

e

xxx

x

yyy

y

)))

)

,,,

,

(((

(

22

fun=inline('(x+pi)*exp(abs(sin(x+pi)))')

[x,feval,exitflag,output]=fminbnd(fun,-pi/2,pi/2)

fun =

Inline function:

fun(x) = (x+pi)*exp(abs(sin(x+pi)))

x =

-1.2999e-005

feval =

3.1416

exitflag =

1

output =

iterations: 21

funcCount: 22

algorithm: 'golden section search, parabolic interpolation'

message: [1x112 char]

xx=-pi/2:pi/200:pi/2;

yxx=(xx+pi).*exp(abs(sin(xx+pi)));

plot(xx,yxx)

xlabel('x'),grid on

% 可以用命令[xx,yy]=ginput(1) 从局部图上取出极值点及相应函数值

-2 -1.5 -1 -0.5 0 0.5 1 1.5 23

4

5

6

7

8

9

10

11

12

13

x

例 2:求解函数 humps 的极小值.

type humps %humps 是一个 Matlab 提供的 M函数文件

function [out1,out2] = humps(x)

%HUMPS A function used by QUADDEMO, ZERODEMO and FPLOTDEMO.

% Y = HUMPS(X) is a function with strong maxima near x = .3

% and x = .9.

%

% [X,Y] = HUMPS(X) also returns X. With no input arguments,

% HUMPS uses X = 0:.05:1.

%

% Example:

% plot(humps)

%

% See QUADDEMO, ZERODEMO and FPLOTDEMO.

% Copyright 1984-2002 The MathWorks, Inc.

% $Revision: 5.8 $ $Date: 2002/04/15 03:34:07 $

if nargin==0, x = 0:.05:1; end

y = 1 ./ ((x-.3).^2 + .01) + 1 ./ ((x-.9).^2 + .04) - 6;

if nargout==2,

out1 = x; out2 = y;

else

out1 = y;

end

[x,y]=fminbnd(@humps,0.5,0.8)

x =

0.6370

y =

11.2528

xx=0:0.001:2;

yy=humps(xx);

plot(xx,yy)

0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2-20

0

20

40

60

80

100

例 3:求 在(0,1)内的极小值.xxx

x

xxx

x

yyy

y

type myfunmin1 %显示 M文件内容

function f=myfunmin1(x)

f=x.^x;

[x,y]=fminbnd(@myfunmin1,0,1)

x =

0.3679

y =

0.6922

xx=0:0.001:1;

yy=myfunmin1(xx);

plot(xx,yy)

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 10.65

0.7

0.75

0.8

0.85

0.9

0.95

1

[x,y]=fminbnd('x.^x',0,1)

x =

0.3679

y =

0.6922

5.1.2 多元函数的极值

函数命令:fminsearch

调用格式:[x,feval,exitflag,output]=fminsearch(fun,x0,optipons)

% 求在 x0 附近的极值

例 4:求 的极小值.222 1100 )))

)

(((

(

)))

)

(((

(

)))

)

,,,

,

(((

(

xxx

x

xxx

x

yyy

y

yyy

y

xxx

x

fff

f

type myfunmin2

function f=myfunmin2(v)

x=v(1);

y=v(2);

f=100*(y-x.^2).^2+(1-x).^2;

[sx,sfeval]=fminsearch(@myfunmin2,[1 1])

sx =

1 1

sfeval =

0

x0=[-5,-2,2,5;-5,-2,2,5]

[sx,sfeval]=fminsearch(@myfunmin2,x0)

x0 =

-5 -2 2 5

-5 -2 2 5

sx =

1.0000 -0.6897 0.4151 8.0886

1.0000 -1.9168 4.9643 7.8004

sfeval =

2.4112e-010

disp([myfunmin2(sx(:,1)),myfunmin2(sx(:,2)),myfunmin2(sx(:,3)),myfunmin2(sx(:,

4))])

1.0e+005 *

0.0000 0.0058 0.0230 3.3211

5.2 函数零点

函数命令:fzero

求一元函数的零点

调用格式:[x,feval,exitflag,output]=fzero(fun,x0,options)

例 5:求 的零点。 5.0)(sin)( 1.02 tettf t

(1)采用符号计算

S=solve('sin(t)^2*exp(-0.1*t)-0.5*abs(t)','t')

S =

0.

(2)数值法求解

y=inline('sin(t).^2.*exp(-0.1*t)-0.5*abs(t)','t');

t=-10:0.01:10;

Y=y(t);

plot(t,Y,'r');

hold on

plot(t,zeros(size(t)),'k');

xlabel('t');ylabel('y(t)')

hold off

-10 -8 -6 -4 -2 0 2 4 6 8 10-5

-4

-3

-2

-1

0

1

t

y(t)

zoom on %获局部放大图

[tt,yy]=ginput(5);zoom off %用鼠标获 5个零点燃猜测值

tt

yy

tt =

-2.0046

-0.5300

-0.1152

0.6221

1.6820

yy =

-0.0088

-0.0088

-0.0088

-0.0088

-0.0088

[t1,y1]=fzero(y,-0.1)

t1 =

-0.5198

y1 =

0

[t2,y2]=fzero(y,2)

t2 =

1.6738

y2 =

2.2204e-016

非线性方程组的求解:fsolve

语法:[x,fval]=fsolve(fun,x0)

例 6:求解非线性方程组:

00

042

xyzxyzxyz

xyz

yzyzyz

yz

xxx

x

eee

e

zzz

z

yyy

y

xxx

x

xxx

x

sinsinsin

sin

type myfunsolve1 %显示 M函数文件.

function f=myfunsolve1(v)

x=v(1);

y=v(2);

z=v(3);

f(1)=sin(x)+y+z^2.*exp(x)-4;

f(2)=x+y*z;

f(3)=x*y*z;

f=fsolve(@myfunsolve1,[1,1,1])

Optimization terminated: relative function value changing by less

than max(options.TolFun^2,eps) and sum-of-squares of function

values is less than sqrt(options.TolFun).

f =

0.0005 -0.0002 1.9995

yy=myfunsolve1(f)

yy =

1.0e-006 *

-0.2636 0.1200 -0.2131

例 7:求一个 3阶方阵 A,使 A^3=[1 2 3;4 5 6;7 8 9]

>> type myfsolve2

function F=myfsolve2(A)

F=A^3-[1 2 3;4 5 6;7 8 9];

>> A=fsolve(@myfsolve2,ones(3))

>> myfsolve2(A)

5.3 数值积分

函数命令:quad quadl odbquad

调用格式:

q1=quad(fun,a,b,tol) %采用自适应Simpson 算法计算积分

q1=quadl(fun,a,b,tol) %采用自适应 Lobatto 算法计算积分

q2=dblquad(fun,xmin,xmax,ymin,ymax,tol) %二重积分

q3=triplequad(fun,xmin,xmax,ymin,ymax,zmin,zmax,tol)

%三重积分

例 1:求 I= .

1

0

2

dxdxdx

dx

eee

e

xxx

x

(1)利用 quad,quadl 计算

format long

I=quad('exp(-x.^2)',0,1,1e-8)

Il=quadl('exp(-x.^2)',0,1,1e-8)

I =

0.74682413285445

Il =

0.74682413398845

(2) 采用编程计算:

type myquad1

function I=myquad1(a,b,n)

x=linspace(a,b,n);

y=exp(-x.^2)*(b-a)/n;

I=sum(y);

I1=myquad1(0,1,10000)

I2=myquad1(0,1,100000)

I1 =

0.74681784375801

I2 =

0.74682350396218

(3) 利用符号积分

syms x

Isym=vpa(int(exp(-x.^2),x,0,1)) % int(f,v,a,b) 计算 f对变量v的定积

分,vpa(s,n)将 s 表示为 n 位有效位数的符号对象

Isym =

.746824132812430

a=vpa(2/3,20)

a =

.66666666666666666667

例 2:计算

1

0

2

1dydydy

dy

xxx

x

dxdxdx

dx

sss

s

yyy

y

(1) 利用 dblquad

s1=dblquad('x.^y',0,1,1,2) , %被积函数写成数组的形式

s1 =

0.40546626724351

s2=dblquad(@(x,y)x.^y,0,1,1,2) %采用匿名函数表示被积函数

s2 =

0.40546626724351

s3=dblquad(inline('x.^y'),0,1,1,2)

s3 =

0.40546626724351

(2)利用符号积分

syms x y

s=vpa(int(int(x.^y,y,1,2),x,0,1))

s =

.405465108108165

例 3:求 s1= ,s2= ,s3= .

1 211 dxx

dx

xx 321

2

dx

xx 321

2

syms x

f1=1/(1+x^2);

f2=1/(x^2+2*x+3);

f3=1/(x^2+2*x-3);

s1=int(f1,1,inf)

s2=int(f2,-inf,inf)

s3=int(f3,-inf,inf)

s1 =

1/4*pi

s2 =

1/2*pi*2^(1/2)

s3 =

NaN

s4=quad('1./(1+x.^2)',1,inf) %quad 只能计算闭型积分

Warning: Infinite or Not-a-Number function value encountered.

> In quad at 95

s4 =

NaN

s5=quad('1./(1+x.^2)',1,10)

s5 =

0.6857

s6=int(f1,1,10')

s6 =

atan(10)-1/4*pi

vpa(s6,10)

ans =

.6857295105

例 4:计算 ,其中 D 为直线 y=2x,y=x/2,y=12-x 围成的区域.D

dxdyyx

2

2

解:(1)求积分分区域

syms x y

f=x^2/y^2;

y1=2*x;

y2=x/2;

y3=12-x;

ezplot(y1)

hold on

ezplot(y2,[-2,15])

ezplot(y3,[-2,15])

pointA=fzero('2*x-x/2',0)

pointB=fzero('2*x-(12-x)',4)

pointC=fzero('12-x-x/2',8)

pointA =

0

pointB =

4

pointC =

8

text(-0.2,0.5,'A');

text(3.2,8,'B')

text(8,4.5,'C')

-2 0 2 4 6 8 10 12 14

-4

-2

0

2

4

6

8

10

12

14

x

12-x

A

B

C

(2)计算

x

x

x

xD

dyyxdxdy

yxdxdxdy

yx 12

2/ 2

28

4

2

2/ 2

24

02

2

A1=int(f,y,x/2,2*x)

A2=int(f,y,x/2,12-x)

B1=int(A1,0,4)

B2=int(A2,4,8)

I=B1+B2

Warning: Explicit integral could not be found.

> In sym.int at 58

A1 =

int(x^2/y^2,y = 1/2*x .. 2*x)

Warning: Explicit integral could not be found.

> In sym.int at 58

A2 =

int(x^2/y^2,y = 1/2*x .. 12-x)

B1 =

12

B2 =

120-144*log(2)

I =

132-144*log(2)

5.4 求解常微分方程

5.4.1 带初始条件的常微分方程

常微分方程(Ordinary Differential Equation)

微分方程组:

(1)

00 )(),('

ytyytfy

(2) ),,,,( )1()( nn yyytfy

令 ,转化为方程组)1(

21 ,,, nn yyyyyy

),,,,( 21

32

21

nn yyytfy

yyyy

函数调用格式:

[t,y]=ode45(odefun,tspan,y0) %积分器ode45 采用 Runge-Kutta 算法,速度较快,一般

作为解问题的初试法.此外还有ode23,ode113,ode15s...

odefun:微分方程组,写成 y'=f(t,y)形式

tspan:积分区间向量

yo:初始条件向量

例 1 求范德坡方程 , ,在初始条件0)1( 22

2

xdtdxx

dtxd

2 0)0(,1)0( dtdxx

情况下的解。

(1)将高阶微分方程写成一阶线性微分方程组

令 ,则原方程为dtdxxxx 21 ,

,即 ,x0=

1221

2

21

)1( xxxdtdx

xdtdx

1221

2

2

1

)1( xxxx

dtdxdtdx

01

)0()0(

2

1

xx

(2) 定义 M 函数文件:

function y=myodefun1(t,x)

miu=2;

y=[x(2);miu*(1-x(1)^2)*x(2)-x(1)];

(3) 求解

tspan=[0,30];

x0=[1;0];

[tt,xx]=ode45(@myodefun1,tspan,x0);

plot(tt,xx(:,1));

xlabel('t'),title('x(t)')

0 5 10 15 20 25 30-2.5

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

2.5

t

x(t)

例 2:求解 Euler 方程:

213

312

321

51.0 yyyyyyyyy

(1)定义 M 函数文件:

type myodefun2

function dydt=myodefun2(t,y)

y1=y(1);

y2=y(2);

y3=y(3);

dydt=[y2*y3;-y1*y3;-0.51*y1*y2];

(2)求解

tspan=[0,12];

y0=[0;1;1];

[tt,yy]=ode45(@myodefun2,tspan,y0)

tt =

0

0.0001

0.0001

0.0002

0.0002

0.0005

0.0007

0.0010

0.0012

0.0025

0.0037

0.0050

0.0062

0.0125

0.0188

0.0251

0.0313

0.0627

0.0941

0.1255

0.1569

0.2760

0.3951

0.5143

0.6334

0.7975

0.9616

1.1257

1.2898

1.5240

1.7582

1.9924

2.2267

2.5015

2.7764

3.0513

3.3262

3.5080

3.6898

3.8717

4.0535

4.2353

4.4172

4.5990

4.7808

4.9737

5.1666

5.3594

5.5523

5.8266

6.1008

6.3750

6.6493

6.8774

7.1056

7.3338

7.5619

7.7901

8.0182

8.2464

8.4745

8.6643

8.8541

9.0439

9.2337

9.5047

9.7758

10.0468

10.3179

10.6096

10.9013

11.1930

11.4847

11.6136

11.7424

11.8712

12.0000

yy =

0 1.0000 1.0000

0.0001 1.0000 1.0000

0.0001 1.0000 1.0000

0.0002 1.0000 1.0000

0.0002 1.0000 1.0000

0.0005 1.0000 1.0000

0.0007 1.0000 1.0000

0.0010 1.0000 1.0000

0.0012 1.0000 1.0000

0.0025 1.0000 1.0000

0.0037 1.0000 1.0000

0.0050 1.0000 1.0000

0.0062 1.0000 1.0000

0.0125 0.9999 1.0000

0.0188 0.9998 0.9999

0.0251 0.9997 0.9998

0.0313 0.9995 0.9997

0.0627 0.9980 0.9990

0.0939 0.9956 0.9977

0.1250 0.9922 0.9960

0.1560 0.9878 0.9938

0.2709 0.9626 0.9811

0.3803 0.9249 0.9624

0.4824 0.8760 0.9388

0.5758 0.8176 0.9115

0.6888 0.7249 0.8707

0.7829 0.6222 0.8291

0.8583 0.5129 0.7900

0.9162 0.4002 0.7560

0.9713 0.2371 0.7201

0.9971 0.0731 0.7019

0.9956 -0.0909 0.7030

0.9666 -0.2546 0.7232

0.8954 -0.4458 0.7691

0.7764 -0.6300 0.8322

0.6052 -0.7953 0.9014

0.3838 -0.9231 0.9616

0.2146 -0.9764 0.9880

0.0355 -0.9992 0.9996

-0.1451 -0.9894 0.9947

-0.3191 -0.9478 0.9739

-0.4785 -0.8782 0.9400

-0.6180 -0.7864 0.8976

-0.7347 -0.6784 0.8515

-0.8280 -0.5602 0.8063

-0.9030 -0.4290 0.7642

-0.9552 -0.2949 0.7311

-0.9868 -0.1600 0.7093

-0.9992 -0.0250 0.7003

-0.9857 0.1667 0.7101

-0.9331 0.3584 0.7454

-0.8367 0.5467 0.8016

-0.6911 0.7223 0.8696

-0.5294 0.8482 0.9258

-0.3351 0.9421 0.9710

-0.1175 0.9929 0.9964

0.1096 0.9939 0.9969

0.3287 0.9443 0.9719

0.5244 0.8517 0.9273

0.6871 0.7269 0.8717

0.8132 0.5817 0.8142

0.8912 0.4534 0.7715

0.9467 0.3217 0.7370

0.9817 0.1889 0.7131

0.9981 0.0561 0.7014

0.9909 -0.1335 0.7066

0.9459 -0.3232 0.7373

0.8594 -0.5105 0.7894

0.7257 -0.6876 0.8552

0.5228 -0.8524 0.9281

0.2695 -0.9631 0.9815

-0.0118 -0.9990 0.9992

-0.2936 -0.9540 0.9763

-0.4098 -0.9102 0.9548

-0.5169 -0.8539 0.9279

-0.6135 -0.7874 0.8974

-0.6987 -0.7128 0.8650

plot(tt,yy,'o')

0 2 4 6 8 10 12-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

5.4.2 带边值条件的常微分方程(boundary value problems)

(1) (2) (p 是未知参数)

0))(),((),(bfafgyxfy

0)),(),((),,(pbfafg

pyxfy

调用格式:

sol=bvp4c(odefun,bcfun,solinit)

odefun:微分方程组

bcfun:边界条件

solinit:初始估计值:

输出 sol 是一个结构:

sol.x:bvp4c 选择的网格节点

sol.y:bvp4c 网格点处y(x)的近似值

sol.yp:bvp4c 网格点处 y'(x)的近似值

sol.parameters:未知参数的值,如果存在未知参数,解题器会自动求得.

例 1:求常微分方程 在 时的数值解.0|| yy 2)4(,0)0( yy

(1)把微分方程写成方程组:

令 y1=y,y2=y',则方程组为

,边界条件

|| 12

21

yyyy

2)4(0)0(

1

1

yy

(2)编写微分方程函数及边界函数

type mybvp1

type mybvpbc1

function odefun1=mybvp1(x,y)

odefun1=[y(2);-abs(y(1))];

function bcfun1=mybvpbc1(ya,yb)

bcfun1=[ya(1);yb(1)+2];

(3)求解

solinit=bvpinit([0 1 2 3 4],[1 0]) %后成初始网格,[1 0]为初始估计值

sol=bvp4c(@mybvp1,@mybvpbc1,solinit)

solinit.x

solinit.y

solinit =

x: [0 1 2 3 4]

y: [2x5 double]

sol =

x: [1x22 double]

y: [2x22 double]

yp: [2x22 double]

solver: 'bvp4c'

ans =

0 1 2 3 4

ans =

1 1 1 1 1

0 0 0 0 0

x=linspace(0,4);

y=deval(sol,x); %求方程在[0,4]内的数值解

plot(x,y(1,:))

0 0.5 1 1.5 2 2.5 3 3.5 4-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

2.5

例 2:求 q=5 时 Mathieu 方程的特征值 :Mathieu 方程:

0)2cos2( yxqy

边界条件:

0)('0)0(

1)0(

yyy

(1)把问题写成微分方程组:令 y1=y,y2=y',则 方形的,边界条

12

21

)2cos2( yxqyyy

件:

0)(0)0(1)0(

2

2

1

yyy

type mybvp4c1

function dydx=mybvp4c1(x,y,lambda)

q=5;

dydx=[y(2);-(lambda-2*q*cos(2*x))*y(1)];

编写边界条件函数:

type mybvp4cbcfun

function res=mybvp4cbcfun(ya,yb,lambda)

res=[ya(1)-1; %y1(0)-1=0

ya(2); %y2(0)=0

yb(2)]; %y2(pi)=0

(2) 初始化网格

type mybvp4init %编写猜测函数

function yinit=mybvp4init(x)

yinit=[cos(4*x)

-4*sin(4*x)];

lambda=15;

solinit=bvpinit(linspace(0,pi,10),@mybvp4init,lambda) %含有参数 lambda

solinit =

x: [0 0.3491 0.6981 1.0472 1.3963 1.7453 2.0944 2.4435 2.7925

3.1416]

y: [2x10 double]

parameters: 15

solinit.x

solinit.y

ans =

0 0.3491 0.6981 1.0472 1.3963 1.7453 2.0944

2.4435 2.7925 3.1416

ans =

1.0000 0.1736 -0.9397 -0.5000 0.7660 0.7660 -0.5000 -

0.9397 0.1736 1.0000

0 -3.9392 -1.3681 3.4641 2.5712 -2.5712 -3.4641

1.3681 3.9392 0.0000

sol=bvp4c(@mybvp4c1,@mybvp4cbcfun,solinit)

sol =

x: [1x37 double] %选择的网格点

y: [2x37 double] %在网格点处 y(x)的近似值

yp: [2x37 double] %在网格点处y'(x)的近似值

solver: 'bvp4c'

parameters: 17.0973

(3)可视化结果

xint=linspace(0,pi);

sxint=deval(sol,xint); %求方程在[0,pi]内的数值解,并绘图.与

plot(xint,sol.y(1,:))相同

axis([0,pi,-1,1.1])

xlabel('x');

ylabel('solution y')

0 0.5 1 1.5 2 2.5 3-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

x

solu

tion

y