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

Команда simplify() здесь ничего не делает. Есть ли что-то еще, что можно использовать в MATLAB для упрощения. – user6006085

 Смежные вопросы

  • Нет связанных вопросов^_^