popkov
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Andrew10 Цитата: Не могу понять, в чем принципиальная разница с предыдущим более простым случаем, и как сделать так, чтобы предупреждение исчезло? | Принципиальное отличие в том, что вы используете ReplaceRepeated (//.) вместо Replace. Поскольку Unevaluated защищает выражение от выполнения лишь одноразово, то при следующей итерации ReplaceRepeated NDSolve уже не защищено от выполнения (на самом деле, вы почти именно для этого и используете здесь ReplaceRepeated - чтобы аргументы NDSolve былы "выполнены", т.е., к примеру, чтобы переменная incond была заменена на ее значение. Но при таком подходе вы также выполняете сам NDSolve на слишком ранней стадии - еще до того, как сработают все необходимые итерации ReplaceRepeated). Самое очевидное решение - отложить выполнение NDSolve до момента, когда все замены внутри его аргументов будут уже выполнены (заодно и надобность в Unevaluated и ReplaceRepeated отпадает). Рекомендуемый способ - использовать Block: Код: numres = First@ Block[{NDSolve}, NDSolve[Join[eqns, Append[incond, F[0] == 1.]], vars, {x, 0, \[Mu]}] /. param] | Можно и по-другому, используя Replace: Код: numres = First@("NDSolve"[Join[eqns, Append[incond, F[0] == 1.]], vars, {x, 0, \[Mu]}] /. param /. "NDSolve" -> NDSolve) | Или же можно задать порядок выполнения, используя скобки и Apply: Код: numres = First@(NDSolve @@ ({Join[eqns, Append[incond, F[0] == 1.]], vars, {x, 0, \[Mu]}} /. param)) | Можно, конечно, пойти и совсем очевидным путем, загромождая код заменами: Код: numres = First@NDSolve[Join[eqns, Append[incond, F[0] == 1.]] /. param, vars /. param, {x, 0, \[Mu]} /. param] |
| Всего записей: 1845 | Зарегистр. 22-03-2003 | Отправлено: 22:36 12-09-2011 | Исправлено: popkov, 22:37 12-09-2011 |
|