天天看點

[Matlab]中solve函數與subs函數的使用方法

[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]
>> 
           

繼續閱讀