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]
Но нет НИКАКИХ гарантий, что это всегда будет работать или будет делать то, что вы хотите, а в некоторых случаях это будет делать еще более странные и странные вещи.
Возможно, это дает вам достаточно подсказок, чтобы вы могли добиться определенного прогресса.