2017-02-07 3 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 

私には2つの質問があります。

(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

simplify()コマンドはここで何もしません。 MATLABで実際に単純化するために使用できるものがありますか? – user6006085

関連する問題