[Matlab]中solve函数与subs函数的使用方法
[Matlab]中solve函數與subs函數的使用方法(解方程組與賦值)
一、solve函數用法:
1. 求解單變量方程
%-----例子1------syms xeqn=sin(x)==1;solve(eqn,x)%-----例子2------syms xeqn=sin(x)==1;[solx,params,conds]=solve(eqn,x,'ReturnConditions',true)%-----例子3---------------%如果返回empty,則表明解不存在。如果返回empty+warning,則解可能存在,但是solve找不到syms xsolve(3x+2,3x+1,x)2.求解多變量方程
%---例1-----------------%為了避免求解方程時對符號參數產生混亂,需要指明一個等式中需要求解的變量。%如果不指明的話,solve函數就會通過symvar選擇一個變量(認為該變量是要求解的變量)clc,clearsyms a b c xsola=solve(ax^2+bx+c==0,a) %待求解的變量是asol=solve(ax^2+bx+c==0) %待求解的變量是x%----例子2--------------%當求解的變量大于1個時,你聲明變量的順序就是slove返回解的順序syms a b[b,a]=solve(a+b==1,2*a-b==4,b,a)3.solve返回的解帶有:參數&條件
%為了返回一個方程的完整的解(即解中含有的參數,及對參數的限制),需要指定ReturnConditions 為:true%---例子1:關于解的約束----clc,clearsyms xS=solve(sin(x)==0 ,x,'ReturnConditions',true);SS.xS.parametersS.conditions%為了找到x的數值解,以一個值(利用函數subs)代替k。用函數isAlways檢驗該值是否滿足關于k的限制%檢驗k=4是否滿足in(k, 'integer')isAlways(subs(S.conditions,S.parameters,4))%isAlways返回的是logical 1(true),這意味著:對于k而言,4是一個合法值。%利用4代替k,得到x的一個解。利用函數vpa獲得該逼近的數值解(vpa設置數值精度:保留幾位有效數字、幾位小數)solx=subs(S.x,S.parameters,4)vpa(solx)%為0<x<2*pi尋找一個k的合法解,符合下面的前提:條件(S.conditions)、利用solve求解k的約束條件。替代解x中的k的值assume(S.conditions)solk=solve(S.x>0,S.x<2*pi,S.parameters)solx=subs(S.x,S.parameters,solk)4. 求解方程組(為變量分配解)
%當求解方程組的時候,利用多個輸出項對應求解的輸出變量。%solve返回一個符號數組(為每個相互獨立的變量)%-----例子1--------------syms a u v[sola,solu,solv]=solve(au^2+v^2==0,u-v==1,a^2+6==5a,a,u,v)solutions=[sola,solu,solv]%----例子2------------syms x y z[solx,soly,solz]=solve(35(y-x)==0,-7x-xz+28y==0,xy-3z==0,x,y,z)solutions=[solx,soly,solz]5. 返回方程組完整的解(包括:參數和約束條件)
%需要指定ReturnConditions 為:true%輸出則要多附加兩項:parameters 、conditionsclc,clearsyms x y[solx,soly,params,conditions]=solve(sin(x)==cos(2*y) , x^2==y , [x,y],'ReturnConditions',true)solutions=[solx,soly]6. 返回數值解
%解析解(analytical solution):用嚴格的公式表示的解。%數值解(numerical solution):無法用嚴格的公式表示,是采用某種計算方法(有限元、逼近、插值)得到的。%symbolic solver無法找到精確的用符號表示的解,因此在調用numeric solver之前會事先聲明(warning)。因為等式不是多項式,所以想要找到全部可能的解需要很長時間。%numeric solver不會盡力去找等式的全部numeric solution,它僅僅返回它找到的第一個解。clc,clearsyms xsolve(sin(x)==x^2-1,x)%驗證上面的等式確實有一個正值解:畫出等式的左右兩部分的曲線ezplot(sin(x),-2,2)hold onezplot(x^2-1,-2,2)hold off%也可以直接用函數vpasolve求出數值解(需要定義(尋找)解的范圍)vpasolve(sin(x)==x^2-1,x,[0 2 ])7. 求解不等式
%solve能求解滿足約束條件的不等式%需要指定ReturnConditions 為:true。這樣可以返回解中涉及到的任何參數和約束條件% x>0% y>0% x^2+y^2+xy<1clc,clearsyms x yS=solve(x^2+y^2+x*y<1,x>0,y>0 , [x,y], 'ReturnConditions',true);solx=S.xsoly=S.yparams=S.parametersconditions=S.conditions%利用subs和isAlways檢驗u=7/2和v=1/2是否滿足約束條件isAlways(subs(S.conditions,S.parameters,[7/2,1/2]))%isAlways返回loogical 1(true)表示這些值滿足約束條件。將這兩個參數的值帶入(函數subs)S.x和S.y中,找到一個x和y的解solx=subs(S.x,S.parameters,[7/2,1/2])soly=subs(S.y,S.parameters,[7/2,1/2])%用函數vpa得到解的數值形式vpa(solx)vpa(soly)8.返回實數解
clc,clearsyms xsolve(x^5==3125,x)%如果僅僅需要一個實數解,那么就把選項Real設置成truesolve(x^5==3125,x,'Real',true)9.返回一個解(主值Principal)
%不是返回一個無限多元素的周期解的集合,而是選擇其中的最為實際的3個解(實際的、實用性的be most practical)syms xsolve(sin(x)+cos(2*x)==1,x)%利用選擇PrincipalValue設置為true選擇一個解(主值)solve(sin(x)+cos(2*x)==1,x,'PrincipalValue',true)10. 應用簡化規則來縮短結果
%solve默認是不對解采用簡化規則的,但是這些解從數學上來講,不總是正確的。這樣以來,solve就不能symbolically求解方程了。clc,clearsyms xsolve(exp(log(x)log(3x))==4 , x)%將IgnoreAnalyticConstraints (忽略解析約束)設置為true,這樣就會應用簡化規則,有可能讓solve找到一個結果。%簡化規則的目的就是為了找到一個解。%但是也不是任何情況下都可以應用簡化規則,因此,應用簡化規則后,應該對解的正確與否進行核實S=solve(exp(log(x)log(3x))==4 , x,'IgnoreAnalyticConstraints',true)11.忽略有關變量的假設
%sym和syms函數可以讓你對符號變量進行假設(設置assumptions)。例如,可以聲明x為正值clc,clearsyms x positive%那么,在上述假設下,求得的解只能是符合假設的解solve(x^2+5*x-6==0,x)%如果想要得到方程全部的解,則需要將IgnoreProperties 設置為truesolve(x^2+5*x-6==0,x,'IgnoreProperties ',true)%為了后續計算,清除之前的假設syms x clear12.數值逼近符號解(that Contain RootOf)
%當求解多項式的時候,solve可能返回包含RootOf的解。為了數值逼近這些解,可以采用vpa函數。clc,clearsyms x s=solve(x^4+x^3+1==0,x)%因為解中沒有參數,所以可以采用vpa進行數值逼近vpa(s)13. 求解高階的多項式等式
%當求解高階的多項式方程的時候,solve可能采用 RootOf表示求得的解clc,clearsyms x asolve(x^4+x^3+a==0,x)%為了得到方程的顯式解,嘗試調用帶有參數MaxDegree的solve函數。該選項規定了多項式最大的degree,solve以此標準返回顯式解。%默認值是3。增大該數值,就可以得到高階多項式的顯式解。s=solve(x^4+x^3+a==0,x,'MaxDegree',4)pretty(s)**二,**Matlab subs函數的用法
? matlab中subs()是符號計算函數,詳細用法可以在Matlab的Command Windows輸入:help subs。subs()函數表示將符號表達式中的某些符號變量替換為指定的新的變量,常用調用方式為:
-
R = subs(S, new) 利用new的值代替符號表達式S中的默認符號。
-
R = subs(S) 用由調用函數或Matlab工作空間中獲取的值替代了在符號表達式S中的所有當前的變量。
-
R = subs(S, old, new) 利用new的值代替符號表達式中old的值。old為符號變量或是字符串變量名。new是一個符號貨數值變量或表達式。也就是說R = subs(S,old,new)在old=new的條件下重新計算了表達式S。這種替換第一次作為Matlab表達式被嘗試,如果所有在new中的數值是雙精度的,計算是以雙精度算術運算進行的。講new值轉化為符號可以驗證符號貨變量的運算精度。
? 如果old和new是大小和類型相同的向量或是元包數組,每一個old的元素都將被相應新的元素替換。
? 如果S和old是標量,new是數組或元包數組,則擴展標量去計算一個數組結果。
?
如果new是個數值矩陣元包數組,替換講運行為/智能元素/(i.e., subs(x*y,{x,y},{A,B}) returns A.*B when A and B are numeric)。
? 如果subs(s,old,new) 沒有改變S,則將會試行subs(s,new,old)。這將為前面的版本提供向前的兼容性,消除記憶參數順序。subs(s,old,new,0)不改變參數,如果S沒有改變。
subs函數的用法:
例1:
syms a b x %注意:定義的是符號變量
f = a*sin(x)+b
(符號-符號置換)
f1 = subs(f,sin(x),‘log(y)’)
(符號-數字置換)
f2 = subs(f,a,2.89)
(替換所有變量)
f3 = subs(f,{a,b,x},{2,5,sym(‘pi/3’)})
代碼實現如下:
>> syms a b x %注意:定義的是符號變量f = a*sin(x)+bf =b + a*sin(x)>> f1 = subs(f,sin(x),'log(y)')f1 =b + a*log(y)>> f2 = subs(f,a,2.89)f2 =b + (289*sin(x))/100>> f3 = subs(f,{a,b,x},{2,5,sym('pi/3')})f3 =3^(1/2) + 5例2:
syms x y z %聲明三個符號變量
S = x2+y2
1、將變量x替換為數值1:
subs(S,x,1)
2、將變量x替換為變量z:
subs(S,x,z)
3、同時將變量x和y分別替換為1和z:
subs(S,{x,y},{1,z})
4、將單變量替換為數組:
subs(S,x,[1 2;3 4])
代碼實現如下:
>> syms x y z %聲明三個符號變量S = x^2+y^2 S =x^2 + y^2>> subs(S,x,1)ans =y^2 + 1>> subs(S,x,z)ans =y^2 + z^2>> subs(S,{x,y},{1,z})ans =z^2 + 1>> subs(S,x,[1 2;3 4])ans =[ y^2 + 1, y^2 + 4] [ y^2 + 9, y^2 + 16] >>總結
以上是生活随笔為你收集整理的[Matlab]中solve函数与subs函数的使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python画反比例函数_拟合一个反比例
- 下一篇: 自己动手写cpu光盘资源