Использование Solve в Mathematica - PullRequest
3 голосов
/ 06 апреля 2011

Чтобы познакомиться с функциями решения Mathematica, я попытался найти решение проблемы MinuteMath :

Существует список из семи чисел.Среднее число первых четырех чисел равно 5, а среднее значение последних четырех чисел равно 8. Если среднее значение всех семи чисел равно 46/7, то какое число является общим для обоих наборов из четырех чисел?

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

X = Table[Subscript[x, i], {i, 1, 7}];
cond = {
  Mean[Part[X, 1 ;; 4]] == 5,  
  Mean[Part[X, 4 ;; 7]] == 8, 
  Mean[X] == 46/7
};
Solve[cond, Subscript[x, 4]]

не дал решения.Мой второй подход

X = Table[Subscript[x, i], {i, 1, 7}];
rules = {Mean[Part[X, 1 ;; 4]] -> 5,  
   Mean[Part[X, 4 ;; 7]] -> 8, 
   Mean[X] -> 46/7
};
Solve[
  Mean[X] == Mean[Part[X, 1 ;; 4]] 
    + Mean[Part[X, 4 ;; 7]] 
    - Subscript[x, 4] /. rules, 
  Subscript[x, 4]
]

дает неправильное решение (45/7 вместо 6).Что я не прав?

Ответы [ 2 ]

6 голосов
/ 06 апреля 2011

Первый кусок кода, который вы даете, в порядке. Единственная проблема в том, что нет решения для одного х_4. Если вы замените последнюю строку на Solve[cond], тогда Mathmatica автоматически выберет свободные переменные, и вы получите решение.


Я думаю, что простой / тривиальный пример прояснит проблему этого типа:

In[1]:= Solve[x==1&&y==2,x]
        Solve[x==1&&y==2,{x,y}]
Out[1]= {}
Out[2]= {{x->1,y->2}}

Окончательный результат также можно получить с помощью Solve[x==1&&y==2], где Mma угадывает свободные переменные. Это поведение отличается от поведения Mathematica 7. В Mathematica 8 была введена новая опция для Solve (и связанных с ней функций) под названием MaxExtraCondtions. Это позволяет Solve предоставлять решения, использующие новый ConditionalExpression, и призван сделать поведение решения более согласованным и предсказуемым. Вот как это работает в этом простом примере:

In[3]:= Solve[x==1&&y==2, x, MaxExtraConditions->1]
Out[3]= {{x -> ConditionalExpression[1, y==2]}}

См. Выше ссылку на документацию для большего количества примеров, показывающих, почему этот Option полезен. (Хотя, возможно, по умолчанию Automatic вместо 0 будет более прагматичным выбором дизайна для новой опции ...)


Наконец, вот ваше первое решение, немного переписанное:

In[1]:= X=Array[Symbol["x"<>ToString[#]]&,{7}]
Out[1]= {x1,x2,x3,x4,x5,x6,x7}

In[2]:= cond=Mean[X[[1;;4]]]==5&&Mean[X[[4;;7]]]==8&&Mean[X]==46/7;

In[3]:= Solve[cond]
         x4/.%
Out[3]= {{x1->14-x2-x3,x4->6,x5->26-x6-x7}}
Out[4]= {6}
4 голосов
/ 06 апреля 2011

Возможно, более компактный:

Reduce[Mean@Array[f, 4] == 5 && 
       Mean@Array[f, 4, 4] == 8 && 
       Mean@Array[f, 7] == 46/7]
(*
-> f[5] == 26 - f[6] - f[7] && 
   f[4] == 6 && 
   f[1] == 14 - f[2] - f[3]
*)  

Хотя для ясности, я, вероятно, предпочитаю:

Reduce[Sum[f@i, {i, 4}] == 20 && 
       Sum[f@i, {i, 4, 7}] == 32 && 
       Sum[f@i, {i, 7}] == 46]

Редактировать

Обратите внимание, что я использую функции upvalues ​​в качестве переменных, а не элементов списка. Я предпочитаю этот путь, потому что:

  • Вам не нужно инициализировать список (Table[Subscript ... в вашем example`)
  • Полученные выражения обычно меньше загроможденных (№ Part[ ;; ] и т. д.)
...