《MATLAB程序設(shè)計基礎(chǔ)教程》課件第8章_第1頁
《MATLAB程序設(shè)計基礎(chǔ)教程》課件第8章_第2頁
《MATLAB程序設(shè)計基礎(chǔ)教程》課件第8章_第3頁
《MATLAB程序設(shè)計基礎(chǔ)教程》課件第8章_第4頁
《MATLAB程序設(shè)計基礎(chǔ)教程》課件第8章_第5頁
已閱讀5頁,還剩181頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第8章符號運(yùn)算8.1符號對象8.2數(shù)值與符號變量的相互轉(zhuǎn)換8.3符號矩陣與運(yùn)算8.4符號表達(dá)式的化簡8.5符號微積分8.6符號級數(shù)與求和8.7符號矩陣的代數(shù)運(yùn)算8.8符號方程與求解8.9符號積分變換8.10符號函數(shù)圖形繪制8.1符號對象8.1.1符號運(yùn)算的特點(diǎn)對于一般的程序設(shè)計軟件,如C、C++、Fortran等語言可以順利運(yùn)行數(shù)值計算,但是在實(shí)現(xiàn)符號計算方面是非常困難的。而MATLAB自帶有符號工具箱“Toolbox\SymbolieMath\MuPAD”,而且可以借助數(shù)學(xué)軟件Maple,所以MATLAB也具有強(qiáng)大的符號運(yùn)算功能。MATLAB的“Toolbox\SymbolieMath\MuPAD”里提供的函數(shù)命令是專門研究符號運(yùn)算功能和用來解算符號對象問題的。MATLAB的這種符號運(yùn)算功能,對于自然科學(xué)各學(xué)科理論的研究發(fā)展、工程技術(shù)的研究創(chuàng)新有著十分重要與不可替代的作用。

1.符號對象

符號對象是符號工具箱中定義的另一種數(shù)據(jù)類型。符號對象是用來存儲代表符號的字符串,在符號工具箱中符號對象用于表示符號變量、符號矩陣、符號表達(dá)式和符號方程。

在數(shù)學(xué)計算中有數(shù)值計算與符號計算之分,數(shù)值計算的表達(dá)式、矩陣變量中不允許有未定義的自由變量,例如:

>>A=[a,b;c,d]

???Undefinedfunctionorvariable'a'.

而符號計算可以含有未定義的符號變量,例如:

>>A=sym('[a,b;c,d]')

A=

[a,b]

[c,d]在MATLAB中實(shí)現(xiàn)符號計算功能主要有兩種途徑:

(1)通過調(diào)用MATLAB的各種功能函數(shù)進(jìn)行符號運(yùn)算。這些操作、運(yùn)算、求解以

及功能函數(shù)有:字符串操作、符號表達(dá)式與符號矩陣的基本操作、符號矩陣運(yùn)算、符號微積分運(yùn)算、符號線性方程求解、符號微分方程求解、特殊數(shù)學(xué)符號函數(shù)、符號函數(shù)圖形等。

(2)?MATLAB還保留著maple.m、mpa.m文件與Maple接口,調(diào)用Maple進(jìn)行符號運(yùn)算。

2.符號對象與普通數(shù)據(jù)對象的差別

數(shù)學(xué)計算有數(shù)值計算與符號計算之分。這兩者的根本區(qū)別是:

數(shù)值計算的表達(dá)式、矩陣變量中不允許有未定義的自由變量,在數(shù)值計算過程中,所運(yùn)算的變量都是被賦了值的數(shù)值變量。

符號計算可以含有未定義的符號變量,在符號計算的整個過程中,所運(yùn)算的是符號變量。需要注意的是,在符號計算中所出現(xiàn)的數(shù)字也都是當(dāng)作符號處理的。

下例說明了符號對象和普通的數(shù)據(jù)對象之間的差別。例8-1-1

舉例說明符號對象和普通數(shù)據(jù)對象之間的差別。

解在命令窗口中輸入如下命令:

>>sqrt(2)

ans=1.4142

>>x=sqrt(sym(2))

x=2^(1/2)

由上例可以看出,當(dāng)采用符號運(yùn)算時,并不計算出表達(dá)式的結(jié)果,而是給出符號表達(dá)式。如果需要查看符號

x所表示的值,在窗口中輸入:

>>double(x)

ans=1.4142

3.符號運(yùn)算的特點(diǎn)

MATLAB工具箱中有三種不同類型的算術(shù)運(yùn)算。

(1)數(shù)值型:MATLAB的浮點(diǎn)數(shù)運(yùn)算。在三種運(yùn)算中,浮點(diǎn)運(yùn)算速度最快,所需的內(nèi)存空間小,但是結(jié)果精確度最低。雙精度數(shù)據(jù)的輸出位數(shù)由format命令控制,但是在內(nèi)部運(yùn)算時采用的是計算機(jī)硬件所提供的八位浮點(diǎn)運(yùn)算。而且,在浮點(diǎn)運(yùn)算的每一步,都存在一個舍入誤差,如計算:

>>1/2+1/3

ans=

0.8333

在運(yùn)算中存在三步舍入誤差:計算1/3的舍入誤差、計算1/2+1/3的舍入誤差和將最后結(jié)果轉(zhuǎn)化為十進(jìn)制輸出時的舍入誤差。

(2)有理數(shù)類型:Maple的精確符號運(yùn)算。符號計算的一個非常顯著的特點(diǎn)是:在計算過程中不會出現(xiàn)舍入誤差,從而可以得到任意精度的數(shù)值解。如果希望計算結(jié)果精確,可以用符號計算來獲得足夠高的計算精度。符號計算相對于數(shù)值計算而言,需要更多的計算時間和存儲空間。

符號運(yùn)算中的有理數(shù)運(yùn)算,其時間復(fù)雜度和空間復(fù)雜度都是最大的,但是只要時間和空間允許,符號運(yùn)算能夠得到任意精度的結(jié)果。

(3)?VPA類型:Maple的任意精度算術(shù)運(yùn)算??勺兙鹊倪\(yùn)算運(yùn)算速度和精確度均位于上面兩種運(yùn)算之間,其具體精度由參數(shù)指定,參數(shù)越大,精確度越高,運(yùn)行越慢。

另外,對符號進(jìn)行的數(shù)學(xué)運(yùn)算與對數(shù)值進(jìn)行的數(shù)學(xué)運(yùn)算并不相同,區(qū)別如下:

數(shù)值運(yùn)算中必須先對變量賦值,然后才能參與運(yùn)算。

符號運(yùn)算無需事先對獨(dú)立變量賦值,運(yùn)算結(jié)果以標(biāo)準(zhǔn)的符號形式表達(dá)。

例8-1-2

舉例說明符號運(yùn)算和數(shù)值運(yùn)算之間的差別。

>>sym(2)/sym(5)

ans=2/5%兩個符號進(jìn)行運(yùn)算,結(jié)果為分?jǐn)?shù)形式

當(dāng)進(jìn)行數(shù)值運(yùn)算時,得到的結(jié)果為double型數(shù)據(jù):

>>2/5+1/3

ans=0.7333

采用符號進(jìn)行運(yùn)算時,輸出的結(jié)果為分?jǐn)?shù)形式:

>>sym(2)/sym(5)+sym(1)/sym(3)

ans=11/15

>>double(sym(2)/sym(5)+sym(1)/sym(3))

ans=0.73338.1.2符號變量及符號變量確定原則

在MATLAB的數(shù)據(jù)類型中,字符型與符號型是兩種重要而又容易混淆的數(shù)據(jù)類型。

在MATLAB指令窗口中,輸入的數(shù)值變量必須提前賦值,否則會提示出錯。只有符號變量可以在沒有提前賦值的情況下合法地出現(xiàn)在表達(dá)式中,但是符號變量必須預(yù)先定義。在一個表達(dá)式中,系統(tǒng)確定默認(rèn)符號變量原則如下:

(1)除了i和j之外,選擇在字母表中位置最接近x的字母為符號變量。

(2)若兩個字母到x的距離相等,則取ASCII碼大的字母為符號變量。

(3)若沒有除了i與j以外的字母,則視x為默認(rèn)的符號變量。

MATLAB中有幾個函數(shù)用于符號變量、符號表達(dá)式的生成,其中,函數(shù)sym()和syms()是符號運(yùn)算的核心工具,分別用于生成一個或多個符號對象:

sym()函數(shù):構(gòu)造符號變量和表達(dá)式,如:a=sym('a')。

syms()函數(shù):構(gòu)造符號對象的簡捷方式。

findsym()

函數(shù):找出符號表達(dá)式中的符號變量。

symvar()函數(shù):確定符號表達(dá)式中的符號變量。

1.sym()函數(shù)

sym()函數(shù)可以用于生成單個的符號變量。該函數(shù)的調(diào)用格式如下:

(1)?S=sym(A):構(gòu)建一個sym類的對象S,如果參數(shù)A為字符串,則返回的結(jié)果為一個符號變量或者一個符號數(shù)值;如果A是一個數(shù)字或矩陣,則返回結(jié)果為該參數(shù)的符號表示。

(2)?x=sym('x'):該命令創(chuàng)建一個符號變量,該變量的內(nèi)容為x,表達(dá)為x。

(3)?x=sym('x','real'):指定符號變量x為實(shí)數(shù)。

(4)?x=sym('x','clear'):指定x為一個純粹的變量,而不具有其他屬性。在以前的版本中使用x=sym('x','unreal'),與此結(jié)果相同。

(5)S=sym(A,flag):該函數(shù)將數(shù)值標(biāo)量或者矩陣轉(zhuǎn)化為參數(shù)形式,其中第二個參數(shù)flag可以為r、d、e或者f中的一個,用于指定浮點(diǎn)數(shù)轉(zhuǎn)化的方法,flag參數(shù)各個取值的意義如表8-1所示。

2.syms()函數(shù)

使用syms()函數(shù)快捷定義多個符號變量和符號表達(dá)式。

syms命令的使用要比sym簡便,它一次可以定義多個符號變量,而且格式簡練。因此一般用syms來創(chuàng)建符號變量,注意各符號變量之間必須是空格隔開。該函數(shù)的調(diào)用格式如下:

(1)?symsarg1arg2...相當(dāng)于:

arg1=sym('arg1');

arg2=sym('arg2');..

(2)?symsarg1arg2...real,相當(dāng)于:

arg1=sym('arg1','real');

arg2=sym('arg2','real');...

(3)?symsarg1arg2...clear,相當(dāng)于:

arg1=sym('arg1','clear');

arg2=sym('arg2','clear');...

(4)?symsarg1arg2...positive,相當(dāng)于:

arg1=sym('arg1','positive');

arg2=sym('arg2','positive');…

例如:

symsxyreal等于:

x=sym('x','real');

y=sym('y','real');

如果要清除符號變量x和y的?'real'?狀態(tài),可鍵入:symsxyclear。

clearall:清除工作空間中所有的變量的符號類型。

3.findsym()函數(shù)

findsym()函數(shù)通常由系統(tǒng)自動調(diào)用,在進(jìn)行符號運(yùn)算時,系統(tǒng)調(diào)用該函數(shù)確定表達(dá)式中的符號變量,執(zhí)行相應(yīng)的操作,其語法如下:

(1)?r=findsym(S)。S是符號表達(dá)式或矩陣,該語句按字母表中最接近x的順序返回S中的所有符號變量。如果S中沒有變量,則返回一個空串。

>>findsym(a+z+y)

ans=a,y,z

(2)?r=findsym(S,N)用來詢問在眾多符號中,哪N個為符號變量。例如:

>>findsym(a+y,1)

ans=y

>>findsym(a+y,2)

ans=y,a

4.symvar()函數(shù)

(1)?symvar(s):返回包含在s中的所有符號變量組成的一個向量,返回的這些變量從大寫到小寫按字母順序排列。如果在s中沒符號變量,symvar返回一個空向量。symvar不把圓周率常數(shù)pi、i和j看做變量。

(2)?symvar(s,n):返回s中最接近?'x'?的n個符號變量按字母順序排列的向量。

這些變量按自己的名字第一個字母。次序是xywzvu...aXYWZVU...A,符號變量名稱不能以數(shù)字開頭。

對于所有后續(xù)字母,按字母大小寫順序排列01...9AB...Zab...z.。在上面的例子中,表達(dá)式f中包含有四個符號變量,表達(dá)式g中包含有1個符號變量,其他變量為普通變量。

>>symvar'cos(pi*x-beta1)'

ans=

'beta1'

'x'8.1.3建立符號表達(dá)式和求值

1.建立符號表達(dá)式

含有符號對象的表達(dá)式稱為符號表達(dá)式。符號表達(dá)式包括符號函數(shù)和符號方程。符號表達(dá)式(或符號方程)既可以賦給符號變量,以方便以后調(diào)用,也可以不賦給符號變量直接參與運(yùn)算。

建立符號表達(dá)式的方法有以下三種:

(1)利用單引號來生成符號表達(dá)式。例如:

>>f='sin(x)+5x'

f:符號變量名。

sin(x)+5x:符號表達(dá)式。

'':符號標(biāo)識。符號表達(dá)式一定要用單引號('')括起來MATLAB才能識別。單引號中的內(nèi)容可以是符號表達(dá)式,也可以是符號方程。例如:

>>f1='ax^2+bx+c':二次三項(xiàng)式。

>>f2='ax^2+bx+c=0':方程。

>>f3='Dy+y^2=1':微分方程。

(2)用sym()和syms()函數(shù)建立符號表達(dá)式。

用sym()函數(shù)建立符號表達(dá)式,其語法為

sym(符號表達(dá)式)

例如,用sym命令創(chuàng)建:

>>f=sym(‘sin(x)’)

f=sin(x)

>>f=sym(‘sin(x)^2=0’)

f=

sin(x)^2=0

或用syms()命令創(chuàng)建,例如:

>>symsx

>>f=sin(x)+cos(x)

f=sin(x)+cos(x)

(3)使用已經(jīng)定義的符號變量組成符號表達(dá)式。例如:

>>symsabcx

>>f=sym('a*x^2+b*x+c')

f=a*x^2+b*x+c

2.計算符號表達(dá)式的值

計算符號表達(dá)式P的值,可使用eval(P)或vpa(P)函數(shù)。

>>P=sym(‘2+sqrt(5)’)

如果要用eval(P)來計算符號表達(dá)式P的近似值,則可輸入:

>>eval(P)

P=5^(1/2)+2

得到輸出:

ans=4.2361

vpa()是一種可變精度的算法(Variableprecisionarithmetic),由于P=sym(‘2+sqrt(5)’)實(shí)際上是一個符號常數(shù),所以也可以用vpa()命令計算:

>>vpa(P)

ans=4.23606797749978969640917366873138.1.4符號階躍函數(shù)與沖激函數(shù)

1.dirac()函數(shù)

MATLAB用dirac()函數(shù)(狄拉克函數(shù))表示沖激函數(shù),常用

d

表示,其定義和描述如下:(8.1.1)

2.heaviside()函數(shù)

MATLAB用heaviside()函數(shù)(赫維賽德函數(shù))表示階躍函數(shù),其定義和描述如下:(8.1.2)例如:

當(dāng)x<

0時,heaviside(x)返回0:

>>heaviside(sym(-3))

ans=0

當(dāng)x

>0時,heaviside(x)返回1:

>>heaviside(sym(3))

ans=1

當(dāng)x=0時,heaviside(x)返回1/2:

>>heaviside(sym(0))

ans=1/2

對于數(shù)值x=0,heaviside(x)返回數(shù)值結(jié)果:

>>heaviside(0)

ans=0.5000

對階躍函數(shù)heaviside(x)的微分,可生成?d?函數(shù):

>>symsx;

>>diff(heaviside(x),x)

ans=dirac(x) 8.2數(shù)值與符號變量的相互轉(zhuǎn)換

8.2.1符號轉(zhuǎn)換為數(shù)值

符號變量表示的值都是精確的,而數(shù)值變量表示的值可能是不精確的,有時符號運(yùn)算的目的是得到精確的數(shù)值解,這就要對得到的解析解進(jìn)行數(shù)值轉(zhuǎn)換。

我們在符號表達(dá)式轉(zhuǎn)換為數(shù)值變量時要考慮到轉(zhuǎn)換精度的問題。例如:f=sym('1/3');將f定義為1/3,如果要轉(zhuǎn)換為數(shù)值,那么我們應(yīng)該轉(zhuǎn)為0.3還是0.33333呢??計算機(jī)存儲總是有限制的,我們只能存儲到有限個3。

使用digits()、vpa()和double()函數(shù)進(jìn)行符號與數(shù)值的轉(zhuǎn)換。一般情況下,我們把這三個函數(shù)作為組合拳,先使用digits()設(shè)定精確程度,再使用vpa()作近似運(yùn)算,最后才是double()轉(zhuǎn)換為數(shù)值變量。

1.digits()函數(shù)

digits(n):設(shè)置有效數(shù)字位數(shù)。該函數(shù)的作用是指定精確到多少(n)位有效數(shù)字,默認(rèn)是32位。

2.vpa()函數(shù)

vpa(f)將符號表達(dá)式f的結(jié)果精確到digits()所設(shè)定的有效數(shù)字的位數(shù)。值得注意的是,vpa()返回的還是符號表達(dá)式。命令形式如下:

(1)?R=vpa(A):根據(jù)當(dāng)前指定的精度,使用可變精度算術(shù)VPA函數(shù),計算A的每一個元素。結(jié)果中的每一個元素都是符號表達(dá)式。

(2)?R=vpa(A,d):使用d代替當(dāng)前的精度,計算A的每一個元素,即求A在d精度下的數(shù)值解。d的值必須是正整數(shù),而且位于1~229+1之間。

3.double()函數(shù)

double()是將符號表達(dá)式轉(zhuǎn)換為浮點(diǎn)數(shù)數(shù)值變量類型的函數(shù)。double()命令的形式如下:

x=double(s):轉(zhuǎn)換s為雙精度型數(shù)值變量x,s可以是符號變量也可以是字符變量。

(1)當(dāng)s是符號變量時,s必須是全為數(shù)字的符號,返回數(shù)值變量x。例如:

>>s1=sym('20.3');

>>x1=double(s1)%把符號變量s1轉(zhuǎn)化為數(shù)值變量x1

x1=20.3000

(2)當(dāng)s是字符變量時,返回數(shù)值矩陣x,矩陣中的元素是相應(yīng)的ASCII值。例如:

>>x3=double('a')%把字符a轉(zhuǎn)化為它對應(yīng)的ASCII碼值

x3=97

>>c1='122345';

>>x4=double(c1)

x4=

49505051525332

double函數(shù)把字符串

'122345'?轉(zhuǎn)化為它對應(yīng)的ASCII碼值,32為5后面的空格的ASCII碼。8.2.2數(shù)值轉(zhuǎn)換為符號

數(shù)值轉(zhuǎn)換為符號的方式有以下幾種:

(1)?sym()函數(shù)用于生成符號變量,也可以將數(shù)值轉(zhuǎn)化為符號變量。轉(zhuǎn)化的方式由參數(shù)“flag”確定。

例如,命令形式:x=sym(s)。功能是將數(shù)值s轉(zhuǎn)換為符號變量x,s不可以是字符矩陣和非法的表達(dá)式。

(2)?sym()命令可將數(shù)值表達(dá)式轉(zhuǎn)成符號表達(dá)式,其語法為sym('數(shù)值表達(dá)式')

例如,在指令窗口輸入:

>>P=sym('2+sqrt(5)')

則得到輸出:

P=2+sqrt(5),此時P是一個符號表達(dá)式,而不是一個數(shù)值表達(dá)式。

(3)?sym()的另一個重要作用是將數(shù)值矩陣轉(zhuǎn)化為符號矩陣。8.2.3poly2sym()函數(shù)與多項(xiàng)式的符號表達(dá)式

poly2sym()函數(shù)可以把多項(xiàng)式用符號表達(dá)式表示出來。用法如下:

r=poly2sym(c):返回多項(xiàng)式的符號表達(dá)式,多項(xiàng)式的系數(shù)是數(shù)字向量c。默認(rèn)符號表達(dá)式的變量是x,變量v可以指定作為第二個參數(shù)。(8.2.1)例如:

>>y=[1-1244-480]

>>ya=poly2sym(y)

ya=x^4-12*x^3+44*x^2-48*x 8.3符號矩陣與運(yùn)算

8.3.1符號矩陣的生成

1.用字符串直接創(chuàng)建矩陣

類似于MATLAB數(shù)值矩陣的創(chuàng)建方法,用生成子矩陣的方法生成符號矩陣。例如:

>>A=['[a,2*b]';'[3*a,0]']

A=

[a,2*b]

[3*a,0]

2.用sym()命令定義矩陣

命令格式:A=sym('[]')

說明:

符號矩陣內(nèi)容同數(shù)值矩陣。

符號矩陣需用sym()指令定義。

符號矩陣需用?''?標(biāo)識。

這時的函數(shù)sym()實(shí)際是在定義一個符號表達(dá)式,符號矩陣中的元素可以是任何的符號或者是表達(dá)式,而且長度沒有限制,只是將方括號置于用于創(chuàng)建符號表達(dá)式的單引號中。

符號矩陣的每一行的兩端都有方括號,這是與MATLAB數(shù)值矩陣的一個重要區(qū)別。例8-3-1

使用sym()函數(shù)直接創(chuàng)建符號矩陣。

解語法如下:

>>sym_matrix=sym('[123;abc;sin(x)cos(y)z]')

sym_matrix=

[1,2,3]

[a,b,c]

[sin(x),cos(y),z]

3.用命令syms()定義矩陣

先定義矩陣中的每一個元素為一個符號變量,而后像普通矩陣一樣輸入符號矩陣。

例8-3-2

用syms()定義矩陣。

解程序如下:

>>symsabc;

>>M1=sym(‘Classical’);

>>M2=sym(‘Jazz’);

>>M3=sym(‘Blues’)

>>syms_matrix=[abc;M1,M2,M3;int2str([235])]

syms_matrix=

[abc]

[ClassicalJazzBlues]

[235]

4.把數(shù)值矩陣轉(zhuǎn)化成相應(yīng)的符號矩陣

數(shù)值型和符號型在MATLAB中是不相同的,它們之間不能直接進(jìn)行轉(zhuǎn)化。MATLAB提供了一個將數(shù)值型轉(zhuǎn)化成符號型的命令,即sym()。

解程序如下:

>>M=[30111;6159;98254;3245620]

M=

30111

6159

98254

245620

>>S=sym(M)

S=

[30,??1,??1,1]

[??6,??1,??5,9]

[??9,??8,25,4]

[32,45,62,0]注意:此時,雖然矩陣形式?jīng)]有發(fā)生改變,但是在MATLAB的工作區(qū)間內(nèi),系統(tǒng)已經(jīng)生成了一個新的矩陣,其數(shù)據(jù)類型為符號型。

無論矩陣是用分?jǐn)?shù)形式還是用浮點(diǎn)形式表示,將矩陣轉(zhuǎn)化成符號矩陣后,都將以最接近原值的有理數(shù)形式表示或者是函數(shù)形式表示。反過來,調(diào)用double()函數(shù)將符號矩陣轉(zhuǎn)化為數(shù)值矩陣。例如:

>>A=sym('[1/3,2.5;1/0.7,2/5]')

A=

[1/3,2.5]

[1.4285714285714285714285714285714,2/5]

>>double(A)

ans=

0.33332.5000

1.42860.40008.3.2符號矩陣的索引和修改

例8-3-4

符號矩陣的索引。

解程序如下:

>>a=[2/3,sqrt(2),0.222;1.4,1/0.23,log(3)]

a=

0.66671.41420.2220

1.40004.34781.0986

>>b=sym(a)

b=

[2/3,2^(1/2),111/500]

[7/5,100/23,2473854946935173/2251799813685248]

1.符號矩陣的索引

直接對符號矩陣的元素索引。

>>b(1,3)%矩陣的索引

ans=111/500

2.符號矩陣的修改

(1)直接修改??捎镁仃囋叵聵?biāo),或使用↑、←鍵找到所要修改的矩陣元素,直接修改。

>>b(2,3)=‘log(9)’%矩陣的修改

b=

[2/3,2^(1/2),111/500]

[7/5,100/23,log(9)]

(2)使用subs()?指令修改。

A1=subs(A,‘new’)

A1=subs(A,'new','old')

例8-3-5

使用subs()指令修改。

解程序如下:

>>A=[a,2*b]

[3*a,0]

>>A(2,2)=‘4*b’

>>A1=[a,2*b]

[3*a,4*b]

>>A2=subs(A1,‘c’,‘b’)

A2=[a,2*c]

[3*a,4*c]8.3.3符號矩陣的四則運(yùn)算

1.基本運(yùn)算

符號矩陣的基本運(yùn)算符與數(shù)值矩陣的運(yùn)算符是統(tǒng)一的(+-*/\)。符號矩陣的數(shù)值運(yùn)算中,與數(shù)值矩陣一樣,是對應(yīng)元素的運(yùn)算。所有矩陣運(yùn)算操作指令都比較直觀、簡單,如a=b+c;a=a*b;A=2*a^2+3*a-5等。

符號矩陣的行列式運(yùn)算、逆運(yùn)算、求秩、冪運(yùn)算、數(shù)組指數(shù)運(yùn)算、矩陣指數(shù)運(yùn)算使用:det(a)、inv(b)、rank(a)、a^2、exp(b)、expm(b)。解

(1)

>>a=sym(‘[1/x,1/(x+1);1/(x+2),1/(x+3)]’);

>>b=sym(‘[x,1;x+2,0]’);

>>b-a

ans=

[x-1/x,1-1/(x+1)]

[x+2-1/(x+2),-1/(x+3)]

>>a\b

ans=

[-6*x-2*x^3-7*x^2,3/2*x^2+x+1/2*x^3]

[6+2*x^3+10*x^2+14*x,-1/2*x^3-2*x^2-3/2*x]

(2)>>symsx

>>f=2*x^2+3*x-5;g=x^2+x-7;

>>h=f+g

h=3*x^2+4*x-12

(3)>>symsx

>>f=cos(x);g=sin(2*x);

>>f/g+f*g

ans=cos(x)/sin(x)+cos(x)*sin(x)

2.任意精度的數(shù)學(xué)運(yùn)算

在符號運(yùn)算中有三種不同的算術(shù)運(yùn)算:

(1)數(shù)值類型:MATLAB的浮點(diǎn)算術(shù)運(yùn)算。

>>1/2+1/3

ans=0.8333

(2)有理數(shù)類型:maple的精確符號運(yùn)算。

>>sym(1/2)+(1/3)

ans=5/6%精確解

(3)?vpa類型:maple的任意精度算術(shù)運(yùn)算。

digits(n):設(shè)置可變精度n位,缺省16位。

vpa(x,n):顯示可變精度n位計算。例如:

>>digits(25)

>>vpa(1/2+1/3)

ans=

0.833333333333333259318465

>>vpa(1/2+1/3,8)

ans=

0.83333333

8.4符號表達(dá)式的化簡

8.4.1合并多項(xiàng)式

collect()函數(shù)用于合并多項(xiàng)式中的同類項(xiàng),具體調(diào)用格式如下:

(1)?R=collect(S),該命令將S中的每個元素,按默認(rèn)變量x的階數(shù)進(jìn)行同類項(xiàng)系數(shù)合并,其中S可以是數(shù)組,數(shù)組的每個元素為符號表達(dá)式。

例8-4-1

合并多項(xiàng)式。

解程序如下:

>>symsxt;

>>f=(1+x)*t+x*t;

>>collect(f)

ans=2*t*x+t

(2)?R=collect(S,v),對指定的變量v進(jìn)行合并,如果不指定,則默認(rèn)為對x進(jìn)行合并,或者由findsym()函數(shù)返回的結(jié)果進(jìn)行合并。8.4.2展開多項(xiàng)式

expand()函數(shù)用于符號表達(dá)式的展開。調(diào)用格式如下:

expand(S):對符號表達(dá)式S中每個因式的乘積進(jìn)行展開計算。該命令通常用于計算多項(xiàng)式函數(shù)、三角函數(shù)、指數(shù)函數(shù)和對數(shù)函數(shù)等表達(dá)式的展開。

例8-4-2

符號表達(dá)式的展開。

解程序如下:

>>symsx

>>f=x*(x*(x-1)+3)+2;

>>y=expand(f)

y=x^3-x^2+3*x+28.4.3轉(zhuǎn)換多項(xiàng)式

與expand()函數(shù)相反,horner()函數(shù)把多項(xiàng)式轉(zhuǎn)換為Horner形式,這種形式的特點(diǎn)是乘法嵌套,有著較好的數(shù)值計算性質(zhì),嵌套格式在多項(xiàng)式求值中可以降低計算時的復(fù)雜度。該函數(shù)的調(diào)用格式如下:

R=horner(P)

其中,P為由符號表達(dá)式組成的矩陣,該命令將P中的所有元素轉(zhuǎn)化為相應(yīng)的嵌套形式。例8-4-3

轉(zhuǎn)換多項(xiàng)式。

解程序如下:

>>symsx;

>>y=x^3-x^2+3*x+2

>>horner(y)

ans=x*(x*(x-1)+3)+28.4.4簡化多項(xiàng)式

1.搜索符號表達(dá)式的最簡形式函數(shù)simple()

simple()函數(shù)可以為一個符號表達(dá)式尋找一個最簡形式。該函數(shù)功能比較強(qiáng)大,它會嘗試各種辦法來化簡符號表達(dá)式,其化簡的標(biāo)準(zhǔn)是符號表達(dá)式的長度最短。語法格式如下:

(1)?r=simple(S)。S是一個sym,simple(S)嘗試多種化簡方法,顯示符號表達(dá)式S的各種不同的代數(shù)簡化式,顯示并返回S的最短表示法。

如果S是一個矩陣,結(jié)果是整個矩陣的最簡單表示法,但是對于每個元素而言,則并不一定是最簡單的。

如果不給出輸出變量,simple(S)會顯示所有可能的表示法,并返回最短表示法。

例8-4-4

化簡多項(xiàng)式。

解程序如下:

>>symsx;

>>f=sin(x)^2+cos(x)^2;

>>simple(f)

由于不給出輸出變量,simple(f)會顯示所有可能的表示法,并返回最短表示法,即1。所有可能的表示法如下:

simplify:1

radsimp:cos(x)^2+sin(x)^2

simplify(100):1

combine(sincos):1

combine(sinhcosh):cos(x)^2+sin(x)^2

combine(ln):cos(x)^2+sin(x)^2

factor:cos(x)^2+sin(x)^2

expand:cos(x)^2+sin(x)^2

combine:cos(x)^2+sin(x)^2

rewrite(exp):((1/exp(x*i))/2+exp(x*i)/2)^2+(((1/exp(x*i))*i)/2-(exp(x*i)*i)/2)^2

rewrite(sincos):cos(x)^2+sin(x)^2

rewrite(sinhcosh):cosh(-x*i)^2-sinh(-i*x)^2

rewrite(tan):(tan(x/2)^2-1)^2/(tan(x/2)^2+1)^2+(4*tan(x/2)^2)/(tan(x/2)^2+1)^2

mwcos2sin:1

collect(x):cos(x)^2+sin(x)^2

ans=1

(2)?[r,how]=simple(S)。不顯示中間的簡化式,只返回找到的最短表示法,同時返回化簡所使用的方法。以一個字符串描述特定的簡化方法,輸出參量r是一個sym,how是一個string,用于表示算法。例如:

>>[r,how]=simple(f)

r=1

how=simplify

2.化簡函數(shù)simplify()

simplify()函數(shù)通過數(shù)學(xué)運(yùn)算實(shí)現(xiàn)符號表達(dá)式的化簡,化簡所選用的方法為Maple中的化簡方法。例如:

>>symsx;

>>f=sin(x)^2+cos(x)^2;

>>simplify(f)

ans=18.4.5因式分解與factor()函數(shù)

factor()函數(shù)實(shí)現(xiàn)因式分解功能,如果輸入的參數(shù)為正整數(shù),則返回此數(shù)的素數(shù)因數(shù)。如果無法在有理數(shù)的范圍內(nèi)作分解,那么返回的結(jié)果還是輸入值。語法格式如下:

factor(X):參量X可以是正整數(shù)、符號表達(dá)式矩陣或符號整數(shù)矩陣。若X為一正整數(shù),則factor(X)返回X的質(zhì)數(shù)分解式。若X為多項(xiàng)式或整數(shù)矩陣,則factor(X)分解矩陣的每一元素。若整數(shù)矩陣中有一元素位數(shù)超過16位,用戶必須用sym命令生成該元素。

例8-4-5

將f?=?x3-6x2?+?11x?-6進(jìn)行因式分解。

解程序如下:

>>symsx;

>>f=x^3-6*x^2+11*x-6;

>>factor(f)

ans=(x-3)*(x-1)*(x-2)8.4.7符號替換

1.subs()函數(shù)

subs()函數(shù)可以在一符號表達(dá)式或矩陣中進(jìn)行符號替換,用指定符號替換表達(dá)式中的某一特定符號,如將符號表達(dá)式中的符號變量用數(shù)值代替。

在對多變量符號表達(dá)式使用subs()函數(shù)時,如果不指定變量,則系統(tǒng)選擇默認(rèn)變量進(jìn)行計算。默認(rèn)變量的選擇規(guī)則為:選擇在字母表中離x近的變量字母作為默認(rèn)變量,如果有兩個變量并且和x之間的距離相同,則選擇字母表靠后面的變量作為默認(rèn)變量。

subs()函數(shù)的調(diào)用格式如下:

(1)?R=subs(S)。對于S中出現(xiàn)的全部符號變量,如果在調(diào)用函數(shù)或工作空間中存在相應(yīng)值,則將值代入,同時自動進(jìn)行化簡計算;若是數(shù)值表達(dá)式,則計算出結(jié)果。如果沒有相應(yīng)值,則對應(yīng)的變量保持不變。

(2)?R=subs(S,new)。用新的符號變量new替換S中的默認(rèn)變量,即有findsym()函數(shù)返回的變量。

(3)?R=subs(S,old,new)。用新值new替換表達(dá)式S中的舊值old,參量old是一符號變量或代表一變量名的字符串,new是一符號、數(shù)值變量或表達(dá)式。若old與new是具有相同大小的陣列,則用new中相應(yīng)的元素替換old中的元素;

若S與old為標(biāo)量,而new為陣列或單元陣列,則標(biāo)量S與old將擴(kuò)展為與new同型的陣列;將S中的所有old替換為new,并將S中的常數(shù)項(xiàng)擴(kuò)充為與new維數(shù)相同的常數(shù)矩陣。

若new為數(shù)值矩陣的單元陣列,則替換按元素的方向執(zhí)行。

若new是數(shù)字形式的符號,則數(shù)值代替原來的符號計算表達(dá)式的值,所得結(jié)果仍是字符串形式。

例如,求解常微分方程dy?=?-?a?*?y,其程序如下:

>>y=dsolve(‘Dy=-a*y’)

積分結(jié)果為

y=

C1/exp(a*t)

如果工作空間存在a、C1值,或輸入a、C1值:

>>a=980,C1=3;

>>subs(y)

ans=

3/exp(980*t)

用a、C1值替換表達(dá)式中的變量值。

2.subexpr()函數(shù)

subexpr()函數(shù)通過計算機(jī)自動尋找,將表達(dá)式中多次重復(fù)出現(xiàn)的因式或字符串用簡短的符號或變量替換,返回的結(jié)果中包含替換之后的表達(dá)式,以及被替換的因式。該函數(shù)的調(diào)用格式如下:

(1)?[Y,SIGMA]=subexpr(X,SIGMA)。指定用符號變量SIGMA來代替符號表達(dá)式X中(可以是矩陣)重復(fù)出現(xiàn)的字符串。替換后的結(jié)果由Y返回,被替換的字符串由SIGMA返回。例如:

>>symsxa;

f=solve(x^2+a*x-1);

r=subexpr(f);

>>r

r=

-1/2*a+1/2*(a^2+4)^(1/2)

-1/2*a-1/2*(a^2+4)^(1/2)

(2)?[Y,SIGMA]=subexpr(X,‘SIGMA’)。該命令與上面的命令不同之處在于第二個參數(shù)為字符串,該命令用來替換表達(dá)式中重復(fù)出現(xiàn)的字符串。例如:

>>h=solve(‘a(chǎn)*x^3+b*x^2+c*x+d=0’);

這樣所求解的結(jié)果將非常復(fù)雜,難以看懂,因此可以使用一個字符來替換表達(dá)式中重復(fù)出現(xiàn)的表達(dá)式,使結(jié)果簡化為

>>[y,s]=subexpr(h,'s')8.5符?號?微?積?分8.5.1符號表達(dá)式求極限極限是微積分的基礎(chǔ),微分和積分都是“無窮逼近”時的結(jié)果。在MATLAB中,limit()函數(shù)用于求表達(dá)式的極限。該函數(shù)的調(diào)用格式如下:

(1)?limit(F,x,a):當(dāng)x趨近于a時表達(dá)式F的極限;

(2)?limit(F,a):當(dāng)F中的自變量趨近于a時F的極限,自變量由findsym()函數(shù)確定。

(3)?limit(F):當(dāng)F中的自變量趨近于0時F的極限,自變量由findsym()函數(shù)確定。

(4)?limit(F,x,a,'right'):當(dāng)x從右側(cè)趨近于a時F的極限。

(5)?limit(F,x,a,'left'):當(dāng)x從左側(cè)趨近于a時F的極限。例如:

>>symshnx

L=limit(‘(log(x+h)-log(x))/h’,h,0)

求當(dāng)h趨近于0時表達(dá)式L的極限,式中單引號可省略掉,結(jié)果為

L=1/x

>>M=limit(‘(1-x/n)^n’,n,inf)

求當(dāng)n趨近于無窮大時表達(dá)式M的極限,結(jié)果為

M=exp(-x)或M=1/exp(x)8.5.2符號導(dǎo)數(shù)、微分和偏微分

MATLAB中使用diff()函數(shù)實(shí)現(xiàn)函數(shù)求導(dǎo)和求微分,可以實(shí)現(xiàn)一元函數(shù)求導(dǎo)和多元函數(shù)求偏導(dǎo)。當(dāng)輸入?yún)?shù)為符號表達(dá)式時,該函數(shù)實(shí)現(xiàn)符號微分,其調(diào)用格式如下:

(1)?diff(S):對缺省變量求微分,實(shí)現(xiàn)表達(dá)式S的求導(dǎo),自變量由函數(shù)findsym()確定。

(2)?diff(S,'v'):對指定變量v求微分,該語句還可以寫為diff(S,sym('v'))。

(3)?diff(S,n):求S的n階導(dǎo)數(shù)。

(4)?diff(S,'v',n):求S對v的n階微分(導(dǎo)數(shù)),該表達(dá)式還可以寫為diff(S,n,'v')。8.5.3多元函數(shù)的導(dǎo)數(shù)與jacobian()函數(shù)

在MATLAB中,多元函數(shù)的導(dǎo)數(shù)由jacobian()函數(shù)來實(shí)現(xiàn)。微積分中一個非常的重要概念為Jacobian矩陣,計算函數(shù)向量的微分。MATLAB中,jacobian()函數(shù)用于計算Jacobian矩陣。該函數(shù)的調(diào)用格式如下:

R=jacobian(f,v)。如果f是向量函數(shù)或函數(shù),v為自變量向量,則計算f的Jacobian矩陣;如果f是標(biāo)量,則計算f的梯度,如果v也是標(biāo)量,則其結(jié)果與diff()函數(shù)相同。8.5.4計算不定積分、定積分

與微分對應(yīng)的是積分,在MATLAB中,int()函數(shù)用于實(shí)現(xiàn)符號積分運(yùn)算。該函數(shù)的調(diào)用格式如下:

(1)?R=int(S)。求表達(dá)式S的不定積分,自變量由findsym()函數(shù)確定;

(2)?R=int(S,v)。求表達(dá)式S對自變量v的不定積分;

(3)?R=int(S,a,b)。求表達(dá)式S在(a,b)區(qū)間上的定積分,自變量由findsym()函數(shù)確定;a為積分下限、b為積分上限,上限、下限缺省時為不定積分。

(4)?R=int(S,v,a,b)。求表達(dá)式S在(a,b)區(qū)間上的定積分,自變量為v。例8-5-5

計算不定積分、定積分。解程序如下:

>>symsx

y1=(x^2+1)/(x^2-2*x+2)^2;

y2=cos(x)/(sin(x)+cos(x));

y3=exp(-x^2);

>>f1=int(y1)

>>f2=int(y2,0,pi/2)

>>f3=int(y3,0,inf)結(jié)果為

f1=(3*atan(x-1))/2+(x/2-3/2)/(x^2-2*x+2)

f2=pi/4

f3=pi^(1/2)/2 8.6符號級數(shù)與求和

8.6.1symsum()函數(shù)與級數(shù)的求和

symsum()函數(shù)用于符號級數(shù)的求和。該函數(shù)的調(diào)用格式如下:

(1)?r=symsum(s),自變量為findsym()函數(shù)所確定的符號變量,設(shè)其為k,則該表達(dá)式計算s從0到k-1的和。

(2)?r=symsum(s,v),計算表達(dá)式s從0到v-1的和。

(3)?r=symsum(s,a,b),計算自變量從a到b之間s的和,a為下限、b為上限。8.6.2泰勒級數(shù)與taylor()函數(shù)

函數(shù)f(x)在點(diǎn)x0處具有任意階導(dǎo)數(shù),則f(x)在點(diǎn)x0按冪級數(shù)展開后得到的級數(shù)叫泰勒級數(shù)(Taylor級數(shù)):(8.6.1)其中,(8.6.2)稱為f(x)在x0點(diǎn)的麥克勞林(Maclaurin)級數(shù)。

taylor()函數(shù)用于實(shí)現(xiàn)Taylor級數(shù)的計算。該函數(shù)的調(diào)用格式如下:

(1)?r=taylor(f)。計算表達(dá)式f的Taylor級數(shù),自變量由findsym函數(shù)確定,計算f在x0=0的5階Taylor級數(shù),即返回5階麥克勞林多項(xiàng)式逼近到f。

(8.6.3)

(2)?r=taylor(f,n,y),r=taylor(f,y,n)。指定自變量y和階數(shù)n。n是正整數(shù),返回n-1階麥克勞林(Maclaurin)多項(xiàng)式逼近到f。

(8.6.4)

(3)?r=taylor(f,n,y,a)。指定自變量y、結(jié)束值為n,計算f在a的級數(shù)。a可以是數(shù)值、符號或表示數(shù)值的串,默認(rèn)為0;n默認(rèn)為6。(8.6.5)結(jié)果為>>taylor(sin(x),0)ans=x-1/6*x^3+1/120*x^5結(jié)果為8.6.3傅里葉級數(shù)

MATLAB沒有專用的傅里葉級數(shù)函數(shù),但可以根據(jù)傅里葉級數(shù)的定義,編制自定義的傅里葉級數(shù)函數(shù)。下列函數(shù)用于求傅里葉級數(shù)的系數(shù)。

function[a0,an,bn]=myfouriers(f)

symsnx;

a0=int(f,-pi,pi)/pi;

an=int(f*cos(n*x),-pi,pi)/pi;

bn=int(f*sin(n*x),-pi,pi)/pi; 8.7符號矩陣的代數(shù)運(yùn)算

8.7.1符號矩陣的代數(shù)運(yùn)算

1.生成Hilbert矩陣

首先生成Hilbert矩陣。例如:

>>H=hilb(3)

H=

1.000000000000000.500000000000000.33333333333333

0.500000000000000.333333333333330.25000000000000

0.333333333333330.250000000000000.20000000000000

2.轉(zhuǎn)換

該矩陣為雙精度類型(double),下面將其轉(zhuǎn)化為符號矩陣。例如:

>>H=sym(H)

H=

[1,1/2,1/3]

[1/2,1/3,1/4]

[1/3,1/4,1/5]

3.求逆、求行列式

對該矩陣進(jìn)行求逆、求行列式等操作。例如:

>>inv(H)

ans=

[9,-36,

30]

[-36,192,-180]

[30,-180,

180]

>>det(H)

ans=1/2160

4.求解線性系統(tǒng)

利用左除符號“\”求解線性系統(tǒng)。例如:

>>b=[111]‘;

>>x=H\b

x=

3

-24

30上述運(yùn)算得到的結(jié)果均為精確解,如果對相同的運(yùn)算采用數(shù)值解,則得到的解會存在誤差,例如下面的代碼:

>>digits(16)

>>V=vpa(H)

V=

[1.0,0.5000000000000000,0.3333333333333333]

[0.5000000000000000,0.3333333333333333,0.2500000000000000]

[0.3333333333333333,0.2500000000000000,0.2000000000000000]

>>inv(V)

ans=

[9.000000000000179,-36.00000000000080,30.00000000000067]

[-36.00000000000080,192.0000000000042,-180.0000000000040]

[30.00000000000067,-180.0000000000040,180.0000000000038]

>>det(V)

ans=

0.000462962962962963

>>V\b

ans=

3.000000000000041

-24.00000000000021

30.00000000000019上面的Hilbert矩陣為非奇異矩陣,下面查看對奇異矩陣的操作。首先,改變矩陣

H的第一個元素,使其成為奇異矩陣,然后對其進(jìn)行運(yùn)算,參見以下代碼:

>>H(1,1)=8/9;

>>det(H)

ans=0

>>inv(H)

ans=FAIL8.7.2符號矩陣的特征值、奇異值分解

1.特征值分解

在MATLAB中,符號矩陣的特征值和特征向量也使用eig()函數(shù)計算。該函數(shù)的主要用法如下:

(1)?E=eig(A)。計算符號矩陣A的符號特征值,返回結(jié)果為一個向量,向量的元素為矩陣A的特征值。

(2)?[V,E]=eig(A)。計算符號矩陣A的符號特征值E和符號特征向量V,返回結(jié)果為兩個矩陣:V和E。V是模態(tài)矩陣,列是矩陣A的特征向量;E為正則矩陣,是主對角線由A的特征值組成的對角矩陣。結(jié)果滿足A*V=V*E。

(3)?d=eig(A,B)。如果AB是方陣,返回一個特征值向量d。

2.奇異值分解

奇異值分解是矩陣分析中的一個重要內(nèi)容,在理論分析和實(shí)踐計算中都有著廣泛的應(yīng)用。在MATLAB中,完全的奇異值分解只對可變精度的矩陣可行。符號矩陣進(jìn)行奇異值分解使用SVD算法,其函數(shù)為svd()。該函數(shù)的調(diào)用格式如下:

(1)?s=svd(A)。計算矩陣的奇異值。返回奇異值向量s。

(2)?s=svd(vpa(A))。采用可變精度計算矩陣的奇異值。

(3)?[U,S,V]=svd(A)。矩陣奇異值分解,返回矩陣的奇異向量矩陣和奇異值所構(gòu)成的對角矩陣。

(4)?[U,S,V]=svd(vpa(A))。采用可變精度計算對矩陣進(jìn)行奇異值分解。例如:計算下列矩陣的奇異值。

>>X=[12;34;56;78]

X=

12

34

56

78

>>[U,S,V]=svd(X)

U=

0.1525?0.8226-0.54630.0390

0.3499?0.42140.7575?0.3553

0.5474?0.02010.1240-0.8274

0.7448-0.3812-0.33520.4332

S=

14.26910

0?0.6268

00

00

V=

0.6414-0.7672

0.76720.6414 8.8符號方程與求解

8.8.1創(chuàng)建符號方程

創(chuàng)建符號方程的方法有兩種:

(1)利用符號表達(dá)式創(chuàng)建。

①先創(chuàng)建符號變量,通過符號變量的運(yùn)算生成符號函數(shù)、符號表達(dá)式。

②直接生成符號表達(dá)式,利用符號表達(dá)式生成符號方程。

例如:

>>%使用sym函數(shù)生成符號方程

>>sym('sin(x)+cos(x)=1')

sin(x)+cos(x)=1

(2)創(chuàng)建M文件。利用M文件創(chuàng)建的函數(shù),可以接受任何符號變量作為輸入,作為生成函數(shù)的自變量。

符號表達(dá)式包括符號函數(shù)和符號方程,在符號運(yùn)算過程中,變量都以字符形式保存和運(yùn)算,數(shù)字也被當(dāng)成字符來處理。

在MATLAB中,也可以創(chuàng)建抽象方程,即只有方程符號,沒有具體表達(dá)式的方程。抽象方程在積分變換中有著很多的應(yīng)用。8.8.2符號代數(shù)方程求解

代數(shù)方程包括線性方程、非線性方程和超越方程等。

1.解代數(shù)方程

在MATLAB中,solve()函數(shù)用于求解代數(shù)方程和方程組,其調(diào)用格式如下:

(1)?g?=?solve(eq)。對默認(rèn)自變量x求解,求方程符號eq的解,輸入?yún)?shù)eq可以是符號表達(dá)式或字符串,即solve(eq)對方程eq中的默認(rèn)變量x,求解方程eq=0。若輸出參量g為單一變量,則對于有多重解的非線性方程,g為一行向量。

(2)?solve(eq,var)。求解方程eq的解,對指定自變量var求解。如果輸入的表達(dá)式中不包含等號,則MATLAB默認(rèn)是求解其等于0時的解。例如g=solve(sym('x^2-1'))的結(jié)果與g=solve(sym('x^2-1=0'))相同。

對于單個方程的情況,返回結(jié)果為一個符號表達(dá)式,或是一個符號表達(dá)式組成的數(shù)組。

例8-8-1

求一元二次方程ax2?+?bx

+?c?=?0的根。

解程序如下:

>>f=sym('a*x^2+b*x+c')

%或

f='a*x^2+b*x+c'

>>solve(f)

ans=

-(b+(b^2-4*a*c)^(1/2))/(2*a)

-(b-(b^2-4*a*c)^(1/2))/(2*a)

即方程ax2?+?bx?+?c?=?0的根為

2.代數(shù)方程組的符號解法

代數(shù)方程組同樣使用solve()函數(shù)進(jìn)行求解。

對于方程組的情況,返回結(jié)果為一個結(jié)構(gòu)體,結(jié)構(gòu)體的元素為每個變量對應(yīng)的表達(dá)式,各個變量按照字母順序排列,其格式如下:

(1)?solve(eq1,eq2,...,eqn)。求由方程eq1、eq2、…、eqn等組成的系統(tǒng),自變量為默認(rèn)自變量;

(2)?solve(eq1,eq2,...,eqn,var1,var2,...,varn)。求由方程eq1、eq2、…、eqn等組成的系統(tǒng),自變量為指定的自變量:var1、var2、…、varn。

例8-8-2

求 的解。

程序如下:

>>S=solve(‘x+y=1’,‘x-11*y=5’)

返回結(jié)果為一個結(jié)構(gòu)體S:

S=

x:[1x1sym]

y:[1x1sym]

>>S.x

ans=4/3

>>S.y

ans=-1/3

即結(jié)果為 ?;蚴褂靡韵抡Z句:

>>symsx;S=solve(‘x+y=1’,‘x-11*y=5’);

>>S=[S.xS.y]

S=

[4/3,-1/3]

也可用下列方法直接求出結(jié)果:

>>[x,y]=solve('x+y=1','x-11*y=5')

x=4/3

y=-1/3

例8-8-3

用符號法求方程組的解。

解程序如下:

>>f1=sym('10*x1-x2=9');f2=sym('-x1+10*x2-2*x3=7');f3=sym('-2*x2+10*x3=6');

>>x=solve(f1,f2,f3)

x=

x1:[1x1sym]

x2:[1x1sym]

x3:[1x1sym]

>>x.x1

ans=473/475

>>x1=vpa(x.x1)

x1=0.99578947368421052631578947368421

>>x2=vpa(x.x2)

x2=0.95789473684210526315789473684211

>>x3=vpa(x.x3)

x3=0.791578947368421052631578947368428.8.3非線性代數(shù)方程組的符號解法

函數(shù)fsolve()以最小二乘法求解非線性方程,即求解非線性方程f(x)

=

0的根。

1.fsolve()函數(shù)的語法

fsolve()函數(shù)的語法如下:

(1)?x=fsolve(fun,x0):fun是待求解的函數(shù)名,以M文件的形式給出,X0為求解方程的初始向量或矩陣。

(2)?x=fsolve(fun,x0,options):使用一個結(jié)構(gòu)選項(xiàng)options指定的優(yōu)化選項(xiàng)求解非線性方程,options使用optimset()函數(shù)設(shè)定。

(3)?[x,fval]=fsolve(fun,x0):返回fun在x求解的值fval。

(4)?[x,fval,exitflag]=fsolve(...):同上,并返回描述退出條件的值exitflag。

(5)?[x,fval,exitflag,output]=fsolve(...):同上,并返回描述優(yōu)化信息的結(jié)構(gòu)output。

(6)?[x,fval,exitflag,output,jacobian]=fsolve(...):同上,并返回fun的jacobian矩陣。在此情況Jacobian的option設(shè)置為“on”:options=optimset('Jacobian','on')。

2.輸入?yún)?shù)

(1)?fun。fun可以是函數(shù)句柄,如x=fsolve(@myfun,x0),myfun是一個MATLAB函數(shù),例如:

functionF=myfun(x)

F=...%Computefunctionvaluesatx

fun也可以是匿名函數(shù),如x=fsolve(@(x)sin(x.*x),x0)。

(2)?options使用optimset()函數(shù)設(shè)定的優(yōu)化結(jié)構(gòu)。

3.輸出參數(shù)

(1)?exitflag。整數(shù)標(biāo)識符,指示該算法終止的原因,其代表的意義如表8-2所示。

(2)?output。一個結(jié)構(gòu),包含優(yōu)化信息,其字段的含義如表8-3所示。

(3)在MATLAB窗口中輸入:在經(jīng)過幾次迭代后,fsolve()找到的答案如下:

Equationsolved.

x=

0.5671

0.5671

fval=

1.0e-006*

-0.4059

-0.40598.8.4常微分方程的解析解

1.常微分方程的求解

常微分方程解析解的求解法,一般有以下三種。

1)積分求解

有些微分方程可直接通過積分求解,例如通過一階常系數(shù)常微分方程:化為兩邊積分可得通解為y?=?cet-1其中,c為任意常數(shù)。有些常微分方程可用一些技巧,如分離變量法、積分因子法、常數(shù)變異法、降階法等可化為可積分的方程而求得解析解。

2)求特解和通解

線性常微分方程的解滿足疊加原理,求解可歸結(jié)為求一個特解和相應(yīng)齊次微分方程的通解,一階變系數(shù)線性微分方程總可用這一思路求得顯式解。

3)求高階線性常系數(shù)微分方程的基本解和特解

高階線性常系數(shù)微分方程可用特征根法求得相應(yīng)齊次微分方程的基本解,再用常數(shù)變異法求特解。

一階常微分方程與高階微分方程可以互化,已給一個n階方程令則可將上式化為一階方程組反過來,在許多情況下,一階微分方程組也可化為高階方程,所以一階微分方程組與高階常微分方程的理論與方法在許多方面是相通的,一階常系數(shù)線性微分方程組也可用特征根法求解。

MATLAB中符號常微分方程使用dsolve()函數(shù)進(jìn)行求解,具體調(diào)用格式如下:

(1)?r=dsolve('eq1','eq2',…,'cond1','cond2',...,'v')。其中,eq1、eq2等表示待求解的方程,v是指定的自變量,如果不指定自變量,那么默認(rèn)的自變量為x,也可任意指定自變量為't'、'u'等。cond1、cond2等表示初始值,通常表示為y(a)=b或者Dy(a)=b。如果不指定初始值,或者初始值方程的個數(shù)少于因變量的個數(shù),則最后得到的結(jié)果中會包含常數(shù)項(xiàng),表示為C1、C2等。dsolve()函數(shù)最多可接受12個輸入?yún)?shù)。

2.微分方程組的求解

微分方程組通過dsolve()函數(shù)進(jìn)行求解,格式為:

r=dsolve(‘eq1,eq2,...’,‘cond1,cond2,..

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論