solve

solve

在MATLAB中,solve函式主要是用來求解代數方程(多項式方程)的符號解析解。也能解一些簡單其他方程的數值解,不過對於解其他方程的能力很弱,此時求出的解往往是不精確或不完整的。注意可能得到的只是部分的結果,並不是全部解

基本介紹

  • 外文名:solve
  • 作用:求解代數方程
  • 類別:符號解析解
  • 結果:只是部分的結果,並不是全部解
Matlab中的用法,解單個方程,解方程組,解簡單的超越方程,注意事項,MuPAD中的solve,語法,解多項式方程,解差分方程,解常微分方程,Mathematica中Solve的用法,

Matlab中的用法

solve(eq)
solve(eq, var)
solve(eq1, eq2, ..., eqn)
g = solve(eq1, eq2, ..., eqn, var1, var2, ..., varn)
其中,eq代表一個符號表達式或字元串,var代表一個變數名稱
詳細的解釋:
g=solve(eq)
函式求代數方程的符號解析解。參量eq表示符號表達式或字元串。若eq是一符號表達式或一沒有等號的字元串,則函式對方程的默認變數求解方程eq=0,默認變數由命令findsym(eq)確定。若輸出參量g為單一變數,則對於有多重解的非線性方程,g為一行向量。
g=solve(eq,var)
用法同上,var為指定變數。即對符號表達式或沒有等號的字元串eq中指定的變數var求解方程eq(var)=0。
g=solve(eq1,eq2,…,eqn)
函式求代數方程的符號解析解。參量eq1,eq2,…,eqn表示符號表達式或字元串。函式對方程組eq1,eq2,…,eqn中由命令findsym確定的n個變數如x1,x2,…,xn求解。若g為一單個變數,則g為一包含n個解的結構;若g為有n個變數的向量,則分別返回結果給相應的變數。
g=solve(eq1,eq2,…,eqn,var1,var2,…,varn)
用法同上,var1,var2,…,varn為指定變數,即對方程組eq1,eq2,…,eqn中指定的n個變數var1,var2,…,varn求解。
g= solve(eqn1,...,eqn,,var1,...,varn,Name,Value)
用法同上,Name和Value用來對解方程做一些更高級的控制。不填時,按默認值求解。若要控制多個Name對應的Value值,沒有順序要求。Name和Value的選項如下。
Name
Value
'ReturnConditions'
默認為false,當為true時額外提供兩個參數。
Example: [v1, v2, params, conditions] = solve(sin(x) +y == 0,y^2 == 3,'ReturnConditions',true)
'IgnoreAnalyticConstraints'
默認為false,當為true時會先對原方程進行一些化簡操作後再解,以得到較為精簡的結果,這也有可能使一些原本用solve解不出來的方程可以得到解。但置為true時也有可能使解不完整或產生錯誤
'IgnoreProperties'
默認為false,當為true時求解時會忽略變數定義時的一些假設,比如假設變數為正(syms x positive)
'MaxDegree'
默認為3,當複雜多項式方程的階數高於'MaxDegree'時,solve可能只給出隱式解,調整該項可以讓solve給出一些更高階代數方程的顯性解。注意該項最大為4(在數學上更高階的多項式方程往往很少有解析解)
'PrincipalValue'
默認為false,為true時只給出一個主要的解
'Real'
默認為false,為true時只給出實數解

解單個方程

如果以x為變數
syms a b c x;solve('a*x^2 + b*x + c')%結果如下ans =-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
如果以b為變數
syms a b c x;solve('a*x^2 + b*x + c','b')%結果如下ans =-(a*x^2 + c)/x

解方程組

syms x;S = solve('x + y = 1','x - 11*y = 5');S = [S.x S.y]%結果如下S =[ 4/3, -1/3]

解簡單的超越方程

對於一些簡單的超越方程,solve可以自動調用數值計算系統給出一個解,但可能不是完整的解
例子:
syms xsolve(sin(x) == x^2 - 1)
以上方程沒有解析解,故求解器自動調用數值計算系統試圖尋找數值解。但要想在整個定義域內尋根將要花費大量時間和資源,故solve只找出一個解。
結果:
ans =-0.63673265080528201088799090383828
如果對這個該函式畫圖後會發現其實這個方程是有兩個解的。
ezplot(sin(x), -2, 2)hold onezplot(x^2 - 1, -2, 2)hold off
為求出另一個根可以調用MuPAD的數值求解器,並
solve
指明求解區間,或者用fsolve等其他方法數值求解,
下面用evalin函式調用MuPAD求解另一個在0~2之間的根
evalin(symengine, 'numeric::solve(sin(x) = x^2 - 1, x = 0..2)')
結果:
ans =1.4096240040025962492355939705895
高級控制的例子
syms xsolve(x^5 == 3125, x)
這樣就得到複數域上的5個解,結果:
ans =5(5*5^(1/2))/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*5*i)/4 - 5/4(5*5^(1/2))/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*5*i)/4 - 5/4(2^(1/2)*(5 - 5^(1/2))^(1/2)*5*i)/4 - (5*5^(1/2))/4 - 5/4- (2^(1/2)*(5 - 5^(1/2))^(1/2)*5*i)/4 - (5*5^(1/2))/4 - 5/4
如果只想要實數域上的解,那么在Name和Value的地方加上:
solve(x^5 == 3125, x, 'Real', true)
結果:
ans =
5

注意事項

1 solve解非代數方程的能力較弱,最好結合其他方式求解非代數方程
2 如果解得是一個方程組,而且採用了形如[a,b]=solve(a+b==1, 2*a-b==4,a,b) 的格式,那么,在MATLAB R2014a中沒問題,可以保證輸出的a,b就等於相應的解,但是在R2012b等早先版本中不能保證輸出的順序就是你聲明變數時的順序。所以最好採用g=solve(a+b==1, 2*a-b==4,a,b)這種單輸出格式,這樣輸出的是一個結構體,g.ag.b就是對應的解。

MuPAD中的solve

MuPAD是MATLAB現在的符號計算引擎(以前為maple),也可以單獨使用,單獨使用時語法有所不同。

語法

solve(eq, x, <Options>) 單個方程,指定變數
solve(eq, x = a .. b, <Options>) 單個方程,指定區間
solve(eq, vars, <Options>) 方程組
solve(eq, <Options>)
solve(system, x, <Options>)
solve(system, vars, <Options>)
solve(system, <Options>)
solve(ODE)
solve(REC)

解多項式方程

solve(x^7 + x^2 + x, x)
solve({x + y + z = 3, x + y = 2}, {x, y, z}) 或 solve({x + y + z = 3, x + y = 2}, [x, y, z]) {[x = 2 - z1, y = z1, z = 1]} 方程組可以用前面介紹的集合,序列的方式混合 也即{ }和[ ]交叉使用
代數符號方程 S := solve(a*x^2 + b*x + c, x)

解多項式方程解多項式方程

解差分方程

R:=rec(eq, y(n), <cond>);solve(R)
參數:
eq:
方程或表達式
y:
未知函式
n:
索引號
cond:
初始值或邊界集合
由此可見,Rec主要是返回多項式的結果表達式,對於複雜問題,有直接法,for多重循環,濾波器法,Z變換法。
解差分方程解差分方程

解常微分方程

ode::solve(o, <Type = OdeType>, <Opts>)solve(o, <Type = OdeType>, <Opts>)
o: 常微分方程
Type = OdeType 方程類型Abel, Bernoulli, Chini, Clairaut, ExactFirstOrder, ExactSecondOrder, Homogeneous, Lagrange, Riccati.
Opts 與解法有關選項
例子o:= ode(y'(x) = y(x)^2, y(x));solve(o)o:= ode({y'(x) = a*y(x)^2, y(a) = ln(a)}, y(x)):solve(o)
解常微分方程解常微分方程

Mathematica中Solve的用法

調用方法:Solve[expr,vars]
例:Solve[x^2 + a x + 1 == 0, x]

相關詞條

熱門詞條

聯絡我們