1 / 46

科学计算软件 第二章

科学计算软件 第二章. 基本概念 ( 下). 习题解答. 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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 科学计算软件 第二章 基本概念 ( 下)

  2. 习题解答 • 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

  3. 习题解答 • 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

  4. 习题解答 • 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

  5. 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

  6. 2.6 和与积 • 例46 为了计算前20相邻整数的平方和,输入 Sum[i^2,{i,1,20}] • 先生成列表,再对列表中的数据求和 st=Table[i^2,{i,1,20}] Total[st]

  7. 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}]

  8. 2.6 和与积 • 求和限可以是无穷,Mathematica采用复杂的方法计算无穷和。 • 例49 计算1/1+1/4+1/9+1/16+...... Sum[1/i^2,{i,1,Infinity}] • Mathematica的强项在于符号计算!

  9. 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}]

  10. 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相当于内层循环变量

  11. 2.6 和与积 • 与Sum的语法类似,Mathematica中用Product计算乘积 • Product[a[i],{i,imax}] • Product[a[i],{i,imin,imax,increment}] • 同样可以推广到多重乘积的情况

  12. 2.6 和与积 • 例51 计算从4到9的相邻整数的乘积 Product[i,{i,4,9}]

  13. 习题解答 • 2.45 计算前25个素数的和 Sum[Prime[k],{k,1,25}] • 通项表达式为Prime[k] • 2.49 给出从1到n相邻整数平方和的一般公式 Sum[k^2,{k,1,n}] • 注意n是符号(没有赋予数值)

  14. 习题解答 • 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}]

  15. 习题解答 • (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

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

  17. 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,每次都计算表达式

  18. 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的语法

  19. 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 • 注意求和变量要初始化!

  20. 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

  21. While循环 • While[条件,表达式]:先计算条件,成立时再计算表达式,重复这个过程直到条件的值为False。 • 注意:循环一定要有退出机制 • 如果表达式由多个语句组成,则其间用分号隔开 • 例 56 n=1;While[n<6,Print[n];n=n+1]

  22. For循环 • For[初始化,检测条件,增量,表达式]:执行初始化语句,然后重复计算表达式与增量,直到检测条件的值为False。 • 计算顺序:检测条件->表达式->增量 • 检测条件的值为False,For循环就结束 • 如果初始化、检测条件,增量和表达式中有的由多个语句组成的,那么用分号分开相邻语句。 • 例57 For[i=1,i<=5,i=i+1,Print[i]]

  23. 条件判断语句:If • If[条件,真,假]:带有T、F分支的if语句 • If[条件,真]:只有T分支而没有Else分支的if语句 • If[条件, ,假]:条件为假时执行假语句,为真时无操作,即只有F分支的if语句 • If[条件,真,假,空]:三值逻辑分支的if语句,可指定空语句

  24. 三值逻辑 • 维基百科 • 三元(ternary)、三值(three-valued)或三价(trivalent)逻辑是描述有指示真、假和某个第三值的三个逻辑值的任何多值逻辑系统的术语。 • 这相对于更常见的只提供真与假的二值逻辑(比如布尔逻辑)。

  25. 三值逻辑运算表

  26. 在数据库应用中的三值逻辑 • 数据库查询语言 SQL 实现三值逻辑作为处理 NULL字段内容的一种方式。 • SQL 使用 NULL 来表示在数据库中缺失数据。如果一个字段不包含定义的值,对于 SQL 这意味着实际的值存在,但是这个值当前没有记录在数据库中。 • 注意缺失的值不同于数值零或零长度字符串值:这两者都表示已知的值。 • 比较任何东西于 NULL—即使是另一个 NULL—结果是 UNKNOWN

  27. 条件判断语句: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中,非零值在判断中表示真 • 严格地,条件应该为一个逻辑表达式,对于结果不是逻辑值的表达式,系统应有特别的设计

  28. 条件判断语句:If • 例 59 将素数与非素数分开 Do[If[PrimeQ[k],Print[k],Print[" ",k]],{k,1,20}] • PrimeQ[k]返回关于k是否是素数的逻辑判断 • 为真,输出k • 为假,在k前加上空格

  29. 习题解答 • 2.54 用Do循环计算10!fact = 1;Do[fact = fact*k, {k, 10}]fact • 注意循环次数是确定的

  30. 习题解答 • 2.55 用While循环计算10!Clear[fact];fact = 1;n = 1;While[n < 11, fact = fact*n; n = n + 1]fact • 循环次数通过条件语句控制,循环变量的初始化在While外部

  31. 习题解答 • 2.56 用For循环计算10!Clear[fact];fact = 1;For[n = 1, n < 11, n = n + 1, fact = fact*n]fact • 循环变量的初始化在For语句内部

  32. 2.9 用户定义的函数 • 2.9 用户定义的函数 • 假设希望定义一个单变量函数f,以x为变量,可以书写为 f[x_ ]= ……,或者 f[x_ ]:= …… • 其中右边的定义告诉Mathematica当给定x的值时,如何计算f的值,在定义中可以使用任意合法的Mathematica运算,以及引用内置函数。

  33. 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}]

  34. 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]

  35. 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]

  36. 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

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

  38. 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]]

  39. 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]

  40. 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]

  41. 2.10 函数的运算 • 函数与自身的复合 • Nest[f,表达式,n]:重复应用f到表达式上n次 • NestList[f,表达式,n]:重复应用f到表达式上n次,并返回一个由所有中间计算结果组成的列表 • 实验一中Sin函数的复合 f[x_]=Sin[x] Nest[f,1,500]

  42. 2.11 模块 • 缺省情况下,Mathematica假定所有的对象(例如变量)都是全局性的:如果定义了变量x,其值为3,那么x的值一直为3,除非进行了修改 • 局部对象只有在一组特定指令内才有作用。 • 通过模块可以定义局部变量,局部变量只在模块内有定义,在模块外面,对象可能就没有定义,或者具有完全不同的值。

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

  44. 2.11 模块 • 例71 Module[{x=1,y=2},x=x+3;y=y+4;Print[x y]]

  45. 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]

  46. 2.11 模块 • 例73 x=3 Module[{x},Print[x]] Module[{x},Print[x]] Module[{x},Print[x]] x

More Related