Набор символов Matlab: что не так с моим кодом? - PullRequest
2 голосов
/ 23 февраля 2009

Я пытаюсь решить три нелинейных уравнения в неизвестных x, y, z с помощью символического набора инструментов Matlab. Что не так со следующим кодом?

solve( '(x/4 + y/2 + z/4)*(1/(8*x) + 1/(16*y) + 1/(8*z))  = 0.5774',  ...
       '(x/4 + y/4 + z/2)*(1/(4*x) + 1/(16*y) + 1/(16*z)) = 0.5774',  ...
       '(x/2 + y/4 + z/4)*(1/(8*x) + 1/(8*y)  + 1/(16*z)) = 0.5774' )    

Я получаю следующую ошибку:

??? Error using ==> subsref
Index exceeds matrix dimensions.

Error in ==> sym.subsref at 16
  y = builtin('subsref',struct(x),a);

Error in ==> solve at 191
      S.(char(symvars(j))) = R(:,j);

Я использую Matlab версии 7.7.0.471. Я совсем не знаком с символическим набором инструментов. Что мне не хватает?

Ожидаю ли я слишком многого от символического движка? Или есть ли лучшие способы решить вышеприведенные уравнения? (Численное решение подойдет.)

Ответы [ 4 ]

3 голосов
/ 23 февраля 2009

Ваш синтаксис правильный, но я не думаю, что у вашей системы уравнений есть решение. Когда я проталкивал их через Mathematica, он возвращал пустой список, который обычно указывает на то, что решения не существует.

Версия MATLAB, которую вы используете, использует MuPad в качестве движка символьных вычислений, но они использовали для Maple. У меня есть самая последняя версия набора символов для Maple, и когда я добавляю в него ваше выражение, я получаю

Warning: Explicit solution could not be found.
 In solve at 140

ans =

[ empty sym ]

Так что я хотел бы предположить, что не существует решения этой системы уравнений, и новый символический движок Mupad просто не очень элегантно обрабатывает этот факт.

Обновление: Попытка решить эту проблему численно в Mathematica приводит к жалобам на единичный якобиан независимо от того, какие начальные значения я выберу. Я просто не знаю, как доказать, что ваши уравнения не имеют решения, но я сильно подозреваю, что это так.

0 голосов
/ 24 марта 2009

Напишите свой код, как это

solve ('x+y+1','x+2*y-5');

Это будет хорошо.

   xx=[0:.1:5];
   yy=.2; 
   for i=1:50; 
       yy(i+1)= yy(i)+.1*yy(i)*(1-yy(i); 
   end; 
   plot(xx,yy)
0 голосов
/ 04 марта 2009

Похоже, что это ошибка. Это выглядит так же, как это:

http://www.mathworks.com/support/bugreports/details.html?rp=501052

0 голосов
/ 28 февраля 2009

Один из способов проверить, происходит ли в вашем коде то, что предложил Майк , - установить точку останова на ошибочной строке в решении и проверить размеры используемых там переменных. Скорее всего, один или несколько имеет размер 0. Что касается того, чтобы выяснить, действительно ли нет математического решения, я не могу вам помочь. Найти аспиранта по математике.

...