2017-02-07 84 views
1

我有什麼似乎是一個非常簡單的符號數學問題。我有一個4個方程和4個未知數的線性系統。係數是非數值常數。我在MATLAB中編寫了這個問題。我的代碼如下。在我關閉它之前,它跑了幾個小時。對我而言,我應該在幾分鐘內得到答案。我不確定問題是什麼。使用MATLAB的符號引擎來解決4乘4線性系統

syms a b c d e f g h k l m n o p q r W X Y Z A B 
eqn1=a*W+b*X+c*Y+d*Z==A; 
eqn2=e*W+f*X+g*Y+h*Z==B; 
eqn3=k*W+l*X+m*Y+n*Z==0; 
eqn4=o*W+p*X+q*Y+r*Z==0; 

Soln=solve([eqn1,eqn2,eqn3,eqn4],[W,X,Y,Z],'ReturnConditions',true); 
SolnW=Soln.W 
SolnX=Soln.X 
SolnY=Soln.Y 
SolnZ=Soln.Z 
Conditions=Soln.conditions 
Parameters=Soln.parameters 

我有兩個問題。

(1)我接近問題的方式是否有效?例如,MATHEMATICA或MAPLE可能更適合這項工作嗎? (2)我預計克拉默斯般的解決方案的代表擴展形式的決定因素的術語。當然,這將是醜陋的。有沒有辦法讓MATLAB以代數方式簡化結果?

+0

限制可能的值。你可以將代碼格式化爲代碼並刪除所有冗餘的白線嗎? – Adriaan

回答

3

對於matlab和線性系統,您應該採取不同的方法,像這樣使用矩陣,matlab確實喜歡使用矩陣,所以這是您應該使用matlab工作的方式。那麼你的代碼是相當快的:

>> syms a b c d e f g h k l m n o p q r W X Y Z A B 
>> eqn1=a*W+b*X+c*Y+d*Z==A; 
eqn2=e*W+f*X+g*Y+h*Z==B; 
eqn3=k*W+l*X+m*Y+n*Z==0; 
eqn4=o*W+p*X+q*Y+r*Z==0; 
>> [A,B] = equationsToMatrix([eqn1, eqn2, eqn3, eqn4], [W, X, Y,Z]) 

A = 

[ a, b, c, d] 
[ e, f, g, h] 
[ k, l, m, n] 
[ o, p, q, r] 


B = 

A 
B 
0 
0 

>> linsolve(A,B) 

ans = 

-(B*b*m*r - B*b*n*q - B*c*l*r + B*c*n*p + B*d*l*q - B*d*m*p - A*f*m*r + A*f*n*q + A*g*l*r - A*g*n*p - A*h*l*q + A*h*m*p)/(a*f*m*r - a*f*n*q - a*g*l*r + a*g*n*p + a*h*l*q - a*h*m*p - b*e*m*r + b*e*n*q + b*g*k*r - b*g*n*o - b*h*k*q + b*h*m*o + c*e*l*r - c*e*n*p - c*f*k*r + c*f*n*o + c*h*k*p - c*h*l*o - d*e*l*q + d*e*m*p + d*f*k*q - d*f*m*o - d*g*k*p + d*g*l*o) 
    (B*a*m*r - B*a*n*q - B*c*k*r + B*c*n*o + B*d*k*q - B*d*m*o - A*e*m*r + A*e*n*q + A*g*k*r - A*g*n*o - A*h*k*q + A*h*m*o)/(a*f*m*r - a*f*n*q - a*g*l*r + a*g*n*p + a*h*l*q - a*h*m*p - b*e*m*r + b*e*n*q + b*g*k*r - b*g*n*o - b*h*k*q + b*h*m*o + c*e*l*r - c*e*n*p - c*f*k*r + c*f*n*o + c*h*k*p - c*h*l*o - d*e*l*q + d*e*m*p + d*f*k*q - d*f*m*o - d*g*k*p + d*g*l*o) 
-(B*a*l*r - B*a*n*p - B*b*k*r + B*b*n*o + B*d*k*p - B*d*l*o - A*e*l*r + A*e*n*p + A*f*k*r - A*f*n*o - A*h*k*p + A*h*l*o)/(a*f*m*r - a*f*n*q - a*g*l*r + a*g*n*p + a*h*l*q - a*h*m*p - b*e*m*r + b*e*n*q + b*g*k*r - b*g*n*o - b*h*k*q + b*h*m*o + c*e*l*r - c*e*n*p - c*f*k*r + c*f*n*o + c*h*k*p - c*h*l*o - d*e*l*q + d*e*m*p + d*f*k*q - d*f*m*o - d*g*k*p + d*g*l*o) 
    (B*a*l*q - B*a*m*p - B*b*k*q + B*b*m*o + B*c*k*p - B*c*l*o - A*e*l*q + A*e*m*p + A*f*k*q - A*f*m*o - A*g*k*p + A*g*l*o)/(a*f*m*r - a*f*n*q - a*g*l*r + a*g*n*p + a*h*l*q - a*h*m*p - b*e*m*r + b*e*n*q + b*g*k*r - b*g*n*o - b*h*k*q + b*h*m*o + c*e*l*r - c*e*n*p - c*f*k*r + c*f*n*o + c*h*k*p - c*h*l*o - d*e*l*q + d*e*m*p + d*f*k*q - d*f*m*o - d*g*k*p + d*g*l*o) 

我希望這可以幫助。這是一個非常普遍的答案,所以你可以用symbolic assumption

+0

謝謝。這很有幫助。如果我現在想象徵性地輸入常數{a,b,c,... r}是什麼,我怎麼才能讓MATLAB把結果變成最簡單的代數形式?上述答案非常不方便。 – user6006085

+0

嗨,如果這有幫助,請將此標記爲有效答案,爲了簡化符號表達式,您可以使用https://es.mathworks.com/help/symbolic/simplify.html,但不期望很多事情,或者因爲你的系統有很多自由變量,所以什麼都沒有。 – anquegi

+0

simpl()命令在這裏不做任何事情。是否還有其他人可以在MATLAB中使用,以實現簡化。 – user6006085