[Matlab]中solve函數與subs函數的使用方法(解方程組與指派)
一、solve函數用法:
1. 求解單變量方程
%-----例子1------
syms x
eqn=sin(x)==1;
solve(eqn,x)
%-----例子2------
syms x
eqn=sin(x)==1;
[solx,params,conds]=solve(eqn,x,'ReturnConditions',true)
%-----例子3---------------
%如果傳回empty,則表明解不存在。如果傳回empty+warning,則解可能存在,但是solve找不到
syms x
solve(3x+2,3x+1,x)
2.求解多變量方程
%---例1-----------------
%為了避免求解方程時對符号參數産生混亂,需要指明一個等式中需要求解的變量。
%如果不指明的話,solve函數就會通過symvar選擇一個變量(認為該變量是要求解的變量)
clc,clear
syms a b c x
sola=solve(ax^2+bx+c==0,a) %待求解的變量是a
sol=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,clear
syms x
S=solve(sin(x)==0 ,x,'ReturnConditions',true);
S
S.x
S.parameters
S.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 、conditions
clc,clear
syms 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,clear
syms x
solve(sin(x)==x^2-1,x)
%驗證上面的等式确實有一個正值解:畫出等式的左右兩部分的曲線
ezplot(sin(x),-2,2)
hold on
ezplot(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<1
clc,clear
syms x y
S=solve(x^2+y^2+x*y<1,x>0,y>0 , [x,y], 'ReturnConditions',true);
solx=S.x
soly=S.y
params=S.parameters
conditions=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,clear
syms x
solve(x^5==3125,x)
%如果僅僅需要一個實數解,那麼就把選項Real設定成true
solve(x^5==3125,x,'Real',true)
9.傳回一個解(主值Principal)
%不是傳回一個無限多元素的周期解的集合,而是選擇其中的最為實際的3個解(實際的、實用性的be most practical)
syms x
solve(sin(x)+cos(2*x)==1,x)
%利用選擇PrincipalValue設定為true選擇一個解(主值)
solve(sin(x)+cos(2*x)==1,x,'PrincipalValue',true)
10. 應用簡化規則來縮短結果
%solve預設是不對解采用簡化規則的,但是這些解從數學上來講,不總是正确的。這樣以來,solve就不能symbolically求解方程了。
clc,clear
syms x
solve(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,clear
syms x positive
%那麼,在上述假設下,求得的解隻能是符合假設的解
solve(x^2+5*x-6==0,x)
%如果想要得到方程全部的解,則需要将IgnoreProperties 設定為true
solve(x^2+5*x-6==0,x,'IgnoreProperties ',true)
%為了後續計算,清除之前的假設
syms x clear
12.數值逼近符号解(that Contain RootOf)
%當求解多項式的時候,solve可能傳回包含RootOf的解。為了數值逼近這些解,可以采用vpa函數。
clc,clear
syms x
s=solve(x^4+x^3+1==0,x)
%因為解中沒有參數,是以可以采用vpa進行數值逼近
vpa(s)
13. 求解高階的多項式等式
%當求解高階的多項式方程的時候,solve可能采用 RootOf表示求得的解
clc,clear
syms x a
solve(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)+b
f =
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]
>>