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時只給出實數解解單個方程 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 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中的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]