第 10 章 计算物理与 fortran 编程 - 习题课

26
计计计计计计 - 计计计计计 西 2010 计计计计计计 第 10 第 第第第第第 Fortran 第第 - 第第第 计计计计 计计计 计计计计计 计计计 西

Upload: phyllis-weeks

Post on 31-Dec-2015

145 views

Category:

Documents


0 download

DESCRIPTION

第 10 章 计算物理与 Fortran 编程 - 习题课. 主讲教师:蒋臣威 西安交通大学 理学院. 例题. 例题 1. 利用数值方法求解 f=sinx 的一阶和二阶导数. 一阶导数的中心差分公式. 二阶导数的差分公式. 注意:对于边界点,可以采用向前差分、向后差分,或者外推法。. ( 1 )利用 Matlab 编程求解. 见 Matlab 程序 chap10_ex_1_sinx_differential.m. ( 2 )利用 Fortran 编程求解. 见 Fortran 程序 chap10_ex_1_sinx_differential.f90. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 10 章 计算物理与 Fortran 编程 - 习题课

计算物理基础 - 西安交通大学 2010级物理拔尖班

第 10 章 计算物理与 Fortran 编程 - 习

题课主讲教师:蒋臣威

西安交通大学 理学院

Page 2: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY 例题

例题 1. 利用数值方法求解 f=sinx 的一阶和二阶导数

一阶导数的中心差分公式

0 00

( ) ( )'( )=

2

f x h f x hf x

h

0 0 00 2

( ) 2 ( ) ( )( )

f x h f x f x hf x

h

二阶导数的差分公式

见 Matlab 程序 chap10_ex_1_sinx_differential.m

( 1 )利用 Matlab编程求解

( 2 )利用 Fortran编程求解

见 Fortran 程序 chap10_ex_1_sinx_differential.f90

注意:对于边界点,可以采用向前差分、向后差分,或者外推法。

Page 3: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

数值积分——辛普生法则

在区间 [xi-1, xi+1] 上对 f(x) 进行

Lagrange 二阶插值。1 1 1

11 1 1 1 1

311

1 1 1

( )( ) ( )( )( ) ( ) ( )

( )( ) ( )( )

( )( )( ) ( )

( )( )

i i i ii i

i i i i i i i i

i ii

i i i i

x x x x x x x xf x f x f x

x x x x x x x x

x x x xf x O h

x x x x

2h

1

11 1

4( ) [ ( ) 4 ( ) ( )] ( )3

i

i

x

i i ix

hf x dx f x f x f x hO

2 2

2

/2 1

0

/2 1

2 2 1 2 20

3

( ) ( )

[ ( ) 4 ( ) ( )] ( )3

j

j

nb x

a xj

n

j j jj

f x dx f x dx

hf x hf x f x O

k

i-1 i+1

1 1

0 1

[a,b] 2n h=(b-a)/2n, x =a+kh (k=0,1,...2n)

[x ,x ] simpson

( ) [ ( ) 4 ( (2 1) ) 2 ( 2 ) ( )]3

n nb

ak k

hf x dx f a f a k h f a kh f b

将 区间 等分,

对于每个 区间利用 算法,然后求和可得:

Page 4: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

例题 2 :利用 simpson 方法计算

dxx

1

0 14

21 1

0 1

( ) [ ( ) 4 ( (2 1) ) 2 ( 2 ) ( )]3

n nb

ak k

hf x dx f a f a k h f a kh f b

simpson 法simpson 法

见 Matlab 程序 chap10_ex_2_integration.m

( 1 )利用 Matlab编程求解

( 2 )利用 Fortran编程求解

见 Fortran 程序 chap10_ex_2_integration.f90

熟悉 fotran 程序的两种编译方式 (a) ifort –c –r8 chap10_ex_2_integration.f90 ifort –o chap10_ex_2_integration chap10_ex_2_integration.o ( 更加精确 )(b) Ifort –o chap10_ex_2_integration chap10_ex_2_integration.f90

Page 5: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

3.1. 方程数值求根的必要性阿贝尔 - 鲁芬尼定理:高于四次的一般代数方程没有一般形式的代数解

对于更为复杂的方程,如非线性方程

11 1 0( ) ( 0 )n n

n n nf x a x a x a x a a

( ) ( ) 1 0co s x cosh x

阿贝尔 (1802—1829)

作为基础我们只讨论一元非线性方程的数值求根问题。作为基础我们只讨论一元非线性方程的数值求根问题。

很难利用解析的方法求得方程的根。

后面很多章节,如常微分方程的边值问题的打靶法求解等问题中也将用到方程的数值求根问题。

3. 方程求根

Page 6: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

求 f (x) = 0 的根

根的存在性原理:若 f C[a, b] ,且 f (a) · f (b) < 0 ,则 f

(x)=0 在 (a, b) 上必有根。y

xba

f (x)

x*

3.2 二分法(对分搜索法)

a

b

x1

x2

a

b

x*

什么时候停止搜索?

11 εxx kk 2)( εxf and如何搜索?

or

Page 7: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

2

xkx*

f(x)f(x)

xkxk

xk+1xk+1

x*x*

f(x)f(x)

二分法的算法实现

给定有根区间 [a, b] ( f(a) f(b) < 0) 和 精度要求 1 , 2

1. 令 x = (a+b)/2;

2. 如果 |b – a| < 1 并且 |f(x)|< 2 ,结束运算,输出 x;

3. 如果 f (a) f (x) < 0 , 则令 b = x ,否则令 a = x, 返回第 1 步

2( )f x ε只用 可能造成误差偏大

1 1k kx x ε 只用 可能造成误差偏大

Page 8: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

二分法的优缺点

简单易用 稳妥,对 f (x) 要求不 高,只要连续即可收敛X 收敛速度慢,且只能求单根

输入函数 f(x), 区间[a,b], 误差标准 1, 2

输入函数 f(x), 区间[a,b], 误差标准 1, 2

if f(a)f(b)<0if f(a)f(b)<0NoNo

YesYes[a,b] 上

无根[a,b] 上

无根if |a-b|> 1 或|f((a+b)/2)|> 2

if |a-b|> 1 或|f((a+b)/2)|> 2

x=(a+b)/2n=n+1

x=(a+b)/2n=n+1

if f(x)f(a)>0if f(x)f(a)>0

YesYes

YesYes

a=xa=xb=xb=x

NoNo

x=(a+b)/2x=(a+b)/2

NoNo

endend

二分法的流程图

Page 9: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

01 0

0

( )k=0,

( )

f xx x

f x

几何意义

3.2 Newton-Raphson 方法

因此可以构造迭代公式:

设一元方程 f(x)=0 的非线性函数 f(x) 连续可微。我们在其解的近似值 xk 附近将 f(x) 作 Taylor 展开

2 ( )( ) ( ) ( ) ( ) ( ) 0

2!k

k k k k

f xf x f x x x f x x x

( )

( )k

kk

f xx x

f x

1

( ), 0,1,2,

( )k

k kk

f xx x k

f x

( )kf x 什么时候停止迭代?

x

y

x*x0x1x1x2x2

Page 10: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

1: 初始化 x0 , 误差标准 δ, 置 k=0

2: 如果 | f(xk ) |≤δ ,则停止 .

3: 计算 xk+1=xk - f (xk) / f ' (xk)

4: 如果 | f (xk+1) |≤δ ,则停止 .

5: k=k+1, 转至 3.

1

( )

( )k

k kk

f xx x

f x

牛顿迭代法的算法构造

画出Newton算法的流程图

画出Newton算法的流程图

Page 11: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

注:注: Newton-Raphson Method 收敛性依赖于 x0 的选取。注:注: Newton-Raphson Method 收敛性依赖于 x0 的选取。

x*x0x0

x0

算法说明

收敛快,稳定性好,精度高等优点,是求解非线性方程 的有效方法之一X 每次迭代均需计算函数值与导数值,计算量大。当导数值 提供有困难时, Newton 法无法进行。收敛性依赖初值选择。

Page 12: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

3.4 弦割法

x0x1

切线

割线

切线斜率  割线斜率1

1 )()()(

kk

kkk xx

xfxfxf

)()(

))((

1

11

kk

kkkkk xfxf

xxxfxx 任意 2 个初值 x0 和 x1

可以启动这个递推关系。

弦割法在 Newton-Raphon 法的效率与必须计算导数的麻烦间提供了一种折中。

弦割法在 Newton-Raphon 法的效率与必须计算导数的麻烦间提供了一种折中。

向后差分向后差分

代入Newton 迭代公式

代入Newton 迭代公式

Page 13: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

且且

When to stop?

11 εxx kk 2( )kf x ε或

不能保证 xk 的精度

2

xkx*

x0x1

切线

割线

x*x*

Page 14: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

弦割法的算法构造

画出弦割法的流程图画出弦割法的流程图

11

1

( )( )

( ) ( )k k k

k kk k

f x x xx x

f x f x

1: 初始化 x0 、 x1, 误差标准 δ 与 , 置 k=0

2: 如果 | f(xk ) |≤δ 且 | xk –xk+1 | ≤ ,则停止 .

3: 计算

4: k=k+1, 转至 2.

11

1

( )( )

( ) ( )k k k

k kk k

f x x xx x

f x f x

Page 15: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

例 3. 用弦割法求方程 1 0xxe 在 0.5x 附近的根 ( )410

解:取 0 10.5, 0.6x x 由迭代公式求得下表

k kx 1k kx x 0 0.5

1 0.6

2 0.56532 -0.03468

3 0.56709 0.00178

4 0.56714 0.00001

故 * 0.56714x ,满足精度要求.见 Matlab 程序

chap10_ex_3_bisection_newton_secant.m ( 1 )利用 Matlab编程求解( 2 )利用 Fortran编程求解 见 Fortran 程序

chap10_ex_3_bisection_newton_secant.f90

Page 16: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

常微分方程边值问题的数值解法

y p x y q x y f x

y a y b

, 。( 2 )

当 关于 和 是线性时,式( 1 )为线性两点边值问题

f y y

在具体求解常微分方程时,必须附加某种定解条件。定解条件通常有两种,一种是初始条件,另一种是边界条件。与边界条件相应的定解问题称为边值问题。本节介绍求解两点边值问题

y f x y y

y a y b

, , ,

, ,( 1 )

的数值解法。的数值解法。

Page 17: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

打靶法

( 3 ) k

y f x y y

y a y a s

, , ,

, ,

这里的 为 在 处的斜率。令 ,上述二阶方程可降为一阶方程组

ks y a yz

打靶法的基本原理是将两点边值问题( 1 )转化为下列形式的初值问题 打靶法的基本原理是将两点边值问题( 1 )转化为下列形式的初值问题

( 4 ) 。,

,,,,

ksazay

zyxfz

zy

Page 18: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

求根函数 F(x)求根函数 F(x)

因此,边值问题变成求合适的 ,使上述方程组初值问题的解满足原边值问题的右端边界条件 ,从而得到边值问题的解。这样,把一个两点边值问题的数值解问题转化为一阶方程组初值问题的数值解问题。方程组初值问题的所有数值方法在这里都可以使用。问题的关键是如何去找合适的初始斜率的试探值 。 ks

ks by

对给定的 ,设初值问题( 3 )的解为 ,它是 的隐函数。假设 随 是连续变化的,记为 ,于是我们要找的 就是方程

对给定的 ,设初值问题( 3 )的解为 ,它是 的隐函数。假设 随 是连续变化的,记为 ,于是我们要找的 就是方程

ks

ks

ks

ks ksxy ,

ksxy , sxy ,

0 sby ,

Page 19: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

的根。可以用第 2 章的二分法或迭代法求上述方程的根。比如用弦割法有

1 21 1

1 2

2 3k kk k k

k k

s ss s y b s k

y b s y b s

, , ,,

, ,( 5)

这样,可以按下面简单的计算过程进行求解。先给定两个初始斜率 ,分别作为初值问题( 4 )的初始条件。用一阶方程组的数值方法求解它们,分别得到区间右端点的函数的计算值 和 。如果 或 ,则以 或 作为两点边值问题的解。否则用割线法( 5 )求 ,同理得到 , 再判断它是否满足精度要求 。

10 ss,

0sby , 1sby , 0sby , 1sby ,

2s 2sby ,

2sby ,

0sxy , 1sxy ,

1 1 21

1 2

( )( )

( ) ( )k k k

k kk k

F x x xx x

F x F x

弦割法迭代公式:

Page 20: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

如此重复,直到某个 满足 ,此时得到的 和 就是边值问题的解函数值和它的一阶导数值。上述方程好比打靶, 作为斜率为子弹的发射, 为靶心,故称为打靶法。

ks ksby , ixy ii xzy

ks

by

1 1 21

1 2

( )( )

( ) ( )k k k

k kk k

F x x xx x

F x F x

弦割法迭代公式:

Page 21: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

打靶法的算法实现

1. 给定初始点的斜率猜测值 S1 ;2. 用常微分方程的初值问题解法(如 RK 算法)求解 y(b,S1);

3. 给出另一个斜率猜测值 S2 作为弦割法的第二个启动点 ;

4. 用常微分方程的初值问题解法(如 RK 算法)求解 y(b,S2);

5. IF (abs(y(b,S1)-y(b))< 精度 ), y(x)=y(x,S1);

6. IF (abs(y(b,S2)-y(b))< 精度 ), y(x)=y(x,S2); else

7. 利用弦割法迭代公式求出下一个斜率 S3 ;8. IF (abs(y(b,S3)-y(b))< 精度 ), y(x)=y(x,S3); else

S1=S2; S2=S3 ;回到第 7 步9. 得到边值问题的解 y(x)=y(x,S3);

1. 给定初始点的斜率猜测值 S1 ;2. 用常微分方程的初值问题解法(如 RK 算法)求解 y(b,S1);

3. 给出另一个斜率猜测值 S2 作为弦割法的第二个启动点 ;

4. 用常微分方程的初值问题解法(如 RK 算法)求解 y(b,S2);

5. IF (abs(y(b,S1)-y(b))< 精度 ), y(x)=y(x,S1);

6. IF (abs(y(b,S2)-y(b))< 精度 ), y(x)=y(x,S2); else

7. 利用弦割法迭代公式求出下一个斜率 S3 ;8. IF (abs(y(b,S3)-y(b))< 精度 ), y(x)=y(x,S3); else

S1=S2; S2=S3 ;回到第 7 步9. 得到边值问题的解 y(x)=y(x,S3);

1 21 1

1 2

2 3k kk k k

k k

s ss s y b s k

y b s y b s

, , ,,

, ,

Page 22: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

例 4 用打靶法求解非线性边值问题

。,,335382

1624 3

yy

xyyy

要求误差不超过 ,其解析解是 。解: 对方程进行降阶处理,并转化成初值问题

6105.0 xxxy 82

见 Matlab 程序chapter10_ex_4_shooting_method.m

。,,

kszy

xzyz

zy

282

424 3

( 1 )利用 Matlab编程求解( 2 )利用 Fortran编程求解 见 Fortran 程序

chapter10_ex_4_shooting_method.f90

Page 23: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

随机数的生成 -Metropolis 算法

Metropolis (1915-1999)

— The Paper was cited 14776 times from 1988 to 2013

虽然前面我们讲述了多种按照规定分布产生随机数的有效方法,但要推广这些方法以对多维空间中的一个复杂的权函数抽样却是很困难或者是不可能的。一种很普遍的产生具有任意形状的给定概率分布的随机变量的方法叫做Metropolis-Rosenbluth-Rosenbluth-Teller-Teller算法(简称 Metropolis算法)。该算法已经广泛第应用在统计力学等很多学科中。

Nicolas Metropolis, Arianna W. Rosenbluth, Marshall N. Rosenbluth,

Augusta H. Teller, Edward Teller J. Chem. Phys. 21, 1087 (1953).

Page 24: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

设想在变量 X 的空间 ( 可能是多维的 ) 内产生一组按概率密度w (X ) 分布的点, Metropolis 算法假想有一个随机行走者在 X 空间中运动,该随机行走过程相继各步的终点产生出点的一个序列: X0, X1, … ;随着行走的路程越长,它连接的点就越接近所要求的分布。

Metropolis算法的实现

随机行走在位形空间中进行的规则为:设行走者处于序列中的X n 点上,为了产生 X n+1 ,行走者迈出试探性的一步到一新点 X t , 该新点可以用任何方便的方法选取。例如可以在点 X n周围的一个边长很小的多维立方体中均匀地随机选取,然后按比值

)(

)(

n

t

xw

xwr

Page 25: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

来决定是“接受”还是“拒绝”该步试验。如果 r >1 ,接受该步 ( 即取 X n+1 =X t ) ;而如果 r <1 ,则以概率 r 接受这一步。

这样产生出 X n+1之后,可以再从 X n+1 出发迈出一个试验步按照同样的过程产生 X n+2 。任意点 X 0都可用作随机行走的起点。

上述算法的核心思想就是尽量多地选择 w ( X )较大的点。

这时我们把 r 和一个在[ 0,1]区间上均匀分布的随机数 比较,若 <r 就接受这一步。如果该步试验未被接受,就舍弃,取 Xn+1 = Xn 。

Page 26: 第 10 章 计算物理与 Fortran 编程 - 习题课

XI’AN JIAOTONG UNIVERSITY

例题 5 用 Metropolis 算法产生按照 25 1( )= -

6 2x x (1 )分布的样点

见 Matlab 程序chapter10_ex_5_metropolis.m( 1 )利用 Matlab编程

求解( 2 )利用 Fortran编程求解 见 Fortran 程序

chapter10_ex_5_metropolis.f90