Mathematica, упростить уравнение с подстановками

Существует следующая формула:

s = R*(lat - lat0)
rho = R/Tan[lat]
f = (x^2 + (rho + s - y)^2 - rho^2)*(Sin[lat])^2

и его производная

fd = D[f, lat]

где

Output[1] = 2 Cos[lat] (x^2 - R^2 Cot[lat]^2 + ((lat - lat0) R - y + R Cot[lat])^2) Sin[lat] + 
(2 R^2 Cot[lat] Csc[lat]^2 + 2 ((lat - lat0) R - y + R Cot[lat]) (R - R Csc[lat]^2)) Sin[lat]^2

Я хотел бы выразить FD с помощью замены S, RHO

FullSimplify[fd, TransformationFunctions -> {Automatic, # /. R (lat - lat0) -> s &, # /. R/Tan[lat] -> rho &}]

Однако появляется только упрощенная формула без подстановки:

Output[2] = 2 Cos[lat] ((1 + (lat - lat0)^2) R^2 + x^2 + 2 (-lat + lat0) R y +   y^2 + R (lat R - lat0 R - y) Cot[lat]) Sin[lat]

Спасибо за вашу помощь.

1 ответ

Решение

Попробуйте заменить и подтвердите, что результат не изменился

s = R*(lat - lat0);
rho = R/Tan[lat];
f = (x^2 + (rho + s - y)^2 - rho^2)*(Sin[lat])^2;
fd = D[f, lat];
FullSimplify[fd, TransformationFunctions->{Automatic,
    #/.R(lat-lat0)->s&, #/.R/Tan[lat]->rho &}];
Simplify[% == fd]

и вывод True

Обратите внимание, что вы ранее определили s=R*(lat-lat0) так что кажется, что вы заменяете R(lat-lat0) с R(lat-lat0)

Попробуйте определить s прежде чем делать замену

s =.;
FullSimplify[fd, TransformationFunctions -> {Automatic,
    #/.R(lat-lat0)->s&, #/.R/Tan[lat]->rho&}]

и результат 2 Cos[lat](R(s-y)Cos[lat]+(R^2+x^2+(s-y)^2)Sin[lat])

Теперь, почему не R/Tan[lat] замена работы в оригинале fd?

D[f, lat]==2 Cos[lat](x^2-R^2 Cot[lat]^2+((lat-lat0)R-y+R Cot[lat])^2) Sin[lat]+(2 R^2 Cot[lat]Csc[lat]^2+2((lat-lat0)R-y+R Cot[lat])(R-R Csc[lat]^2)) Sin[lat]^2

Обратите внимание, что нет R/Tan[lat] в этом. Сопоставление с образцом Mathematica очень буквально и не может понять, что R/Tan[lat]==R Cot[lat] Много лет назад был пакет, который написал один парень, который делал "математические замены" вместо "буквальных замен" Mathematica, но он устарел, и я не знаю достаточно, чтобы заставить его работать с текущими версиями.

Давай попробуем R Cot[lat] замена вместо этого и неопределенная rho, поэтому она не отменяет никакой замены.

s =.; rho =.
fd /. {R Cot[lat] -> rho}

Результат 2 Cos[lat](x^2+((lat-lat0)R+rho-y)^2-R^2 Cot[lat]^2) Sin[lat]+(2 R^2 Cot[lat]Csc[lat]^2+2 ((lat-lat0)R+rho-y)(R-R Csc[lat]^2))Sin[lat]^2

Заметить, что R^2 Cot[lat]^2 остается и снова буквальная замена не знает, что вы, вероятно, ожидаете R Cot[lat]->rho чтобы изменить это в rho^2 так что добавь это правило

s=.; rho=.
fd /. {R Cot[lat] -> rho, R^2 Cot[lat]^2 -> rho^2}

Заметить, что R^2 Cot[lat] остается, и вы, вероятно, имели в виду, что должно быть заменено R rho так что добавьте это правило.

s =.; rho =.
fd /. {R Cot[lat]->rho, R^2 Cot[lat]^2->rho^2, R^2 Cot[lat]->R rho}

Вы начинаете понимать, что подстановка шаблонов в Mathematica может стать темным и извилистым коридором, ведущим к двери с надписью "Разочарование".

Есть одна хитрость, которую вы можете использовать.

Simplify[fd, R Cot[lat] == rho]

Что попробую упростить fd и обычно пытаются заменить R Cot[lat] с ро. И, в этом конкретном примере, это будет работать даже с

Simplify[fd, R/Tan[lat] == rho]

Но нет НИКАКИХ гарантий, что это всегда будет работать или будет делать то, что вы хотите, а в некоторых случаях это будет делать еще более странные и странные вещи.

Возможно, это дает вам достаточно подсказок, чтобы вы могли добиться определенного прогресса.

Другие вопросы по тегам