solve

solve函數

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

用法


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
默認為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時只給出實數解
syms a b c x;
solve('a*x^2 + b*x + c')結果:
ans =
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)如果以x為變數:
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 x
solve(sin(x) == x^2 - 1)
以上方程沒有解析解,故求解器自動調用數值計算系統試圖尋找數值解。但要想在整個定義域內尋根將要花費大量時間和資源,故solve只找出一個解。
結果:
ans =
-0.63673265080528201088799090383828
如果對這個該函數畫圖後會發現其實這個方程是有兩個解的。
ezplot(sin(x), -2, 2)
hold on
solve
solve
ezplot(x^2 - 1, -2, 2)
hold off
為求出另一個根可以調用MuPAD的數值求解器,並
指明求解區間,或者用fsolve等其他方法數值求解,
下面用evalin函數調用MuPAD求解另一個在0~2之間的根
evalin(symengine, 'numeric::solve(sin(x) = x^2 - 1, x = 0..2)')
結果:
ans =
1.4096240040025962492355939705895
syms x
solve(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.a和 g.b就是對應的解。

MuPAD


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

語法

solve(eq, x, ) 單個方程,指定變數
solve(eq, x = a .. b, ) 單個方程,指定區間
solve(eq, vars, ) 方程組
solve(eq, )
solve(system, x, )
solve(system, vars, )
solve(system, )
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), );solve(R)
參數:
eq:方程或表達式
y:未知函數
n:索引號
cond:初始值或邊界集合
解差分方程
解差分方程
由此可見,Rec主要是返回多項式的結果表達式,對於複雜問題,有直接法,for多重循環,濾波器法,Z變換法。

解常微分方程

ode::solve(o, , )solve(o, , )
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]