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]

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


person justik    schedule 12.08.2017    source источник


Ответы (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]

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

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

person Bill    schedule 12.08.2017