460 likes | 644 Views
科学计算软件 第二章. 基本概念 ( 下). 习题解答. 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 :把两个分数组合利用通分组成有公分母的一个分数
E N D
科学计算软件 第二章 基本概念 ( 下)
习题解答 • 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:把两个分数组合利用通分组成有公分母的一个分数 • 分别用=和:=把符号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
习题解答 • 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
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
2.6 和与积 • 例46 为了计算前20相邻整数的平方和,输入 Sum[i^2,{i,1,20}] • 先生成列表,再对列表中的数据求和 st=Table[i^2,{i,1,20}] Total[st]
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}]
2.6 和与积 • 求和限可以是无穷,Mathematica采用复杂的方法计算无穷和。 • 例49 计算1/1+1/4+1/9+1/16+...... Sum[1/i^2,{i,1,Infinity}] • Mathematica的强项在于符号计算!
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}]
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相当于内层循环变量
2.6 和与积 • 与Sum的语法类似,Mathematica中用Product计算乘积 • Product[a[i],{i,imax}] • Product[a[i],{i,imin,imax,increment}] • 同样可以推广到多重乘积的情况
2.6 和与积 • 例51 计算从4到9的相邻整数的乘积 Product[i,{i,4,9}]
习题解答 • 2.45 计算前25个素数的和 Sum[Prime[k],{k,1,25}] • 通项表达式为Prime[k] • 2.49 给出从1到n相邻整数平方和的一般公式 Sum[k^2,{k,1,n}] • 注意n是符号(没有赋予数值)
习题解答 • 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}]
习题解答 • (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
2.7 循环 • 有时候我们可能需要重复一个操作或一组操作几次,虽然Mathematica提供了利用Sum与Product命令方便地计算和与积的功能,但有时候处理的工作还是需要利用循环的方法 • Mathematica基本的循环函数 • Do • While • For
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,每次都计算表达式
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的语法
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 • 注意求和变量要初始化!
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[条件,表达式]:先计算条件,成立时再计算表达式,重复这个过程直到条件的值为False。 • 注意:循环一定要有退出机制 • 如果表达式由多个语句组成,则其间用分号隔开 • 例 56 n=1;While[n<6,Print[n];n=n+1]
For循环 • For[初始化,检测条件,增量,表达式]:执行初始化语句,然后重复计算表达式与增量,直到检测条件的值为False。 • 计算顺序:检测条件->表达式->增量 • 检测条件的值为False,For循环就结束 • 如果初始化、检测条件,增量和表达式中有的由多个语句组成的,那么用分号分开相邻语句。 • 例57 For[i=1,i<=5,i=i+1,Print[i]]
条件判断语句:If • If[条件,真,假]:带有T、F分支的if语句 • If[条件,真]:只有T分支而没有Else分支的if语句 • If[条件, ,假]:条件为假时执行假语句,为真时无操作,即只有F分支的if语句 • If[条件,真,假,空]:三值逻辑分支的if语句,可指定空语句
三值逻辑 • 维基百科 • 三元(ternary)、三值(three-valued)或三价(trivalent)逻辑是描述有指示真、假和某个第三值的三个逻辑值的任何多值逻辑系统的术语。 • 这相对于更常见的只提供真与假的二值逻辑(比如布尔逻辑)。
在数据库应用中的三值逻辑 • 数据库查询语言 SQL 实现三值逻辑作为处理 NULL字段内容的一种方式。 • SQL 使用 NULL 来表示在数据库中缺失数据。如果一个字段不包含定义的值,对于 SQL 这意味着实际的值存在,但是这个值当前没有记录在数据库中。 • 注意缺失的值不同于数值零或零长度字符串值:这两者都表示已知的值。 • 比较任何东西于 NULL—即使是另一个 NULL—结果是 UNKNOWN
条件判断语句: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中,非零值在判断中表示真 • 严格地,条件应该为一个逻辑表达式,对于结果不是逻辑值的表达式,系统应有特别的设计
条件判断语句:If • 例 59 将素数与非素数分开 Do[If[PrimeQ[k],Print[k],Print[" ",k]],{k,1,20}] • PrimeQ[k]返回关于k是否是素数的逻辑判断 • 为真,输出k • 为假,在k前加上空格
习题解答 • 2.54 用Do循环计算10!fact = 1;Do[fact = fact*k, {k, 10}]fact • 注意循环次数是确定的
习题解答 • 2.55 用While循环计算10!Clear[fact];fact = 1;n = 1;While[n < 11, fact = fact*n; n = n + 1]fact • 循环次数通过条件语句控制,循环变量的初始化在While外部
习题解答 • 2.56 用For循环计算10!Clear[fact];fact = 1;For[n = 1, n < 11, n = n + 1, fact = fact*n]fact • 循环变量的初始化在For语句内部
2.9 用户定义的函数 • 2.9 用户定义的函数 • 假设希望定义一个单变量函数f,以x为变量,可以书写为 f[x_ ]= ……,或者 f[x_ ]:= …… • 其中右边的定义告诉Mathematica当给定x的值时,如何计算f的值,在定义中可以使用任意合法的Mathematica运算,以及引用内置函数。
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}]
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]
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]
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
2.10 函数的运算 • 如果x在g的定义域内,而g(x)在f的定义域内,则可以定义函数的复合f◦g: • f◦g(x)=f(g(x))
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]]
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]
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]
2.10 函数的运算 • 函数与自身的复合 • Nest[f,表达式,n]:重复应用f到表达式上n次 • NestList[f,表达式,n]:重复应用f到表达式上n次,并返回一个由所有中间计算结果组成的列表 • 实验一中Sin函数的复合 f[x_]=Sin[x] Nest[f,1,500]
2.11 模块 • 缺省情况下,Mathematica假定所有的对象(例如变量)都是全局性的:如果定义了变量x,其值为3,那么x的值一直为3,除非进行了修改 • 局部对象只有在一组特定指令内才有作用。 • 通过模块可以定义局部变量,局部变量只在模块内有定义,在模块外面,对象可能就没有定义,或者具有完全不同的值。
2.11 模块 • Module[{变量1,变量2,…},主体]定义拥有局部变量变量1,变量2,…的模块。 • Module[{变量1=值1,变量2=值2,…},主体]定义拥有局部变量变量1,变量2,…的模块,并且这里每个变量具有指定的初始值。 • 例70 x=3 Module[{x=8},x+1]
2.11 模块 • 例71 Module[{x=1,y=2},x=x+3;y=y+4;Print[x y]]
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]
2.11 模块 • 例73 x=3 Module[{x},Print[x]] Module[{x},Print[x]] Module[{x},Print[x]] x