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)的近似值