尝试替代和确认的结果是不变
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])
现在为什么没有在原来的fd
更换R/Tan[lat]
工作?
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}
你开始得到的想法在数学这一模式替代可以成为一个黑暗和扭曲的走廊通向一个标门“的挫折。”
有一个技巧,你可能能够使用。
Simplify[fd, R Cot[lat] == rho]
这将尽量简化fd
通常试图与RHO更换R Cot[lat]
。而且,在这个特殊的例子,这将即使
Simplify[fd, R/Tan[lat] == rho]
工作,但没有保证,这将一直工作还是会做你想要什么,并在某些情况下,这将做更加诡异离奇的事情。
也许这给你足够的提示,你可以取得一些进展。
@ Bill:非常感谢您的解释和评论.... – justik