2013-02-03 2 views
0

Я попытался заменить некоторые выражения на функцию, но некоторые условия не были изменены. Ввод:Mathematica replaceall

b + 2 * a /. (Б * м_ + а * П-):> чи [т, п]

Выход

2 A + B

но если вместо 1 я поставил 3 * б

3 * b + 2 * a /. (Б * м_ + а * П-):> чи [т, п]

Выход правильно

чи [3, 2]

Странные

Если я пишу 1. * b он работает лучше

(1. * b + 2 * a) /. (Б * m_ + а * n_):> чи [т, п]

из

чи

Что предположение должно быть сделано, чтобы избежать кладя этой точки [1, 2].? Да, самый простой способ - исключить 1 из шаблона, но в этом примере я упростил слишком многое только для решения проблемы. Мой случай, как написать сумму около пятидесяти членов вида, как этот

Sqrt [Pi] В (м * B^2 + N * A^2)^(- 3/2),

где т и п являются целыми числами и Ь, а, в константы

ответ

0

подвыражение b не соответствует по шаблону b*m_. Чтобы увидеть это, рассмотрите FullForm из b и, например, 2*b. Шаблоны Mathematica соответствуют синтаксической форме, а не семантике. Мы с вами можем знать, что b - это то же самое, что и b*1, но Mathematica этого не делает или, по крайней мере, не применяет это при сопоставлении выражений с шаблонами.

EDIT

Нет, 1*b не будет работать, Mathematica оценит, что b до того сопоставления с образцом. Правила для 1.0*b, очевидно, различны. Существует несколько способов написать шаблон для соответствия 1*b, самым простым является написать отдельное правило, такое как {b,a*n_}->chi[1,n].

+0

Да, самый простой способ - устранить 1 из шаблона, но в этом примере я упростил слишком многое только для решения проблемы. Моим случаем является написать сумму около пятидесяти членов такой формы, как Sqrt [Pi] * V * (m * b^2 + n * a^2)^(- 3/2), где m и n являются Целые числа и b, константы – Adelbert