找回密码
 注册
Simdroid-非首页
楼主: guocong89

[符号计算] 发现一个Trick,请来分析分析原理

[复制链接]
发表于 2011-1-12 21:54:02 | 显示全部楼层 来自 上海
再看一个例子升级版
SetAttributes[Plus,HoldAllComplete]
a-b+a-b+(a-b)*c+(a-b)*d/.a-b->x
这样就要替换三次才行。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-12 22:15:09 | 显示全部楼层 来自 北京
Simdroid开发平台
我最终的意见是这样的,当它第一次使用Flat属性且成功匹配后,匹配过程就宣布结束了,不再继续深层的扫描或Flat测试。
回复 不支持

使用道具 举报

发表于 2011-1-12 23:16:38 | 显示全部楼层 来自 上海
19# guocong89
7楼的例子中
In[25]:= Level[a b + Sin[a b], -1]
Level[a b Sin[a b], -1]
Level[(a + b) Sin[a + b], -1]
Level[(a + b) + Sin[a + b], -1]
Out[25]= {a, b, a b, a, b, a b, Sin[a b]}
Out[26]= {a, b, a, b, a b, Sin[a b]}
Out[27]= {a, b, a + b, a, b, a + b, Sin[a + b]}
Out[28]= {a, b, a, b, a + b, Sin[a + b]}
分别对应
x + Sin[x]
x Sin[a b]
x Sin[x]
x + Sin[a + b]
如果Level中出现的a b或a+b的个数少于眼睛看到的(目前的情况),则只替换第一个。

连加失效是因为算术运算优先级高,所以后面用了HoldAllComplete

Level[Hold[a - b + a - b + Sin[a - b]], -1]
Level[Hold[(a - b) (a - b) Sin[a - b]], -1]
Level[Hold[(a - b + c) Sin[a - b]], -1]
Level[Hold[a - b + c Sin[a - b]], -1]
{a, -1, b, -b, a, -1, b, -b, a, -1, b, -b, a - b, Sin[a - b],
2 a - 2 b + Sin[a - b]}
{a, -1, b, -b, a - b, a, -1, b, -b, a - b, a, -1, b, -b, a - b,
Sin[a - b], (a - b)^2 Sin[a - b]}
{a, -1, b, -b, c, a - b + c, a, -1, b, -b, a - b,
Sin[a - b], (a - b + c) Sin[a - b]}
{a, -1, b, -b, c, a, -1, b, -b, a - b, Sin[a - b], c Sin[a - b],
a - b + c Sin[a - b]}
也是这样。
回复 不支持

使用道具 举报

发表于 2011-1-12 23:21:24 | 显示全部楼层 来自 上海
22# guocong89
是这个意思,这可以回答19楼的这个问题

什么叫做 同时替换? 为什么可以同时找到a 却不能同时找到 a-b ?
是不能同时找到a-b
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2026-1-3 21:30 , Processed in 0.020259 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表