科学计算软件    第二章
This presentation is the property of its rightful owner.
Sponsored Links
1 / 46

科学计算软件 第二章 PowerPoint PPT Presentation


  • 99 Views
  • Uploaded on
  • Presentation posted in: General

科学计算软件 第二章. 基本概念 ( 下). 习题解答. 2.39 Expand[ 表达式 ] : 对表达式进行 代数展开 分别用 = 和 := 将符号 a 与 b 定义成 Expand[(x+1)^3] ,令 x=u+v ,再计算 a 与 b( 体会两者之间的差别) a=Expand[(x+1)^3] b:=Expand[(x+1)^3] ?b x=u+v a b. 习题解答. 2.40 Together :把两个分数组合利用通分组成有公分母的一个分数

Download Presentation

科学计算软件 第二章

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


5909900

科学计算软件 第二章

基本概念 ( 下)


5909900

习题解答

  • 2.39 Expand[表达式]:对表达式进行代数展开

  • 分别用=和:=将符号a与b定义成Expand[(x+1)^3],令x=u+v,再计算a与b(体会两者之间的差别)

    a=Expand[(x+1)^3]

    b:=Expand[(x+1)^3]

    ?b

    x=u+v

    a

    b


5909900

习题解答

  • 2.40 Together:把两个分数组合利用通分组成有公分母的一个分数

  • 分别用=和:=把符号y与z定义成Together[a+b],然后令a=1/x,b=1/(x+1),再计算y与z。

    Clear[a,b,x]

    y=Together[a+b]

    z:=Together[a+b]

    a=1/x;

    b=1/(x+1);

    y

    z


5909900

习题解答

  • 2.41 Simplify[表达式]:尝试简化代数表达式

  • 输入a=Simplify[poly]和b:=Simplify[poly],然后令poly=x2+2x+1,计算a与b的值,并解释结果的差别

    Clear[a,b,x]

    a=Simplify[poly]

    b:=Simplify[poly]

    poly=x^2+2x+1

    a

    b


5909900

2.6 和与积

  • Mathematica中和与积的计算相当简单

  • 任何符号都可以做为求和的指标(在下面的描述中使用的是i)

  • 使用步长increment,指标可以负增长

  • Sum[a[i],{i,imax}]:下标i从1到imax,间隔为1

  • Sum[a[i],{i,imin,imax}]:下标i从imin到imax

  • Sum[a[i],{i,imin,imax,increment}]:下标i从imin到imax,间隔为increment


5909900

2.6 和与积

  • 例46 为了计算前20相邻整数的平方和,输入

    Sum[i^2,{i,1,20}]

  • 先生成列表,再对列表中的数据求和

    st=Table[i^2,{i,1,20}]

    Total[st]


5909900

2.6 和与积

  • 例47 计算和1/15+1/17+1/19+...+1/51

    Sum[1/i,{i,15,51,2}]

  • 注意参与求和的都是有理数形式,结果是精确的!

  • 例48 给出和1/15+1/17+1/19+......+1/51的近似值

    NSum[1/i,{i,15,51,2}]

    Sum[1./i,{i,15,51,2}]


5909900

2.6 和与积

  • 求和限可以是无穷,Mathematica采用复杂的方法计算无穷和。

  • 例49 计算1/1+1/4+1/9+1/16+......

    Sum[1/i^2,{i,1,Infinity}]

  • Mathematica的强项在于符号计算!


5909900

2.6 和与积

  • 二重求和可以利用下述语法得到,也可以更方便地两次点击BasicInput模板上的∑符号实现,同样可以扩展到三重和、四重和甚至更多重和。

  • Sum[a[i,j],{i,imax},{j,jmax}]

  • Sum[a[i,j],{i,imin,imax},{j,jmin,jmax}]

  • Sum[a[i,j],{i,imin,imax,i_increment},{j,jmin,jmax, j_increment}]


5909900

2.6 和与积

  • 例50 计算(1/1+1/2+1/3+1/4)+(2/1+2/2+2/3+2/4)+(3/1+3/2+3/3+3/4)

    Sum[i/j,{i,1,3},{j,1,4}]

  • 在Matlab中,用如下代码实现相同功能

    sm=0

    for i=1:3

    for j=1:4

    sm=sm+i/j

    end

    end

i相当于外层循环变量

j相当于内层循环变量


5909900

2.6 和与积

  • 与Sum的语法类似,Mathematica中用Product计算乘积

  • Product[a[i],{i,imax}]

  • Product[a[i],{i,imin,imax,increment}]

  • 同样可以推广到多重乘积的情况


5909900

2.6 和与积

  • 例51 计算从4到9的相邻整数的乘积

    Product[i,{i,4,9}]


5909900

习题解答

  • 2.45 计算前25个素数的和

    Sum[Prime[k],{k,1,25}]

  • 通项表达式为Prime[k]

  • 2.49 给出从1到n相邻整数平方和的一般公式

    Sum[k^2,{k,1,n}]

  • 注意n是符号(没有赋予数值)


5909900

习题解答

  • 2.52 计算和1+(1+1/2)+(1+1/2+1/3)+...+(1+1/2+1/3+...

    1/20)

    Sum[1/j,{i,1,20},{j,1,i}]

  • 2.53计算(1+1/2)(1+1/2+1/3)…(1+1/2+1/3+…+1/10)的值

    NProduct[Sum[1/j,{j,1,i}],{i,2,10}]


5909900

习题解答

  • (1+1/2)(1+1/2+1/3)…(1+1/2+1/3+…+1/10)

  • 习题2.53的matlab实现

    pro=1;

    for i=1:10

    sm=0;

    for j=1:i

    sm=sm+1/j;

    end

    pro=pro*sm;

    end


5909900

2.7 循环

  • 有时候我们可能需要重复一个操作或一组操作几次,虽然Mathematica提供了利用Sum与Product命令方便地计算和与积的功能,但有时候处理的工作还是需要利用循环的方法

  • Mathematica基本的循环函数

    • Do

    • While

    • For


5909900

Do循环

  • Do[表达式,{k}]:严格地计算表达式k次

  • Do[表达式,{i,imax}]:计算表达式imax次,其中循环变量i的值从1变到imax,每次步长为1

  • Do[表达式,{i,imin,imax}]:i从imin变到imax,步长为1,每次都计算表达式

  • Do[表达式,{i,imin,imax,incerment}]:i从imin变到imax,步长为increment,每次都计算表达式


5909900

Do循环

  • Do[表达式,{i,imin,imax},{j,jmin,jmax},…]

    • 嵌套Do循环

    • 外层循环变量i的值从imin变到imax,步长为1

    • 内层循环变量j的值从jmin变到jmax,步长为1

    • 当j完成一个循环后,i的值增加1,依此类推。

  • Do[表达式,{i,imin,imax,i_increment},{j,jmin, jmax, j_increment},…]形成一个嵌套Do循环,可指定步长

  • 对比Sum的用法可以更好理解Do的语法


5909900

Do循环

  • 例53

    Do[Print["This line will be repeated 5 times."],{5}]

  • 例54 计算从5到25相邻奇数的和

    mysum=0;

    Do[mysum = mysum +k,{k,5,25,2}]

    mysum

  • 注意求和变量要初始化!


5909900

Do循环

  • 例55 计算所有分子与分母为不超过5的正整数的分数之和

    fracsum =0;

    Do[fracsum = fracsum+i/j,{i,1,5},{j,1,5}]

    for i=1:5 (*matlab用法*)

    for j=1:5

    fracsum = fracsum+i/j

    end

    end


While

While循环

  • While[条件,表达式]:先计算条件,成立时再计算表达式,重复这个过程直到条件的值为False。

  • 注意:循环一定要有退出机制

  • 如果表达式由多个语句组成,则其间用分号隔开

  • 例 56

    n=1;While[n<6,Print[n];n=n+1]


5909900

For循环

  • For[初始化,检测条件,增量,表达式]:执行初始化语句,然后重复计算表达式与增量,直到检测条件的值为False。

    • 计算顺序:检测条件->表达式->增量

    • 检测条件的值为False,For循环就结束

    • 如果初始化、检测条件,增量和表达式中有的由多个语句组成的,那么用分号分开相邻语句。

  • 例57

    For[i=1,i<=5,i=i+1,Print[i]]


5909900

条件判断语句:If

  • If[条件,真,假]:带有T、F分支的if语句

  • If[条件,真]:只有T分支而没有Else分支的if语句

  • If[条件, ,假]:条件为假时执行假语句,为真时无操作,即只有F分支的if语句

  • If[条件,真,假,空]:三值逻辑分支的if语句,可指定空语句


5909900

三值逻辑

  • 维基百科

  • 三元(ternary)、三值(three-valued)或三价(trivalent)逻辑是描述有指示真、假和某个第三值的三个逻辑值的任何多值逻辑系统的术语。

  • 这相对于更常见的只提供真与假的二值逻辑(比如布尔逻辑)。


5909900

三值逻辑运算表


5909900

在数据库应用中的三值逻辑

  • 数据库查询语言 SQL 实现三值逻辑作为处理 NULL字段内容的一种方式。

  • SQL 使用 NULL 来表示在数据库中缺失数据。如果一个字段不包含定义的值,对于 SQL 这意味着实际的值存在,但是这个值当前没有记录在数据库中。

  • 注意缺失的值不同于数值零或零长度字符串值:这两者都表示已知的值。

  • 比较任何东西于 NULL—即使是另一个 NULL—结果是 UNKNOWN


5909900

条件判断语句:If

  • 例58

    If[2==2,Print["a"],Print["b"]]

    If[2==3,Print["a"],Print["b"]]

    If[7,Print["a"],Print["b"],Print["c"]]

  • 对比:在matlab中,非零值在判断中表示真

  • 严格地,条件应该为一个逻辑表达式,对于结果不是逻辑值的表达式,系统应有特别的设计


5909900

条件判断语句:If

  • 例 59 将素数与非素数分开

    Do[If[PrimeQ[k],Print[k],Print[" ",k]],{k,1,20}]

  • PrimeQ[k]返回关于k是否是素数的逻辑判断

    • 为真,输出k

    • 为假,在k前加上空格


5909900

习题解答

  • 2.54 用Do循环计算10!fact = 1;Do[fact = fact*k, {k, 10}]fact

  • 注意循环次数是确定的


5909900

习题解答

  • 2.55 用While循环计算10!Clear[fact];fact = 1;n = 1;While[n < 11, fact = fact*n; n = n + 1]fact

  • 循环次数通过条件语句控制,循环变量的初始化在While外部


5909900

习题解答

  • 2.56 用For循环计算10!Clear[fact];fact = 1;For[n = 1, n < 11, n = n + 1, fact = fact*n]fact

  • 循环变量的初始化在For语句内部


5909900

2.9 用户定义的函数

  • 2.9 用户定义的函数

  • 假设希望定义一个单变量函数f,以x为变量,可以书写为 f[x_ ]= ……,或者 f[x_ ]:= ……

  • 其中右边的定义告诉Mathematica当给定x的值时,如何计算f的值,在定义中可以使用任意合法的Mathematica运算,以及引用内置函数。


5909900

2.9 用户定义的函数

  • 例62 定义分段函数

  • f[x_]: 表达式/;条件

    f[x_ ]:=x^2/;x<=2

    f[x_ ]:=8-2x/;x>2

    f[-4]

    f[4]

    Plot[f[x],{x,0,4}]


5909900

2.9 用户定义的函数

  • 例 63 Fibonacci 数列是通过递归来定义的,即令f(1)=1,f(2)=1,对于n≥3,f(n)=f(n-2)+f(n-1)。利用这个定义计算第25个Fibonacci数

    f[1]=1;

    f[2]=1;

    f[n_]:=f[n-2]+ f[n-1]

    f[25]


5909900

2.9 用户定义的函数

  • 多变量函数的定义

  • 例65

    f[x_,y_]=x^2+y^2

    f[2,3]

  • 例 66

    g[x_,y_,z_]=x+y+z

    g[2,3,4]


5909900

2.10 函数的运算

  • 若f、g为两个具有相同定义域D的函数,则可以逐点定义它们的和、差、积、商

  • (f+g)(x)=f(x)+g(x)对D中的所有x

  • (f-g)(x)=f(x)-g(x)对D中的所有x

  • (fg)(x)=f(x)g(x)对D中的所有x

  • (f/g)(x)=f(x)/g(x) 对所有满足g(x)!=0的x


5909900

2.10 函数的运算

  • 如果x在g的定义域内,而g(x)在f的定义域内,则可以定义函数的复合f◦g:

    • f◦g(x)=f(g(x))


5909900

2.10 函数的运算

  • 例67 函数的运算

    f[x_]=Sqrt[x];

    g[x_]=x^2+2x+3;

    h1[x_]=f[x]+g[x]

    h2[x_]=f[x]-g[x]

    h3[x_]=f[x]g[x]

    h4[x_]=f[x]/g[x]

    h5[x_]=f[g[x]]

    h6[x_]=g[f[x]]


5909900

2.10 函数的运算

  • Composition[f1,f2,f3,...]:构造复合函数f1◦f2◦f3◦...

  • 例68

    f[x_]=Sqrt[x];

    g[x_]=x^2+2x+3;

    h1=Composition[f,g]

    h2=Composition[g,f]

  • 注意Composition是一个函数运算,因此它的参数必须是函数f,而不是f[x]


5909900

2.10 函数的运算

  • 函数与自身的复合

  • Nest[f,表达式,n]:重复应用f到表达式上n次

  • NestList[f,表达式,n]:重复应用f到表达式上n次,并返回一个由所有中间计算结果组成的列表

  • 例69

    f[x_]=x^2;

    Nest[f,x,5]

    NestList[f,x,5]

    Nest[f,2x+3,5]

    NestList[f,2x+3,5]


5909900

2.10 函数的运算

  • 函数与自身的复合

  • Nest[f,表达式,n]:重复应用f到表达式上n次

  • NestList[f,表达式,n]:重复应用f到表达式上n次,并返回一个由所有中间计算结果组成的列表

  • 实验一中Sin函数的复合

    f[x_]=Sin[x]

    Nest[f,1,500]


5909900

2.11 模块

  • 缺省情况下,Mathematica假定所有的对象(例如变量)都是全局性的:如果定义了变量x,其值为3,那么x的值一直为3,除非进行了修改

  • 局部对象只有在一组特定指令内才有作用。

  • 通过模块可以定义局部变量,局部变量只在模块内有定义,在模块外面,对象可能就没有定义,或者具有完全不同的值。


5909900

2.11 模块

  • Module[{变量1,变量2,…},主体]定义拥有局部变量变量1,变量2,…的模块。

  • Module[{变量1=值1,变量2=值2,…},主体]定义拥有局部变量变量1,变量2,…的模块,并且这里每个变量具有指定的初始值。

  • 例70

    x=3

    Module[{x=8},x+1]


5909900

2.11 模块

  • 例71

    Module[{x=1,y=2},x=x+3;y=y+4;Print[x y]]


5909900

2.11 模块

  • 例72 下面的语句定义了阶乘函数,这里假定x0的值为非负整数,变量fact与x分别被初始化为1和x0,都是局部变量,因此与程序中其他地方的同名变量不会发生冲突,这里x0为哑变量。

  • 注意此时必须使用延时赋值符号:=

    f[x0_]:=Module[{fact=1,x=x0},While[x>1,fact=x*fact;x=x-1];Print[fact]]

    f[0]

    f[5]

    f[10]


5909900

2.11 模块

  • 例73

    x=3

    Module[{x},Print[x]]

    Module[{x},Print[x]]

    Module[{x},Print[x]]

    x


  • Login