




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六章3Re程序設(shè)計(jì)
前面,我們使用的是Maple的交互式命令環(huán)境.所謂交互式
命令環(huán)境,就是一次輸入一條或幾條命令,然后按回車,這些命
令就被執(zhí)行了,執(zhí)行的結(jié)果顯示在同一個(gè)可執(zhí)行塊中.對(duì)于大
多數(shù)用戶來(lái)說(shuō),利用交互式命令環(huán)境解決問(wèn)題已經(jīng)足夠了,但
如果要解決一系列同一類型的問(wèn)題或者希望利用Maple編寫(xiě)需
要的解決特定問(wèn)題的函數(shù)和程序,以期更加充分地利用Maple
的強(qiáng)大功能,提高大規(guī)模問(wèn)題的計(jì)算效率,掌握一定的程序設(shè)
計(jì)是必要的.幸運(yùn)的是,Maple自身提供了一套編程工具,即
Maple語(yǔ)言.Maple語(yǔ)言實(shí)際上是由Maple各種命令以及一些
簡(jiǎn)單的過(guò)程控制語(yǔ)句組成的.
1編程基礎(chǔ)
1.1算子
所謂算子,是從一個(gè)抽象空間到另一個(gè)抽象空間的函數(shù).
在數(shù)學(xué)上算子的含義通常是函數(shù)到函數(shù)的映射.在Maple中,
算子常用“箭頭”記號(hào)定義(也稱箭頭操作符):
>f:=x->a*x*exp(x);
f:=xaxeA
>g:=(x,y)->a*x*y*exp(xA2+yA2);
22
(x+y)
g:=(")-"X"
另外,函數(shù)unapply也可以從表達(dá)式建立算子:
>unapply(xA2+1,x);
X->%2+1
>unapply(xA2+yA2,x,y);
(x,y)-x2+y2
當(dāng)我們依次把算子f作用到參數(shù)。,a,xt+a時(shí)即可得平常
意義上的函數(shù)值:
>f:=t->t*sin(t);
/:=r—>/sin(t)
>f(0);
I
>f(a);
asin(〃)
>f(xA2+a);
(x2+〃)sin(x2+〃)
上述結(jié)果是函數(shù)作用的例子.而最后一個(gè)結(jié)果(x2+6t)sin(x2+a)
實(shí)際上是算子f與算子g:=t->t^2+a復(fù)合后再作用到參數(shù)x的
結(jié)果.
從數(shù)學(xué)上講,作用與復(fù)合是不同的,它們產(chǎn)生的結(jié)果是有區(qū)
別的,但在使用它們時(shí),兩者還是有些重疊的.在Maple中,可
以依賴于語(yǔ)法把它們區(qū)分開(kāi):
(1)當(dāng)復(fù)合兩個(gè)算子時(shí),結(jié)果仍是算子,兩個(gè)算子的定義域必
須是相容的;
(2)當(dāng)把一個(gè)算子作用于一個(gè)參數(shù)(參數(shù)必須在算子的定義域
中)時(shí),結(jié)果是一個(gè)表達(dá)式;
⑶在Maple中,函數(shù)作用的語(yǔ)法是使用括號(hào)(),如函數(shù)f作
用到參數(shù)u寫(xiě)作f(u).而復(fù)合算子的符號(hào)是@,多重復(fù)合時(shí)
使用符號(hào)@@.
通過(guò)進(jìn)一步的例子可以清楚區(qū)分作用與復(fù)合的功能:/和g
復(fù)合的結(jié)果是算子/。g:=,-/(g(。),而把這個(gè)算子作用到參
數(shù)x得到表達(dá)式@(刈.例如,
f=t1sin"+(p),g=mexp(w),貝。g:=^—sin(exp(z)+⑼
是一個(gè)算子,而/(g(,)=sin(exp(x)+0)是一個(gè)表達(dá)式,因?yàn)閤是
一個(gè)實(shí)數(shù).試比較下述兩例:
>D(g@f);
((D(g))@f)D(/)
>D(g*h);
D(g)/?+gD(/z)
另外一個(gè)應(yīng)引起注意的問(wèn)題是算子(函數(shù))與表達(dá)式的異同,
在第一章2.2.2中曾探討過(guò)函數(shù)與表達(dá)式的區(qū)別,這里再通過(guò)
幾個(gè)例子說(shuō)明其中的微妙差異:
>fl:=xA2+l;
>f2:=yA2+l;
fl:=x2+1
,f2:=V+1
>f3:=fl+f2;
f3:=依+2+,2
再看下面的例子:
>gl:=x->xA2+l;
>g2:=y->yA2+l;
gl:=x—>x2+1
g2:=yfV+i
>g3:=gl+g2;
g3:=gl+g2
與前面例子不同的是,兩個(gè)算子(函數(shù))gl,g2相加的結(jié)果
依然是函數(shù)名g3,出現(xiàn)這個(gè)問(wèn)題的主要原因是gl與g2分別為
x,y的函數(shù),Maple認(rèn)為它們的定義域不相容.要得到與前例
的結(jié)果,只需稍作改動(dòng):
>g3:=gl(x)+g2(y);
g3:=x24-24-y2
下面的例子想說(shuō)明生成Maple函數(shù)的兩種方式“箭頭操作
符”及“unapply”之間微妙的差異:
>x:='x':a:=l:b:=2:c:=3:
>a*xA2+b*x+c;
x2+2x+3
>f:=unapply(a*xA2+b*x+c,x);
/:=x-?x2+2x4-3
>g:=x->a*xA2+b*x+c;
g:=x—>ax2+bx+c
由此可見(jiàn),f中的a,b,c已經(jīng)作了代換,而g中則顯含a,b,c。
再看下面實(shí)驗(yàn):
>f(x);g(x);
X?+2x+3
產(chǎn)+2x+3
f與g兩者相同,再對(duì)其微分:
>D(f);D(g);
x-2x+2
x—>2ax4-Z?
再改變常數(shù)C的值,觀察f與g的變化:
>c:=15;
c:=15
>f(x);g(x);
X24-2X4-3
x2+2x+15
由此可見(jiàn),在利用Maple進(jìn)行函數(shù)研究時(shí),對(duì)同一問(wèn)題應(yīng)
該用不同方法加以校驗(yàn),而這一切的支撐是數(shù)學(xué)基礎(chǔ)!
1.2編程初體驗(yàn)
利用算子可以生成最簡(jiǎn)單的函數(shù)一單個(gè)語(yǔ)句的函數(shù),但嚴(yán)
格意義上講它并非程序設(shè)計(jì),它所生成的數(shù)據(jù)對(duì)象是子程序.
所謂子程序,簡(jiǎn)單地說(shuō),就是一組預(yù)先編好的函數(shù)命令,我們由
下面的簡(jiǎn)單程序來(lái)看看Maple程序的結(jié)構(gòu):
>plus:=proc(x,y)
x+y;
end;
這個(gè)程序只有2個(gè)參數(shù),在程序內(nèi)部它的名稱是x,y,這是
Maple最簡(jiǎn)單的程序結(jié)構(gòu),僅僅在proc()和end中間加上在計(jì)
算中需要的一條或者多條命令即可,Maple會(huì)把最后一個(gè)語(yǔ)句
的結(jié)果作為整個(gè)子程序的返回結(jié)果,這一點(diǎn)需要引起注意.再
看下例:
>P:=proc(x,y)
x-y;
x*y;
x+y;
end:
>P(3,4);
顯然,盡管程序P有三條計(jì)算命令,但返回的只是最后一個(gè)
語(yǔ)句x+y;的結(jié)果.要想輸出所有的計(jì)算結(jié)果,需要在程序中增
加print語(yǔ)句:
>P:=proc(x,y)
print(x-y);
print(x*y);
print(x+y);
end:
>P(3,4);
再看下面幾個(gè)例子:
>forifrom2to6do
expand((x+y)Ai);
.K+Zxy+V
/+3,y+3xy2+y3
x4+4y+6x2/+4x/+了4
x5+5x4y+10x3y2+10x2y3+5xy4+y5
x6H-6x5y+15x4y2+20x3y3+15x2y4-F6xy54-y6
>F:=proc(n::integer)
ifnmod12=0thentrue
elsefalse
I
end:
>F(123A123),F(1234567890A9);
false,true
從上面幾個(gè)簡(jiǎn)單的例子可以看出Maple子程序主要包含以
下一些內(nèi)容:
⑴把定義的子程序賦值給程序名procname,以后就可以
用子程序名procname來(lái)調(diào)用程序;
(ii)子程序一律以pro”)開(kāi)頭,括號(hào)里是程序的輸入?yún)?shù),
如果括號(hào)中什么都沒(méi)有,表示這個(gè)子程序沒(méi)有任何輸入?yún)?shù);
(iii)子程序中的每一個(gè)語(yǔ)句都用分號(hào)(或冒號(hào))分開(kāi)(這一點(diǎn)
不是主要的,程序設(shè)計(jì)時(shí),在可能的時(shí)候一過(guò)程當(dāng)中的最后一
個(gè)語(yǔ)句、for-循環(huán)、if語(yǔ)句中的最后一個(gè)語(yǔ)句省略終結(jié)標(biāo)點(diǎn)也是
允許的,這并不是為了懶惰,而是因?yàn)樵诮K結(jié)語(yǔ)句后面插入一
個(gè)語(yǔ)句產(chǎn)生的影響要比僅僅執(zhí)行一個(gè)新語(yǔ)句產(chǎn)生的影響大);
(iv)在定義完子程序之后,Maple會(huì)顯示它對(duì)該子程序的
解釋(除非在end后用冒號(hào)結(jié)束),它的解釋和你的定義是等價(jià)
的,但形式上不一定完全相同;
(v)Maple會(huì)自動(dòng)地把除了參數(shù)以外的變量都作為局部變量
(localvariable),這就是說(shuō),它們僅僅在這個(gè)子程序的定義中
有效,和子程序以外的任何同名變量無(wú)關(guān).
在定義了一個(gè)子程序以后,執(zhí)行它的方法和執(zhí)行任何Maple
系統(tǒng)子程序一樣一程序名再加上一對(duì)圓括號(hào)(),括號(hào)中包含要
調(diào)用的參數(shù),如果子程序沒(méi)有參數(shù),括號(hào)也是不能省略的.
除了上面給出的程序設(shè)計(jì)方法外,在Maple中還可以直接由
(箭頭)生成程序,如下例:
>f:=x->ifx>0thenxelse-xfi;
/:=proc(x)optionoperator,arrow;if0<xthenxelse-xendifendproc
>f(-5),f⑸;
5,5
甚至于程序名也可以省略,這種情況通常會(huì)在使用函數(shù)
map時(shí)遇到:
>map(x->ifx>0thenxelse-xfi,[-4,-3,-2,0,1]);
[4,3,2,0,1]
如果需要察看一個(gè)已經(jīng)定義好的子程序的過(guò)程,用eval命令,
查看Maple中源程序(如factor函數(shù))使用下述組合命令:
interface(verboseproc=2);
print(factor);
再看一個(gè)更為有用的簡(jiǎn)單程序:代數(shù)方程的參數(shù)解。該程
序在代數(shù)方程f(x,y)=。求解中使用了一個(gè)巧妙的代換丫=飲得到
了方程的參數(shù)解,它的主要用途是用來(lái)畫(huà)圖、求積分、求微分和
求級(jí)數(shù).程序如下:
>parsolve:=proc(f,xy::{list(name),set(name)},t::name)
localp,x,y;
p:={solve(subs(y=t*x,f),x)}minus{0};
map((xi,u,xx,yy)->{xx=xi,yy=u*xi},p,t,x,y)
end:
調(diào)用該程序可以方便求解:
>parsolve(uA2+vA2=aA2,[u,v],t);
..a_ta_ata
VV
{{〃-/2,~/2},/2,~/2}}
J1+廣v1+rJ1+*J1+廣
>f:=randpoly([x,y],degree=3,sparse);
了:=-53x+85xy+49y2+78爐+17x產(chǎn)+72y3
>parsolve(f,[x,y],t);
1Li-19+85i+72401/4+23594+10829r+16536)_1一49產(chǎn)一85i-,24011+23594/'+10829/+16536
*72/3+78+17t2'A=272Z3+78+17r2一
1-49產(chǎn)-85f+12401/+23594戶+10829/+力536
X=272r34-78+17r2,
_1/(-49戶-851-,2401-+23593+10829產(chǎn)+16536)
-V=272Z3+78+17t2-
1.3局部變量和全局變量
Maple中的全局變量,是指那些在交互式命令環(huán)境中定義和
使用的變量,前面所使用的變量幾乎都屬于全局變量.而在編
寫(xiě)子程序時(shí),需要定義一些只在子程序內(nèi)部使用的變量,稱其
為局部變量.當(dāng)Maple執(zhí)行子程序時(shí),所有和局部變量同名的
全局變量都保持不變,而不管在子程序中給局部變量賦予了何
值.如果要把局部變量定義為全局變量,需要用關(guān)鍵詞global
在程序最開(kāi)始加以聲明,而局部變量則用local聲明,雖然這是
不必要的,但在程序設(shè)計(jì)時(shí),聲明變量是有一定好處的.
下面通過(guò)實(shí)例演示局部變量與全局變量的不同.為了更清楚
地觀察子程序?qū)θ肿兞康挠绊?,在子程序外先設(shè)定一個(gè)變量
a的值:
>a:=l;
a:=1
>f:=proc()
locala;
a:=12345678/4321;
evalf(a/2);
end;
>f();
1428.567230
>a;
>g:=proc()
globala;
a:=12345678/4321;
evalf(a/2);
>g();
1428.567230
>a;
12345678
4321
顯然,在前一個(gè)程序中,由于在子程序外已經(jīng)賦值給a,a是全
局變量,它的值不受子程序中同名局部變量的影響;而在后一個(gè)
子程序中,由于重新把a(bǔ)定義為全局變量,所以子程序外的a隨
著子程序中的a值的變化而變化.
子程序中的輸入?yún)?shù),它既不是全局的,也不是局部的.在子
程序內(nèi)部,它是形式參數(shù),也就是說(shuō),它的具體取值尚未被確定,
它在程序調(diào)用時(shí)會(huì)被替換成真正的參數(shù)值.而在子程序外部,
它們僅僅表示子程序接受的參數(shù)的多少,而對(duì)于具體的參數(shù),rn
沒(méi)有關(guān)系.
1.4變量nargs,args與procname
在所有程序中都有三個(gè)有用的變量:nargs,args與
procname.前兩個(gè)給出關(guān)于調(diào)用參量的信息:nargs變量是調(diào)
用的實(shí)際參量的個(gè)數(shù),args變量是包含參量的表達(dá)式序列,args
的子序列通過(guò)范圍或數(shù)字的參量選取.例如,第i個(gè)參量被調(diào)用
的格式為:args[i].nargs,args變量通常在含有可選擇參量的
程序中使用.下面看一個(gè)例子:
>p:=proc()
locali;
RETURN(nargs,[seq(iA3,i=args)])
endproc:
>p(l,2,3,4,5,6,7,8,9,10);
10,[1,8,27,64,125,216,343,512,729,1000]
該程序利用Maple函數(shù)RETURN返回了輸入?yún)⒘康膫€(gè)數(shù)以
及參量序列的立方列表,RETURN函數(shù)使用時(shí)必須在其后加圓
括號(hào),即使無(wú)結(jié)果返回時(shí)也得如此。下面是一個(gè)關(guān)于求任意序
列最大值的復(fù)雜程序:
>maximum:=proc()
localr,i;
r:=args[l];
forifrom2tonargsdo
ifargs[i]>rthenr:=args[i]
endif
enddo;
r;
endproc:
>maximum(12A4,5A7,69A3,10A4+4.9*1000);
328509
如果變量procname(程序被調(diào)用的名字)存在的話,它可以用
來(lái)直接訪問(wèn)該程序,通常用procname(args)完成調(diào)用:
>f:=proc(a)
ifa>0thenRETURN(aA(l/2))
elseRETURN(*procname(args)1)
endif
endproc:
>f(100-3A6),f(10A2+90-9*4);
f(-629),vl54
2基本程序結(jié)構(gòu)
所有的高級(jí)程序設(shè)計(jì)語(yǔ)言都具有程序結(jié)構(gòu),因?yàn)闉榱送瓿梢?/p>
項(xiàng)復(fù)雜的任務(wù),僅僅按照語(yǔ)句順序依次執(zhí)行是遠(yuǎn)遠(yuǎn)不夠的,更
需要程序在特定的地方能夠跳轉(zhuǎn)、分叉、循環(huán),……,與此同時(shí),
程序結(jié)構(gòu)就產(chǎn)生了.
2.1for循環(huán)
在程序設(shè)計(jì)中,常常需要把相同或者類似的語(yǔ)句連續(xù)執(zhí)行多
次,此時(shí),通過(guò)for循環(huán)結(jié)構(gòu)可以更便捷地編寫(xiě)程序.試看下面
幾個(gè)例子:
①求1至5自然數(shù)的和:
>total:=0:
forifrom1to5do
total:=total+i:
total:=1
total:=3
total:=6
total:=10
total:=15
②列示2,4,6,8,1。及其平方數(shù)、立方數(shù):
>forifrom2to10by2do
'i八2'=2八i,'i八3'=i八3;
d;
j=2,*=4,,3=8
i=4,i2=16,戶=64
i=6,產(chǎn)=64,Z3=216
1=8,=256/3=512
i=10,i2=1024,i3=1000
③列示第100到第108個(gè)素?cái)?shù)(第1個(gè)素?cái)?shù)是2):
>forjfrom100to108do
prime[j]=ithprime(j);
od;
prime1()()=541
prime1()|=547
primeJf)2=557
prime](H=563
prime|()4=569
prime]().=571
prime|()6=577
prime1(17=587
④列示5到10的階乘及其因藪分解:
>forninseq(i!,i=5..1O)do
n=ifactor(n);
d;
120=(2)3(3)(5)
720=(2)4(3)2(5)
5040=(2尸(3/(5)(7)
40320=(2)7(3)2(5)(7)
362880=(2)7(3)4(5)(7)
3628800=(2)8(3)4(5)2(7)
⑤一個(gè)復(fù)雜的騫指函數(shù)生成:
>f:=proc(x,n)
locali,t;
t:=l;
forifrom1tondo
t:=xA(tAx);
od;
t;
end:
>f(x,10);
通過(guò)上述例子可以看出,Maple的for循環(huán)結(jié)構(gòu)很接近于英語(yǔ)
語(yǔ)法.在上面例子中,,稱為循環(huán)變量,用于循環(huán)計(jì)數(shù),do后面
的部分,稱為循環(huán)體,就是需要反復(fù)執(zhí)行的語(yǔ)句,可以是一條語(yǔ)
句,也可以是多條語(yǔ)句.在循環(huán)體中,也可以引用循環(huán)變量.循
環(huán)體的結(jié)束標(biāo)志,也就是整個(gè)for循環(huán)結(jié)構(gòu)的結(jié)束標(biāo)志,是字母
“od”.for循環(huán)結(jié)構(gòu)的語(yǔ)法可總結(jié)為:
for循環(huán)變量from初始值to終止值(by步長(zhǎng))do
循環(huán)體
■
在for循環(huán)結(jié)構(gòu)中,初始值和終了值必須是數(shù)值型的,而且必
須是實(shí)數(shù),如果初始值是1,可以省略不寫(xiě),而步長(zhǎng)用by引出.
對(duì)于上面程序中的重復(fù)循環(huán)似乎可有可無(wú),但實(shí)際科學(xué)計(jì)算
中,重復(fù)次數(shù)往往成千上萬(wàn),或者重復(fù)的次數(shù)無(wú)法確定,循環(huán)就
必不可少了.下面再看一個(gè)實(shí)用程序一從1到n的自然數(shù)的求
和程序:
>SUM:=proc(n)
locali,total;
total:=0;
forifrom1tondo
total:=total+i;
od;
>SUM(IOOO);
500500
該程序僅僅具有練習(xí)例舉的意義,因?yàn)樵贛aple中像這樣一
個(gè)問(wèn)題只需要一個(gè)簡(jiǎn)單語(yǔ)句就可以完成:
>Sum(n,n=1..1000)=sum(n,n=1..1000);
1000
Z〃=500500
n=I
更一般地,對(duì)于確定的求和可用add命令(該命令無(wú)惰性函數(shù)
形式):
>add(n,n=1..1000);
500500
再看下面一個(gè)動(dòng)畫(huà)制作例子(圖略去):
>forifrom-20to30do
p||i:=plots[implicitplot](xA3+yA3-5*x*y=l-i/8,x=-3??3,y=
-3??3,numpoints=800,
tickmarks=[2,2])
>plots[display](p||(-20..30),insequence=true);
2.2分支結(jié)構(gòu)(條件語(yǔ)句)
所謂分支結(jié)構(gòu),是指程序在執(zhí)行時(shí),依據(jù)不同的條件,分別
執(zhí)行兩個(gè)或多個(gè)不同的程序塊,所以常常稱為條件語(yǔ)句.if條件
結(jié)構(gòu)的語(yǔ)法為:
if邏輯表達(dá)式1(條件1)then程序塊1
elif邏輯表達(dá)式2(條件2)then程序塊2
else程序塊3
I__________________________________
下面是一個(gè)判斷兩個(gè)數(shù)中較大者的例子:
>bigger:=proc(a,b)
ifa>=bthena
elseb
fi
再如下例:
>ABS:=proc(x)
ifx<0then-x
elsex;
fi;
顯然,這個(gè)絕對(duì)值函數(shù)的簡(jiǎn)單程序,對(duì)于任意實(shí)數(shù)范圍內(nèi)的數(shù)
值型變量計(jì)算都是沒(méi)有問(wèn)題的,但對(duì)于非數(shù)值型的參數(shù)則無(wú)能
為力.為此,我們需要在程序中添加一條判斷參數(shù)是否為數(shù)值型
變量的語(yǔ)句:
>ABS:=proc(x)
iftype(x,numeric)th
ifx<0then-xelsex;
fi;
else
,ABS,(x);
fi;
這里,我們用到一個(gè)if語(yǔ)句的嵌套,也就是一個(gè)if語(yǔ)句處于另
一個(gè)if語(yǔ)句當(dāng)中.這樣的結(jié)構(gòu)可以用來(lái)判斷復(fù)雜的條件.我們
還可以用多重嵌套的條件結(jié)構(gòu)來(lái)構(gòu)造更為復(fù)雜的函數(shù),例如下
面的分段函數(shù):
>11毋諦奧的眄蛤!出en
圻x官
els^AT'(x);
fi;
end;
盡管在上面的程序中我們用了不同的縮進(jìn)來(lái)表示不同的層次
關(guān)系,這段程序還是很難懂.對(duì)于這種多分支結(jié)構(gòu),可以用另一
種方式書(shū)寫(xiě),只需在第二層的if語(yǔ)句中使用elif,這樣就可以把
多個(gè)分支形式上寫(xiě)在同一個(gè)層次中,以便于閱讀.
>H整潮en
elAT(x);
end,b
和許多高級(jí)語(yǔ)言一樣,這種多重分支結(jié)構(gòu)理論上可以多到任
意多重.
再來(lái)看看前面的絕對(duì)值函數(shù)的程序,似乎是完美的,但是,對(duì)
于乘積的絕對(duì)值則沒(méi)有辦法,下面用map命令來(lái)修正,注意其
中的type(…,*)是用來(lái)判斷表達(dá)式是否為乘積,進(jìn)而對(duì)其進(jìn)行
化簡(jiǎn).
>ABS:=proc(x)
iftype(x,numeric)th
ifx<0then-xelsexfi;
eliftype(x/*Jthenmap(ABS,x);
else
'ABS'(x);
fi;
end:
>ABS(-l/2*b);
;ABS⑹
分段函數(shù)是一類重要的函數(shù),條件語(yǔ)句在定義分段函數(shù)時(shí)
具有明顯的優(yōu)越性,下面學(xué)習(xí)幾個(gè)實(shí)例:
>f:=proc(x)
ifx<0thenx八2+1elsesin(Pi*x)fi;
end;
x2+Xx<0
(2)gU)Jsin(x)x<37i
x2-6nx+97r2-x+37t3n<x
for循環(huán)在那些已知循環(huán)次數(shù),或者循環(huán)次數(shù)可以用簡(jiǎn)單表達(dá)
式計(jì)算的情況下比較適用.但有時(shí)循環(huán)次數(shù)并不能簡(jiǎn)單地給出,
我們要通過(guò)計(jì)算,判斷一個(gè)條件來(lái)決定是否繼續(xù)循環(huán),這時(shí),可
以使用while循環(huán).while循環(huán)標(biāo)準(zhǔn)結(jié)構(gòu)為:
while條件表達(dá)式do
循環(huán)體
od
Maple首先判斷條件是否成立,如果成立,就一遍遍地執(zhí)行
循環(huán)體,直到條件不成立為止.
下面看一個(gè)簡(jiǎn)單的程序,是用輾轉(zhuǎn)相除法計(jì)算兩個(gè)自然數(shù)
的最大公約數(shù)(Euclidean算法).
>GCD:=proc(a::posint,b::posint)
localp,q,r;
p:=max(a,b);
q:=min(a,b);
r:=irem(p,q);
whiler<>0do
p:=q;
q:=r;
r:=irem(p,q);
od;
q;
end:
>GCD(123456789,987654321);
■
在上面程序中的參數(shù)a、b后面的雙冒號(hào)“:」指定了輸入
的參數(shù)類型.若類型不匹配時(shí)輸出錯(cuò)誤信息.再看下面一個(gè)擴(kuò)
展Euclidean算法的例子:
>mygcdex:=
proc(a::nonnegint,b::nonnegint,x::name,y::name)
localal,a2,a3,xl,x2,x3,y1,y2,y3,q;
al:=a;a2:=b;
xl:=l;yl:=O;
x2:=0;y2:=l;
while(a2<>0)do
a3:=almoda2;
q:=floor(al/a2);
x3:=xl-q*x2;
y3:=yl-q*y2;
al:=a2;a2:=a3;
xl:=x2;x2:=x3;
yl:=y2;y2:=y3;
od;
x:=xl;y:=yl;
RETURN(al)
end:
>mygcdex(2A10,6A50,,x,/y,);
1024
2.4遞歸子程序
正如在一個(gè)子程序中我們可以調(diào)用其他的子程序一樣(比如系
統(tǒng)內(nèi)部函數(shù),或者已經(jīng)定義好的子程序),一個(gè)子程序也可以在
它的內(nèi)部調(diào)用它自己,這樣的子程序我們稱為遞歸子程序.在
數(shù)學(xué)中,用遞歸方式定義的例子很多,如Fibonacci數(shù)歹ij:
7o=O,/1=l,/n=/fl1+/n2(n>2)
下面我們?cè)贛aple中利用遞歸子程序求Fibonacci數(shù)列的第
n項(xiàng):
>Fibonacci:=proc(n::nonnegint)::list
ifn<=lthenn;
else
Fibonacci(n-1)+Fibonacci(n-2);
fi;
end:
>seq(Fibonacci(i),i=0..19);
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181
>Fibonacci(20);
6765
但是,應(yīng)用上述程序計(jì)算Fibonacci(2000)時(shí)則不能進(jìn)行,原
因是要計(jì)算F2000,就先得計(jì)算F1999、F1998、??????,無(wú)限
制地遞歸會(huì)耗盡系統(tǒng)的堆??臻g而導(dǎo)致錯(cuò)誤.
由數(shù)據(jù)結(jié)構(gòu)有關(guān)理論知道,遞歸程序理論上都可以用循環(huán)實(shí)
現(xiàn),比如我們重寫(xiě)上面的程序如下:
>Fibonacci:=proc(n::nonnegint)
localtemp,fnew,fold,i;
ifn<=lthenn;
else
fold:=0;
fnew:=l;
forifrom2tondo
temp:=fnew+fold;
fold:=fnew;
fnew:=temp;
od;
fi;
end:
>Fibonacci(2000):
>time(Fibonacci(2000));
.019
利用循環(huán),程序不像前面那么易懂了,但同時(shí)帶來(lái)的好處也
是不可忽視的,循環(huán)結(jié)構(gòu)不僅不會(huì)受到堆棧的限制,而且計(jì)算
速度得到了很大的提高.
我們知道,Maple子程序默認(rèn)情況下把最后一條語(yǔ)句的結(jié)果作
為子程序的結(jié)果返回.我們可以用RETURN命令來(lái)顯式地返回
結(jié)果,比如前面的遞歸結(jié)果可等價(jià)地寫(xiě)成:
>Fibonacci:=proc(n::nonnegint)
optionremember;
ifn<=lthenRETURN(n);
fi;
Fibonacci(n-l)+Fibonacci(n-2);
程序進(jìn)入nv=l的分支中,執(zhí)行到RETURN命令就跳出程序,
而不會(huì)接著執(zhí)行后面的語(yǔ)句了.另外,使用RETURN命令在一
定程度上可以增加程序的可讀性.
在第二章中曾提到Maple的自動(dòng)求導(dǎo)功能,下面通過(guò)實(shí)例說(shuō)
明。第一個(gè)例子是關(guān)于分段函數(shù)求導(dǎo)問(wèn)題:
>F:=x->ifx>0thensin(x)elsearctan(x)fi;
F:=proc(%)
optionoperator,arrow;
if0<xthensin(x)elsearctan(x)endif
endproc
>Fp:=D(F);
Fp:=proc(x)
optionoperator,arrow;
if0<xthencos(x)else1/(1+xA2)endif
endproc
將分段函數(shù)及其導(dǎo)數(shù)的曲線繪制在同一個(gè)坐標(biāo)系中,實(shí)線
為F,虛線為Fp:
>plot({F,Fp},-3*Pi..3*Pi,linestyle=[1,4],color=black);
第二個(gè)例子試圖說(shuō)明Maple能夠完成對(duì)多個(gè)函數(shù)的自動(dòng)求
>f:=proc(x)
locals,t;
s:=ln(x);
t:=xA2;
s*t+3*t;
end;
A
f:=proc(x)locals,f;s:=ln(x);/:=x2;sxt+3義tendproc
>fp:=D(f);
fp:=proc(x)
localtx,s,r,sx;
sx:=1/x;s:=ln(x);tx:=2xx;t:=戈八2;sxxt+txxs+3xtx
endpnoc
程序fp是怎樣構(gòu)造的呢?對(duì)比f(wàn)和fp的源代碼可以幫助我們
了解Maple自動(dòng)求導(dǎo)機(jī)理:
在fp的源代碼中,每一條賦值語(yǔ)句V:=f(vl,v2,…vn)之
前是Vx:=fp(vl,v2,…vn),此處vi是局部變量或形式參數(shù),
fp(vl,v2,…vn)是對(duì)f(vl,v2,…vn)在形式上的微分,用該賦
值語(yǔ)句的的導(dǎo)數(shù)取代最后一條語(yǔ)句或返回值。這種方法被稱為
向前自動(dòng)微分法。在Maple內(nèi)部對(duì)這種方法有一些限制:不能
有遞歸程序,不能有記憶選項(xiàng),不能對(duì)全局變量賦值,只能有
常數(shù)的循環(huán)變量,等。
下面一個(gè)例子說(shuō)明自動(dòng)求導(dǎo)在計(jì)算時(shí)間和存儲(chǔ)空間上的優(yōu)越
性,這是一個(gè)利用遞歸定義的h的幕函數(shù)的自動(dòng)求導(dǎo)問(wèn)
題:
>f:=proc(x,n)
locali,t;
t:=l;
t:=xAt
od;
f:=proc(x,n)localz,t\t:=1;foritondot:=xNenddo;tendproc
>fl3:=D[l$3](f):#求f對(duì)x的三階導(dǎo)數(shù)
>setbytes:=kernelopts(bytesused):#使用寄存器內(nèi)存量
>settime:=time():#開(kāi)始計(jì)時(shí)
>fl3(l.l,22);
18.23670379
>cpu_time:=(time()-settime)*seconds;#計(jì)算時(shí)間
cputbne:=.230seconds
>
memoryused:=evalf((kernelopts(bytesused)-setbytes)/1
024*kbytes,5);#存儲(chǔ)空間大小
memory_iised:=671.86kbytes
再利用符號(hào)微分重復(fù)上述步驟:
>f22:=unapply(f(x,22),x):
>setbytes:=kernelopts(bytesused):
>settime():
>(D@@3)(f22)(l.l);
18.23670379
>cpu_time:=(time()-settime)*seconds;
cputime:=119.160seconds
>
memoryused:=evalf((kernelopts(bytesused)-setbytes)/1
024*kbytes,5);
memoryjLised:=63423.kbytes
顯然Maple自動(dòng)求導(dǎo)在計(jì)算時(shí)間和存儲(chǔ)空間上具有明顯的
優(yōu)越性。巧妙利用自動(dòng)微分解決較復(fù)雜的函數(shù)求導(dǎo)問(wèn)題有十分
現(xiàn)實(shí)的意義。
3子程序求值
在Maple子程序中的語(yǔ)句,求值的方式和交互環(huán)境中的求值
有所不同,這在某種程度上是為了提高子程序的執(zhí)行效率而考
慮的.在交互式環(huán)境中,Maple對(duì)于一般的變量和表達(dá)式都進(jìn)行
完全求值(除了數(shù)組、映射表等數(shù)據(jù)結(jié)構(gòu)外).比如先將b賦給a,
再將c賦給b,則最終a的值也指向c.
>a:=b:
c+1
但在子程序內(nèi)部情況就不一樣了,試看下述實(shí)驗(yàn):
>f:=proc()
locala,b;
a:=b;
b:=c;
結(jié)果居然是:
b+1
這是因?yàn)閍和b都是局部變量,Maple對(duì)于子程序中的局部變
量只進(jìn)行一層的求值.下面,我們針對(duì)子程序中的不同的變量,
系統(tǒng)介紹其求值機(jī)制.
3.1參數(shù)
子程序中的參數(shù),就是那些在proc()的括號(hào)中的變量.參數(shù)
是一類特殊的變量,在調(diào)用子程序時(shí),會(huì)把它們替換成實(shí)際的
參數(shù).
>sqrt1:=proc(x::anything,y::name)
y:=xA2;
end:
>sqrtl(d,ans);
解
>ans;
我們?cè)賮?lái)試試別的參數(shù),比如前面賦值過(guò)的a作為第一個(gè)
參數(shù),第二個(gè)參數(shù)仍用ans,只不過(guò)加了單引號(hào):
>sqrtl(a,'ans*);
>ans;
H
事實(shí)上,Maple在進(jìn)入子程序以前就已經(jīng)對(duì)參數(shù)進(jìn)行了求值,
因?yàn)槭窃谧映绦蛲膺M(jìn)行求值,所以求值規(guī)則服從調(diào)用時(shí)所在的
環(huán)境.上面是在交互式環(huán)境下調(diào)用sqrtl得到的結(jié)果,作為對(duì)照
看看在子程序內(nèi)部調(diào)用上面的sqrtl子程序會(huì)有什么不同.
>g:=proc()
locala,b,ans;
a:=b;
b:=c;
sqrtl(a,ans);
end:
因?yàn)檫@次調(diào)用是在程序內(nèi)部,所以只進(jìn)行第一層求值,進(jìn)入
sqrtl的參數(shù)值為b.
Maple對(duì)于子程序的參數(shù),都只在調(diào)用之前進(jìn)行一次求值,
而在子程序內(nèi)部出現(xiàn)的地方都用這次求值的結(jié)果替換,而不再
重新進(jìn)行求值.如前所述之sqrtl:
>sqrt1:=proc(x::anything,y::name)
y:=xA2;
end:
>sqrtl(d/ans');
ans+1
可見(jiàn),對(duì)參數(shù)賦值的作用只有一個(gè)一返回一定的信息.因?yàn)?/p>
在子程序內(nèi)部,永遠(yuǎn)不會(huì)對(duì)參數(shù)求值.我們可以認(rèn)為,參數(shù)是一
個(gè)。層求值的變量.
3.2局部變量和全局變量
Maple對(duì)于局部變量只進(jìn)行一層求值,也就相當(dāng)于用eval(a,
1)得到的結(jié)果.這種求值機(jī)制不僅可以提高效率,而且還有著
更重要的作用.比如在程序中,我們往往需要把兩個(gè)變量的,fn
交換,一般地,我們使用一個(gè)中間變量來(lái)完成這樣的交換.但如
果求值機(jī)制和交互式環(huán)境中一樣,將達(dá)不到我們的目的.試看,
在交互式環(huán)境下,我們企圖用這樣的方法交換兩個(gè)未被賦值的
變量會(huì)有什么后果:
>temp:=p:
q:=temp;
q:二q
不管在交互式環(huán)境下還是在程序中,Maple對(duì)于每一個(gè)全局變
量都進(jìn)行完全求值,除非它是數(shù)組、映射表或者子程序.對(duì)于數(shù)
組、映射表和子程序,Maple采用賦值鏈中的上一名稱來(lái)求值.
除了上面這些特殊數(shù)據(jù)對(duì)象及下面一個(gè)特例外,總結(jié)起來(lái),
Maple對(duì)于子程序的參數(shù)進(jìn)行。層求值,對(duì)于局部變量進(jìn)行1
層求值,而對(duì)于全局變量,則進(jìn)行完全求值.
對(duì)于上面說(shuō)的求值規(guī)則,在Maple中還有個(gè)特例,就是“同
上”操作符“%”需要引起注意.就其作用來(lái)說(shuō),它應(yīng)該屬于局
部變量.在進(jìn)入一個(gè)子程序時(shí),Maple會(huì)自動(dòng)地把該子程序中
的%設(shè)置成NULL(空).但是,對(duì)于這個(gè)“局部變量”,Maple
不遵循上面的規(guī)則,無(wú)論在那兒都會(huì)將其完全求值.我們下面
通過(guò)一個(gè)例子說(shuō)明它在子程序中的求值機(jī)制:
>f:=proc()
locala,b,c,d;
print(nAtthebeginning,[%]is",%);
a:=b;
b:=c;
c:=d;
a+1;
print(nNow[%]is",%);
end:
>f();
"Atthebeginning,[%]isM
"Now[%]is”,d+1
可以看出,盡管在子程序內(nèi)部,局部變量a僅進(jìn)行一層求值,
但指代a+1的同上操作符卻進(jìn)行了完全求值,得到d+1的結(jié)果.
3.3環(huán)境變量
所謂環(huán)境變量就是從一個(gè)程序退出時(shí)系統(tǒng)自動(dòng)設(shè)置的全局變
量。Maple中有幾個(gè)內(nèi)建的環(huán)境變量,如Digits,Normalizer,
Testzero,mod,printlevel等.從作用域來(lái)看,它們應(yīng)該算作
是全局變量.在求值上,它們也像其他全局變量一樣,始終都是
完全求值.但是如果在子程序中間對(duì)環(huán)境變量進(jìn)行了設(shè)置,那
么,在退出該子程序時(shí),系統(tǒng)會(huì)自動(dòng)地將其恢復(fù)成進(jìn)入程序時(shí)
的狀態(tài),以保證當(dāng)前行時(shí)的環(huán)境.正因如此,我們稱其為環(huán)境變
量.試看下面程序:
>f:=proc()
print("Enteringf.Digitsis”,Digits);
Digits:=20;
print(nNowDigitshasbecome**,Digits);
>g:=proc()
print("Enteringg.Digitsis",Digits);
Digits:=100;
print(nNowDigitsis",Digits);
f();
print(nBackingfromf,Digitsis”,Digits);
end:
>f();
"Enteringf.Digitsis",10
"NowDigitshasbecome",20
>g();
"Enteringg.Digitsis",10
"NowDigitsis",100
"Enteringf.Digitsis",100
"NowDigitshasbecome",20
"Backingfromf,Digitsis",100
>Digits;
可以看出,從子程序g中返回時(shí),Digits又被自動(dòng)地設(shè)成了原
來(lái)的值(10).如果你需要自己定義一些具有這樣的特性的環(huán)境
變量,也十分簡(jiǎn)單一Maple會(huì)把一切以Env開(kāi)始的變量認(rèn)作是
環(huán)境變量.
4嵌套子程序和記憶表
4.1嵌套子程序
很多情況下,可以在一個(gè)子程序的內(nèi)部定義另一個(gè)子程序.
實(shí)際上,我們?cè)趯?xiě)這樣的程序時(shí)常常沒(méi)有意識(shí)到它是嵌套子程
序.用于對(duì)每一個(gè)元素操作的map命令在嵌套程序設(shè)計(jì)中很有
用.比如,編寫(xiě)一個(gè)子程序,它返回有序表中的每一個(gè)元素都將
被第一個(gè)元素除的結(jié)果.
>nest:=proc(x::list)
localv;
v:=x[l];
map(y->y/v,x);
>lst:=[2,4,8,16,32]:
>nest(lst);
[1,2,4,8,16]
在上面的程序中,我們?cè)谧映绦蛑卸x了另一個(gè)子程序:
y->y/v,這個(gè)子程序中有一個(gè)變量v,Maple根據(jù)有效域的范圍,
認(rèn)為它就是外面的子程序nest中的同名變量v.那么這是一個(gè)
全局變量還是一個(gè)局部變量?顯然兩者都不是,因?yàn)榘焉厦娴?/p>
例子中的內(nèi)部子程序的v聲明成local或者global,都無(wú)法達(dá)到
我們的目的.
那么,Maple究竟是怎么樣來(lái)判斷一個(gè)變量的作用域呢?首先,
它自里向外,一層一層地尋找顯式地用local、global聲明的同
名變量,或者是子程序的參數(shù).如果找到了,它就將其綁定在外
層的同名變量之上,實(shí)際上就是將兩個(gè)變量視為同一,就像上
面例子中的情況.如果沒(méi)有找到,就遵循下面的原則:如果變量
位于賦值運(yùn)算符“:="的左邊,就視其為局部變量,否則均認(rèn)為
它是全局變量.再看下面一個(gè)實(shí)例:
>uniform:=proc(r::constant..constant)
proc()
localintrange,f;
intrange:=map(x->round(x*10ADigits),evalf(r));
f:=rand(intrange);
evalf任()/10八Digits);
end:
end:
>U:=uniform(cos(2)..sin(1)):Digits:=4:
>seq(U(),i=1..10);
.4210,.7449,-.06440,.7386,.7994,-.2166,-.1174,.02740,.2570,.3538
4.2記憶表
記憶表的目的是為了提高計(jì)算效率,它把每一個(gè)計(jì)算過(guò)的結(jié)
果存儲(chǔ)在一個(gè)映射表中,所以在下一次用相同的參數(shù)直接調(diào)用
以避免重復(fù)計(jì)算.
(1)remember選項(xiàng)
在程序中可以加入remember選項(xiàng)來(lái)建立該子程序的記憶表.
remember選項(xiàng)可以把對(duì)時(shí)間和空間的指數(shù)增長(zhǎng)的需求約簡(jiǎn)到
線性增長(zhǎng)。下面再建立一個(gè)Fibonacci子程序:
>Fibonacci:=proc(n::nonnegint)
optionremember;
ifn<=lthenRETURN(n)fi;
Fibonacci(n-l)+Fibonacci(n-2);
在我們計(jì)算了F3之后,它的記憶表中就有了4項(xiàng)(記憶表
中的子程序的第4個(gè)元素一用。p(4,…)來(lái)獲得),可以用。p命
令來(lái)檢查一個(gè)子程序的記憶表:
>Fibonacci(3);
I
>op(4,eval(Fibonacci));
table([O=O,1=1,2=1,3=2])
但是,過(guò)分地使用remember選項(xiàng)也并非全是好事,一方面,
使用remember選項(xiàng)的程序?qū)?nèi)存的需求比正確寫(xiě)出的不使用
remember選項(xiàng)的程序要高,另一方面,remember選項(xiàng)不重
視全局變量和環(huán)境變量的值(除了在evalf中對(duì)Digits特別重視
外),從而可能導(dǎo)致錯(cuò)誤。還有一點(diǎn),remember選項(xiàng)與表、
列、向量不能混用,因?yàn)閞emember無(wú)法注意到表中元素的變
化。
(2)在記憶表中加入項(xiàng)
通常調(diào)用具有記憶表的子程序并且得到計(jì)算結(jié)果,Maple會(huì)自
動(dòng)地把結(jié)果加到記憶表中去,但也可以手動(dòng)在記憶表中添加內(nèi)
容.試看下面的程序:
>F:=proc(n::nonnegint)
optionremember;
F(n-l)+F(n-2);
現(xiàn)在對(duì)記憶表賦值,注意這樣賦值不會(huì)使程序被調(diào)用:
>F(O):=O;F(1):=1;
F(0):=0
F(1):=1
試調(diào)用程序得到想要的結(jié)果:
>F(100);
354224848179261915075
由于程序F的代碼很短,很容易忘記對(duì)初始條件賦初值,這
樣會(huì)導(dǎo)致永不終止的遞歸,從而產(chǎn)生死循環(huán).因此,程序
Fibonacci較F要好一些.
(3)在記憶表中刪除項(xiàng)
記憶表是映射表的一種,可以方便地在其中添加或者刪除特
定的項(xiàng),和一般變量一樣,刪除一個(gè)表項(xiàng)只需要將其名稱用
evaln賦給它本身就行了.假設(shè),因?yàn)檩斎脲e(cuò)誤,我們?cè)谇懊嬉?/p>
個(gè)程序中加入了一個(gè)錯(cuò)誤的項(xiàng):
>Fibonacci(2):=2;
Fibonacci(2):=2
查看記憶表:
>T:=op(4,eval(Fibonacci));
T:=table([2=2])
再將相應(yīng)的項(xiàng)刪除掉,則又回復(fù)原來(lái)的記憶表:
>T[2]:=evaln(T[2]);
>op(4,eval(Fibonacci));
table([O=O,1=1,2=1,3=2])
Maple也可以自動(dòng)刪除子程序的記憶表,如果我們子程序定
義時(shí)聲明system選項(xiàng),系統(tǒng)將會(huì)在回收無(wú)用內(nèi)存時(shí)將記憶表
刪除,就如同大多數(shù)系統(tǒng)內(nèi)部子程序一樣.
對(duì)于記憶表的使用范圍,一般地,它只適用于對(duì)于確定的參
數(shù)具有確定的結(jié)果的程序,而對(duì)于那些結(jié)果不確定的程序,比
如用到環(huán)境變量、全局變量,或者時(shí)間函數(shù)等的程序,就不能,
用,否則將會(huì)導(dǎo)致錯(cuò)誤的結(jié)果.
5返回子程序的子程序
在所有的子程序中,編寫(xiě)返回值為一個(gè)子程序的程序所遇到
的困難也許是最多的了.編寫(xiě)這樣的程序,需要對(duì)Maple的各
種變量的求值規(guī)則、有效語(yǔ)句有透徹的理解.Maple一些內(nèi)部子
程序就有這樣的機(jī)制,比如隨機(jī)函數(shù)rand,返回的就是一個(gè)子
程序,它會(huì)在給定的范圍內(nèi)隨機(jī)地取值.下面以牛頓迭代法和
函數(shù)的平移為例說(shuō)明這種程序設(shè)計(jì)技巧。
5.1牛頓迭代法
牛頓迭代法是用來(lái)求解非線性方程數(shù)值解的常用方法之一.
首先,選擇一個(gè)接近于精確解的初值點(diǎn),接著,在曲線上該初值
點(diǎn)處作切線,求出切線與x軸的交點(diǎn).對(duì)于大部分函數(shù),這個(gè)交
點(diǎn)比初值點(diǎn)更要接近精確解.依次,重復(fù)迭代,就可以得到更精
確的點(diǎn).牛頓迭代法的數(shù)學(xué)過(guò)程為:
對(duì)于方程“小。,選定初值.,然后利用遞推公式”…給;來(lái)逐步
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030透析機(jī)市場(chǎng)前景分析及投資策略與風(fēng)險(xiǎn)管理研究報(bào)告
- 2024-2025學(xué)年度小學(xué)課外活動(dòng)安全保障計(jì)劃
- 疫情期間幼兒園親子活動(dòng)安排計(jì)劃
- 七年級(jí)第一學(xué)期班主任科技創(chuàng)新活動(dòng)計(jì)劃
- 一年級(jí)學(xué)生音樂(lè)技能提升計(jì)劃
- 學(xué)校飲食健康促進(jìn)工作計(jì)劃
- 2025年新員工入職安全培訓(xùn)考試試題帶答案(輕巧奪冠)
- 江西省九江市高中數(shù)學(xué) 第一章 計(jì)數(shù)原理 3 組合(二)教學(xué)設(shè)計(jì) 北師大版選修2-3
- 科研項(xiàng)目變更管理計(jì)劃
- 國(guó)際音體美教育交流計(jì)劃
- 《中國(guó)心力衰竭診斷和治療指南2024》解讀
- 頂管施工危險(xiǎn)源辨識(shí)及風(fēng)險(xiǎn)評(píng)價(jià)表
- 燃?xì)鉄崴仩t調(diào)試方案
- 石英砂采購(gòu)合同(2024版)
- DL∕T 618-2022 氣體絕緣金屬封閉開(kāi)關(guān)設(shè)備現(xiàn)場(chǎng)交接試驗(yàn)規(guī)程
- 2021利達(dá)JB-QG-LD988EL JB-QT-LD988EL 火災(zāi)報(bào)警控制器 消防聯(lián)動(dòng)控制器調(diào)試手冊(cè)
- 常微分方程教案
- 2024年中國(guó)防曬衣行業(yè)標(biāo)準(zhǔn)白皮書(shū)
- 廚房安全檢查表
- 四川省2022年10月自考01759《藥物化學(xué)(二)》試題
- 供水企業(yè)安全生產(chǎn)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論