2013-12-04 1 views
3

Я задал вопрос несколько дней назад here и получил ответ, который кажется, что он сработает - он предполагает использование Linsolve для поиска решений для системы уравнений, которые все по модулю p, где p - целое число без пробелов.Использование решения и/или linsolve с символическим набором инструментов в R2010b

Однако, когда я пытаюсь выполнить команды из предоставленного ответа или страницы справки linsolve, я получаю сообщение об ошибке: linsolve не поддерживает аргументы типа «sym». Использует ли linsolve с переменными sym только в R2013b? Я также попробовал это с копией моей школы, которая является R2012b. Вот код, который я пытаюсь выполнить (из ответа на приведенной выше ссылке):

A = [0 5 4 1;1 7 0 2;8 1 0 2;10 5 1 0]; 
b = [2946321;5851213;2563617;10670279]; 
s = mod(linsolve(sym(A),sym(b)),8) 

И выход:

??? Undefined function or method linsolve' for input arguments of type 'sym'. 

Я также пытался использовать функцию solve для это, однако, даже если я построю уравнения, представленные матрицами A и b выше, у меня возникли проблемы. Вот что я пытаюсь:

syms x y z q; 
solve(5*y + 4*z + q == 2946321, x + 7*y + 2*q == 5851213, 8*x + y + 2*q == 2563617, 10*x + 5*y + z == 10670279,x,y,z,q) 

И выход:

??? Error using ==> char 
Conversion to char from logical is not possible. 

Error in ==> solve>getEqns at 169 
vc = char(v); 

Error in ==> solve at 67 
[eqns,vars] = getEqns(varargin{:}); 

Могу ли я с помощью solve неправильно? Должен ли я просто попытаться выполнить мой код в R2013b, чтобы использовать linsolve с символическими типами данных?

ответ

3

Набор инструментов для математической панели инструментов Symbolic Math сильно изменился (к лучшему) на протяжении многих лет. Вы не могли бы иметь sym/linsolve, но делает эту работу ?:

s = mod(sym(A)\sym(b),8) 

Это будет в основном делать то же самое. sym/linsolve просто выполняет некоторые дополнительные проверки ввода и вычисления ранга, чтобы отразить возможности linsolve.

Вы используете solve правильно для текущих версий, но похоже, что R2010b может не понимать оператора == (sym/eq) в этом контексте. Вы можете использовать старый формат строки, чтобы указать свои уравнения:

eqs = {'5*y + 4*z + q = 2946321',... 
     'x + 7*y + 2*q = 5851213',... 
     '8*x + y + 2*q = 2563617',... 
     '10*x + 5*y + z = 10670279'}; 
vars = {'x','y','z','q'}; 
[x,y,z,q] = solve(eqs{:},vars{:}) 
+0

Верхняя линия работает! Что означает «\»? Большое спасибо за вашу помощь! – dkhaupt

+0

@dkhaupt: \ is ['mldivide'] (http://www.mathworks.com/help/matlab/ref/mldivide.html) (или' sym/mldivide' в этом случае). Это стандартный низкоуровневый способ [решения систем линейных уравнений] (http://www.mathworks.com/help/matlab/math/systems-of-linear-equations.html) в Matlab. Это даже [на футболке] (http://blogs.mathworks.com/cleve/2013/08/19/backslash/). Инструментарий Symbolic Math перегрузил этот оператор, чтобы реализовать аналогичные процедуры для решения систем символических линейных систем. – horchler